簡體   English   中英

如果列值不在不同列的值的組中,則SQL選擇行

[英]SQL select rows if a column value is not in a group of a different column's values

對於每個標識符 ,當收到的國家/地區不等於任何已交付的國家/地區時,如何返回數量 因為我的桌子很大,所以我需要對下面的步驟進行有效的查詢。

這些是我認為可以做到的步驟,當然你不需要遵循它們:)

  1. 為每個標識符創建一組“已交付”國家/地區。
  2. 查看每個標識符的“已收到”是否屬於這些國家/地區。 如果沒有匹配項,則返回此結果。

起始表:

identifier         delivered            received        quantity
-------------      ------------         -----------     ------------
1                  USA                  France          432
1                  France               USA             450
1                  Ireland              Russia          100
2                  Germany              Germany         1,034
3                  USA                  France          50
3                  USA                  USA             120

結果:

identifier         delivered            received        quantity
-------------      ------------         -----------     ------------
1                  Ireland              Russia          100 

起始表大約是30,000,000行,所以不幸的是,自連接是不可能的。 我正在使用類似於MySQL的東西。

我認為LEFT JOIN查詢應該適合你:

SELECT a.*
FROM starting a
     LEFT JOIN starting b
        ON a.id = b.id
           AND a.delivered = b.received
WHERE b.received IS NULL;

示例: SQLFiddle

為了優化上述查詢,添加以下復合索引應該會為您提供更好的性能:

ALTER TABLE starting  ADD KEY ix1(id, delivered, received);

您可以使用not exists子查詢:

SELECT  a.*
FROM    starting a
WHERE   NOT EXISTS
        (
        SELECT  *
        FROM    starting b
        WHERE   a.id = b.id
                AND a.delivered = b.received
        )

這不是一個自連接,但查詢優化器可以自由地執行它(並且通常會這樣做)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM