关系减法错误结果

noo*_*dba 2 mysql

我有两个疑问:

查询 1:

SELECT DISTINCT maker FROM Product WHERE type='laptop'
Run Code Online (Sandbox Code Playgroud)

给出结果 {A, B, E, F, G}

查询 2:

SELECT DISTINCT maker FROM Product WHERE type='pc'
Run Code Online (Sandbox Code Playgroud)

给出结果 {A, B, C, D, E}

问题是:我怎样才能得到query1 - query2 = {A, B, E, F, G} - {A, B, C, D, E} = {F, G}

我试过:

SELECT DISTINCT maker FROM Product WHERE type='pc' AND NOT EXISTS (
    SELECT DISTINCT maker FROM Product WHERE type='b'
);
Run Code Online (Sandbox Code Playgroud)

但它给了我空的记录。对不起,我是 MySQL 的新手

dno*_*eth 5

您可以NOT IN改用:

SELECT DISTINCT maker 
FROM Product 
WHERE type='pc' 
  AND maker  NOT IN
 (
    SELECT maker 
    FROM Product
    WHERE type='b'
      AND maker IS NOT NULL -- to prevent empty results
 );
Run Code Online (Sandbox Code Playgroud)

注意:这对NULL制造商来说是不正确的。

推荐的解决方案是NOT EXISTS,但您需要一个相关的子查询:

SELECT DISTINCT maker 
FROM Product AS p1
WHERE type='pc'
  AND NOT EXISTS
 (
    SELECT maker
    FROM Product AS p2
    WHERE type='b'
      AND p1.maker = p2.maker -- correlation to the outer SELECT
 );
Run Code Online (Sandbox Code Playgroud)

如果 MySQL 支持,EXCEPT这将是一个简单的

SELECT maker FROM Product WHERE type='pc'
EXCEPT
SELECT maker FROM Product WHERE type='b';
Run Code Online (Sandbox Code Playgroud)