自加入?还是我错了?

Pac*_*aco 4 join except

我们有一张用于存储客户和物品的表。我们需要能够找到购买了一件商品而没有购买另一件商品的客户:

customer     item  
Sally        1   
Sally        2  
Sally        3
John         1  
John         2  
Paul         2
Paul         3
Run Code Online (Sandbox Code Playgroud)

我们想找到购买“1”而不是“3”的用户。在这种情况下,我们只想要“约翰”。

Twi*_*les 10

不,自连接不会真正有帮助,但如果您的数据库系统有一个 EXCEPT 运算符(或类似的东西,在 Oracle 中它被称为 MINUS)它会。

以下是获得结果的方法:

SELECT customer FROM Sales
WHERE item = 1
AND customer NOT IN (SELECT customer FROM Sales WHERE item = 3)
Run Code Online (Sandbox Code Playgroud)

如果您有 EXCEPT 运算符:

SELECT customer FROM Sales WHERE item = 1
EXCEPT
SELECT customer FROM Sales WHERE item = 3
Run Code Online (Sandbox Code Playgroud)

  • *“不,自连接不会真正有帮助”* 这不完全正确。您的第一个“NOT IN”解决方案实际上是一种反半(自)联接。它很可能用 self LEFT join 编写(和 `WHERE .. NOT NULL` 检查)。 (3认同)