我有一些基本查询可以提取符合特定条件的任何交易的TransactionID:
SELECT TransactionID FROM Transaction WHERE Amount > 100
我的应用程序可以取消交易。在这种情况下,在Transaction表中创建一条新记录。这样的记录有' C'在原始事务的TransactionID前添加的前缀,用作新记录的TransactionID。因此,当TransactionID等于" 123"取消,使用TransactionID" C123"将被创造。原始记录和新记录都保留在事务表中。原始记录根本没有被修改。交易被取消的唯一迹象是" C-transaction"在我的桌子里。
当我查询某些事务的数据库(前面列出的SELECT语句)时,我想要排除已取消的所有事务。因此,对于返回的每个TransactionID,我想确保不存在C-TransactionID。我怎么能做到这一点?
答案 0 :(得分:2)
您可以使用not exists
来获取未被取消的交易ID。
SELECT Transaction_ID
FROM Transactions t
WHERE NOT EXISTS (select 1 from Transactions
where transaction_id like 'C%' and
t.transaction_id = substring(transaction_id,2,len(transaction_id))
)
and transaction_id not like 'C%'
使用条件聚合
的另一种方法SELECT case when transaction_id like 'C%' then substring(transaction_id,2,len(transaction_id))
else transaction_id end as transaction_id
FROM Transactions
group by case when transaction_id like 'C%' then substring(transaction_id,2,len(transaction_id)) else transaction_id end
having count(*) =1
答案 1 :(得分:1)
以下是使用NOT IN
SELECT TransactionID
FROM Transaction
WHERE TransactionID not in (select right(TransactionID,len(TransactionID) - 1) from Transaction where TransactionID like 'c%'
AND Amount > 100
答案 2 :(得分:1)
您也可以使用EXCEPT运算符
SELECT Name FROM Fruits
EXCEPT
SELECT Name FROM TropicalFruits