簡體   English   中英

MYSQL:哪里沒有語法錯誤

[英]MYSQL:Where not exists syntax error

我想知道如何在mysql中使用WHERE NOT EXISTS進行以下查詢。它給出了mysql語法錯誤。我嘗試了所有可能的方法,但沒有任何幫助。

SELECT * 
  FROM (
        (
         SELECT l.pid 
           FROM lineitem l 
          WHERE l.oid IN (
                          SELECT o1.oid 
                            FROM customer c 
                                    JOIN ( 
                                          SELECT o.oid,
                                                 o.cid 
                                            FROM orders o
                                         ) o1 
                                         ON c.cid=o1.cid 
                                        AND c.city='Newark'
                          ) 
       GROUP BY l.pid
        ) 
       WHERE not exists (
                        SELECT l.pid 
                          FROM lineitem l 
                         WHERE l.oid IN (
                                         SELECT o1.oid 
                                           FROM customer c 
                                                    JOIN (
                                                          SELECT o.oid,
                                                                 o.cid 
                                                            FROM orders o
                                                          )o1 
                                                          ON c.cid=o1.cid
                                                          AND c.city<>'Newark'
                                         )
                        )
       )

我的表是:客戶(cid,名稱,城市,州)訂單(oid,cid,date)產品(pid,price,productname)lineitem(蓋子,數字,oid,pid,totalprice)

我想選擇僅由紐瓦克人購買的所有產品。我的邏輯是(選擇紐瓦克客戶購買的產品) - (選擇所有其他客戶購買的產品)。我使用WHERE NOT EXISTS因為差異關鍵字不可用MySQL的。

這是一個更好的解決方案:

SELECT ProductID FROM (
       SELECT p.pid ProductID
         FROM lineitem l
              JOIN product p
                   ON l.pid = p.pid
              JOIN orders o
                   ON l.oid = o.oid
        WHERE o.cid IN (
              SELECT c.cid 
                FROM customer c 
               WHERE c.city = 'Newark'
              )
        ) t1 
WHERE ProductID NOT IN (
      SELECT p.pid 
        FROM lineitem l
             JOIN product p
                  ON l.pid = p.pid
         JOIN orders o
              ON l.oid = o.oid
       WHERE o.cid IN (
             SELECT c.cid 
               FROM customer c 
              WHERE c.city <> 'Newark'
             )
      );

我也相信,由於嵌套查詢較少,因此在性能方面會更好。

您的查詢中的問題是括號。 你說

SELECT * 
  FROM ( 
         ( ... ) 
        WHERE NO EXISTS 
         ( ... ) 
       );

你應該說

SELECT * 
  FROM ( ... ) 
WHERE NO EXISTS ( ... );

由於它的工作原理,這里有一個進一步的簡化(刪除派生表t1和第二部分子查詢中的JOIN product p ):

SELECT p.pid ProductID
  FROM lineitem l
       JOIN product p
            ON l.pid = p.pid
       JOIN orders o
            ON l.oid = o.oid
 WHERE o.cid IN (
       SELECT c.cid 
         FROM customer c 
        WHERE c.city = 'Newark'
       )
  AND p.pid NOT IN (
      SELECT l.pid 
        FROM lineitem l
         JOIN orders o
              ON l.oid = o.oid
       WHERE o.cid IN (
             SELECT c.cid 
               FROM customer c 
              WHERE c.city <> 'Newark'
             )
      );
Select l.pid from lineitem l
inner join Orders o on l.oid = o.oid
inner join Customers c on o.cid = c.cid  and c.city = 'Newark'
where not in 
(
Select ol.pid from lineitem ol
inner join Orders oo on ol.oid = oo.oid
inner join Customers oc on oo.cid = oc.cid  and oc.city <> 'Newark'
)

我認為......如果不存在則需要相關的子查詢。

暫無
暫無

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

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