Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带字符串前缀的SQL查询_Sql_Sql Server - Fatal编程技术网

带字符串前缀的SQL查询

带字符串前缀的SQL查询,sql,sql-server,Sql,Sql Server,我有一些基本查询,可以提取满足某些条件的任何事务的TransactionID: SELECT TransactionID FROM Transaction WHERE Amount > 100 我的应用程序可以取消交易。在这种情况下,将在事务表中创建一条新记录。该记录在原始交易的TransactionID前面添加了“C”前缀,用作新记录的TransactionID。因此,当TransactionID等于123的事务被取消时,将创建TransactionID为C123的新记录。原始记录和新

我有一些基本查询,可以提取满足某些条件的任何事务的TransactionID:

SELECT TransactionID FROM Transaction WHERE Amount > 100
我的应用程序可以取消交易。在这种情况下,将在事务表中创建一条新记录。该记录在原始交易的TransactionID前面添加了“C”前缀,用作新记录的TransactionID。因此,当TransactionID等于123的事务被取消时,将创建TransactionID为C123的新记录。原始记录和新记录都保留在事务表中。原始记录根本不会被修改。事务被取消的唯一指示是我的表中存在C事务

当我为前面列出的某些事务SELECT语句查询数据库时,我想排除所有已取消的事务。因此,对于返回的每个TransactionID,我希望确保不存在C-TransactionID。如何实现这一点?

您可以使用“不存在”获取未取消的事务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
您可以使用“不存在”获取未取消的事务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
这里有一种使用notin的方法

这里有一种使用notin的方法


您还可以使用EXCEPT操作符

从水果中选择名称 除了
从热带水果中选择名称

您也可以使用EXCEPT运算符

从水果中选择名称 除了
从热带水果中选择名称

我认为您在第二次选择中缺少了一些东西,您从哪里获得水果和热带水果表名称?我只想提到EXCEPT运算符,这些名称和表名称只是不知从何而来的名称。抱歉,如果这让你感到困惑,但我想说的是,从水果表中选择所有的名称,假设有一个而不是热带水果表中的名称,因此结果将是除热带水果名称外的所有名称。我认为您在第二次选择中遗漏了一个内容,您从哪里获得水果和热带水果表名称?我只想提到EXCEPT运算符,而名称和表名称只是不知从何而来的名称。很抱歉,如果这让您感到困惑,但我想说的是,从水果表中选择所有名称,假设热带水果表中只有一个名称,而不是其他名称,那么结果将是除热带水果名称之外的所有名称。这似乎是实现取消事务的一种非常糟糕的方法。现在,通过将两个值填充到一个列中,您已经成功地违反了1NF。您应该有一个IsCancelled列或Status列,而不是在TransactionID的开头填充一个C。那么你的查询也会简单得多,因为你只需要看一个给定的列,而不是像这样的子字符串。这似乎是实现取消事务的一种非常糟糕的方法。现在,通过将两个值填充到一个列中,您已经成功地违反了1NF。您应该有一个IsCancelled列或Status列,而不是在TransactionID的开头填充一个C。那么您的查询也会简单得多,因为您只需查看给定的列,而不必查看这样的子字符串。在这样的示例中,my Amount>100子句在哪里?谢谢,P。你为一个糟糕的行动计划提供了一个有效的解决方案。正如该问题的评论者所建议的,他应该创建一个is_canceled字段并使用它,而不是这种笨拙且无性能的弦乐杂耍想法。我真的希望这个答案不会让其他人走上这条黑暗的死胡同。@ButtleButkus Sean再正确不过了,但如果这是第三部分DB&App,OP无法修改它的结构怎么办。。。然后呢?@Peter在WHERE子句中应该是和Amount>100。你可以把它加到这个答案上,它会起作用的。如果你仍然感到困惑,看看我的答案,你会发现你也可以把它放在哪里。两者都可以很好地工作,如果您能够修改应用程序的行为,我也不会轻视Sean Lange的评论。@scsimon-我无法修改应用程序的行为。我必须承认,我最终使用了两个单独的查询,而在第二个查询中只使用了第一个查询的结果。这是一个更清晰、更简单的解决方案。无论如何,谢谢你的回答!在这样的例子中,我的Amount>100条款在哪里?谢谢,P。你为一个糟糕的行动计划提供了一个有效的解决方案。正如该问题的评论者所建议的,他应该创建一个is_canceled字段并使用它,而不是这种笨拙且无性能的弦乐杂耍想法。我真的希望这个答案不会让其他人走上这条黑暗的死胡同。@ButtleButkus Sean再正确不过了,但如果这是第三部分DB&App,OP无法修改它的结构怎么办。。。然后呢?@Peter在WHERE子句中应该是和Amount>100。你可以把它加到这个答案上,它会起作用的。如果你
你仍然很困惑,看看我的答案,你会发现你可以把它放在哪里。两者都可以很好地工作,如果您能够修改应用程序的行为,我也不会轻视Sean Lange的评论。@scsimon-我无法修改应用程序的行为。我必须承认,我最终使用了两个单独的查询,而在第二个查询中只使用了第一个查询的结果。这是一个更清晰、更简单的解决方案。无论如何,谢谢你的回答!