NOT EXIST条款

时间:2017-03-30 22:42:51

标签: sql oracle

我正在尝试查找从未订购的产品。我的2个表格看起来像这样。

CREATE TABLE Orders
(OrderNum    NUMBER(10)      NOT NULL,
 OrderDate   DATE            NOT NULL,
 Cust        NUMBER(10),
 Rep         NUMBER(10),
 Mfr         CHAR(3)         NOT NULL,
 Product     CHAR(5)         NOT NULL,
 Qty         NUMBER(5)       NOT NULL,
 Amount      NUMBER(9,2)     NOT NULL,
 CONSTRAINT OrdersPK 
      PRIMARY KEY (OrderNum));

CREATE TABLE Products
(Mfr         CHAR(3)         NOT NULL,
 Product     CHAR(5)         NOT NULL,
 Description VARCHAR2(20)    NOT NULL,
 Price       NUMBER(9,2)     NOT NULL,
 QtyOnHand   NUMBER(5),
 CONSTRAINT ProductsPK 
      PRIMARY KEY (Mfr, Product));

我目前的代码看起来像这样。

SELECT Mfr, Product
FROM Products
WHERE NOT EXISTS (SELECT Products.Mfr 
                  FROM Orders, Products
                  WHERE Orders.Mfr = Products.Mfr);

虽然我没有收到任何错误,但也没有显示任何结果。

**编辑:共有26种产品,其中19种已经订购。我期待得到7个结果,但我得到0。

3 个答案:

答案 0 :(得分:2)

试试这个

SELECT Mfr, Product
FROM Products
WHERE NOT EXISTS (SELECT Orders.Mfr
                  FROM Orders
                  WHERE Orders.Mfr = Products.Mfr AND Orders.Product = Products.Product);

答案 1 :(得分:2)

您可以使用NOT EXISTS,但需要比较两个键:

SELECT p.Mfr, p.Product
FROM Products p
WHERE NOT EXISTS (SELECT 1
                  FROM Orders o
                  WHERE o.Mfr = p.Mfr AND
                        o.Product = p.Product
                 );

这种情况下,拥有一个可用于外键关系的自动生成主键很有意义。

答案 2 :(得分:1)

另一种方法是使用设置操作运算符EXCEPT - 根据需要使用Products&#34}中不存在的Orders集合。 :

SELECT
    Mfr,
    Product
FROM
    Products

EXCEPT

SELECT
    DISTINCT
    Mfr,
    Product
FROM
    Orders

然后,您可以将其用作子查询以获取完整的产品信息。

SELECT
    *
FROM
    Products
    INNER JOIN (

        SELECT
            Mfr,
            Product
        FROM
            Products

        EXCEPT

        SELECT
            DISTINCT
            Mfr,
            Product
        FROM
            Orders
   ) AS ProductsWithNoOrders ON
        Products.Mfr = ProductsWithNoOrders.Mfr AND
        Products.Product = ProductsWithNoOrders.Product