-1

我必须编写一个LEFT JOIN查询来查找确实存在于一个表中并存在于另一个表中的记录(左连接的标准用途)。此表中只有一张表用于连接。

表名:products

加入条件栏:prdname

两个where子句条件:subdivision='abc', subdivision='xyz'

客观的

使用这两个 where 子句,我将得到两个包含两组 prdname 的结果,我必须找到在一个中存在但在另一个中不存在的 prdname。


当我编写标准时LEFT JOIN(下面的案例 2),它没有给出任何不正确的结果,所以我编写了一个子查询来检查结果。这是 8 条记录,所以我决定在这里将查询修改为 case1,并且它起作用了。

我的疑问是它们两者几乎相同,那么为什么第二个不正确?

谁能帮我?

此外,abc并且xyz是随机值,所以非常关心它们。

它工作的案例:

SELECT a.prdname
FROM   products a
       LEFT OUTER JOIN (SELECT prdname
                        FROM   products
                        WHERE  subdivision = 'xyz') b
                    ON a.prdname = b.prdname
WHERE  a.subdivision = 'abc'
       AND b.prdname IS NULL 

不工作的情况

SELECT DISTINCT( a.prdname )
FROM   products a
       LEFT OUTER JOIN products b
                    ON a.prdname = b.prdname
WHERE  a.subdivision = 'abc'
       AND b.subdivision = 'xyz'
       AND b.prdname IS NULL 

要测试的子查询查询

SELECT DISTINCT( prdname )
FROM   products
WHERE  subdivision = 'abc'
       AND prdname NOT IN (SELECT DISTINCT prdname
                           FROM   products
                           WHERE  subdivision = 'xyz') 
4

1 回答 1

3

通过在“外部”表的列上添加WHERE条件,您实际上是将外部联接转变为内部联接,因为那些不满足联接条件的行将NULL在这些列中具有值。并且比较NULL从结果中删除这些行。

您需要将该条件移动到 JOIN 子句中:

SELECT a.prdname
FROM   products a
  LEFT JOIN products b
         ON a.prdname = b.prdname
        AND b.subdivision = 'xyz'
WHERE  a.subdivision = 'abc'
   AND b.prdname IS NULL;

为了让事情更清楚一点,这里有一个简化的例子。

假设下表:

编号 | 名字 | 姓  
---+-----------+------------
1 | 亚瑟 | 凹痕      
4 | 玛丽 | 影星
2 | 赞福德 | 比伯布罗克斯
3 | 翠西娅 | 麦克米利安

车辆

编号 | 人名 | 车辆名称
---+-----------+-------------
1 | 1 | 亚瑟的车
2 | 2 | 赞福德的车

现在获取所有人及其车辆:

select p.id,
       p.firstname, 
       v.vehicle_name
from person p 
   left outer join vehicle v on p.id = v.person_id;

这将返回以下内容:

编号 | 名字 | 车辆名称
---+-----------+-------------
1 | 亚瑟 | 亚瑟的车
2 | 赞福德 | 赞福德的车
3 | 翠西娅 | (空值)      
4 | 玛丽 | (空值)      

现在想想当你添加时会发生什么

and v.vehicle_name = 'Arthur''s car' 

到查询。vehicle_car 为 null 的两行将不满足该条件,因此从结果中删除。


现在到你真正的问题:

要查找细分 'xyz' 中不存在的细分 'abc' 的产品,您可以使用 except 运算符:

select prdname
from products
where subdivision = 'abc'
except
select prdname
from products
where subdivision = 'xyz';

(对于 Oracle,您必须替换exceptminus

于 2012-11-26T18:14:56.757 回答