带有字符串前缀

时间:2016-10-17 21:04:09

标签: sql sql-server

我有一些基本查询可以提取符合特定条件的任何交易的TransactionID:

SELECT TransactionID FROM Transaction WHERE Amount > 100

我的应用程序可以取消交易。在这种情况下,在Transaction表中创建一条新记录。这样的记录有' C'在原始事务的TransactionID前添加的前缀,用作新记录的TransactionID。因此,当TransactionID等于" 123"取消,使用TransactionID" C123"将被创造。原始记录和新记录都保留在事务表中。原始记录根本没有被修改。交易被取消的唯一迹象是" C-transaction"在我的桌子里。

当我查询某些事务的数据库(前面列出的SELECT语句)时,我想要排除已取消的所有事务。因此,对于返回的每个TransactionID,我想确保不存在C-TransactionID。我怎么能做到这一点?

3 个答案:

答案 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