我有包含 transaction_id、transaction_category 和 transaction_quantity 列的交易表。请查看下面的示例数据
在给定的表中,请注意 transaction_id 112 具有“sale”和具有相同 transaction_id 和“internal”类别的相应行。与 transaction_id 114 相同。但是 transaction_id 113 的第三行没有另一行“内部”类别,并且 transaction_id 115 也没有对应的“内部”类别行(它有外部)。
我需要获取 transaction_category 为“sale”但没有相应的 transaction_category 为“internal”的所有交易的列表。因此,在上述情况下,它应该返回 transaction_id 为 113 和 115 的行。我试图用减号运算符来执行此操作,但尝试执行此操作时遇到了困难。
编辑:该表大约有 5000 行,并且没有任何列被索引。此外,还有其他类别。我会更新我的表格。
最佳答案
MySQL 8.0.31 的解决方案,现在支持 EXCEPT
。
select distinct transaction_id from transaction where transaction_category = 'sale'
except
select transaction_id from transaction where transaction_category = 'internal';
MINUS
是 Oracle 发明的同义词,并支持与其他一些 SQL 实现(但不包括 MySQL)的兼容性。
我将 distinct
放入该查询中,因为从您的描述中不清楚对于给定的 transaction_id,每个类别是否只能有一行。
另请参阅:
关于mysql - 如何使用减号运算符编写sql查询以返回缺少相应值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74691492/