【问题标题】:How to find rows for which another related row does not exist如何查找另一个相关行不存在的行
【发布时间】:2021-12-18 16:04:51
【问题描述】:

我有一个包含发票编号和交易代码的表格。单张发票可以包含交易代码 10 和 11:

+------------------+-----------------+
| Transaction Code |  Invoice Number |
+------------------+-----------------+
|     10           |   CAN000700798  |
|     20           |   CAN000700798  |
+------------------+-----------------+ 

发票可能只包含交易代码为 10 的记录:

+------------------+-----------------+
| Transaction Code |  Invoice Number |
+------------------+-----------------+
|     10           |   CAN000700798  |
+------------------+-----------------+ 

显示两种情况的发票表示例:

+------------------+-----------------+
| Transaction Code |  Invoice Number |
+------------------+-----------------+
|     10           |   CAN000700798  |
+------------------+-----------------+ 
|     10           |   CAN000900999  |
|     20           |   CAN000900999  |
+------------------+-----------------+ 
|     10           |   CAN000700777  |
|     20           |   CAN000700777  |
+------------------+-----------------+ 

这是我对发票表的查询所期望的;因为发票 CAN000700798 只包含交易代码 10 而不是 10 和 20。

+------------------+-----------------+
| Transaction Code |  Invoice Number |
+------------------+-----------------+
|     10           |   CAN000700798  |
+------------------+-----------------+ 

我需要编写一个查询来查看发票并检查它是否包含交易代码 10 和 11 的记录。如果发票仅包含交易代码 10,则返回记录。

【问题讨论】:

    标签: sql exists


    【解决方案1】:

    如果以下查询适合您,请尝试一下:

    SELECT T.TransactionCode, T.InvoiceNumber
    FROM InvoiceTable AS T
    WHERE T.TransactionCode = 10 AND NOT EXISTS (
        SELECT 1
        FROM InvoiceTable AS X
        WHERE X.InvoiceNumber = T.InvoiceNumber AND X.TransactionCode <> 10
    )
    

    【讨论】:

    • 感谢您的回复,但这并没有产生我想要的结果。我用我的表格输入尝试了这个,当我运行它并返回发票时 - 我检查了数据库,发票包含交易代码 10 和 20。
    • 修正了小错字。是的,它在子查询中变得混乱。
    • @SalmanA - 是的,这个修改后的查询也有效。感谢您查看并做出调整。我可以看到您必须在哪里进行更改才能使其正常工作。
    【解决方案2】:

    您可以使用GROUP BYHAVING 子句:

    SELECT InvoiceNumber, MIN(TransactionCode) AS TransactionCode
    FROM t
    GROUP BY InvoiceNumber
    HAVING MIN(TransactionCode) = 10
    AND    MAX(TransactionCode) = 10
    

    【讨论】:

    • 这提供了我期望的结果。谢谢你。看看我之前尝试过的,我错过了 HAVING 子句,所以没有返回结果,但你的已经奏效了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2013-11-26
    • 2022-06-27
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多