2016-09-26 43 views
1

由於某種原因,當我嘗試運行此SQL時出現語法錯誤。使用EXISTS的SQL語法錯誤

SELECT C.CUSTNUM 
FROM CUSTOMERS AS C 
WHERE C.CUSTNUM EXISTS (
    SELECT P.CNUM 
    FROM PURCHASES AS P 
    WHERE P.PNUM EXISTS (
     SELECT * 
     FROM PRODUCTS AS PR 
     WHERE PR.MSRP = 9.99)) 

我確定關閉了括號,但在查詢表達式中仍然出現語法錯誤。在我的代碼中可能有一些簡單的東西。有任何想法嗎?謝謝一堆。

+0

哪個RDBMS是這個呢?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

回答

0

試試這個

SELECT C.CUSTNUM 
FROM CUSTOMERS AS C 
WHERE EXISTS (
    SELECT P.CNUM 
    FROM PURCHASES AS P 
    WHERE EXISTS (
     SELECT * 
     FROM PRODUCTS AS PR 
     WHERE PR.MSRP = 9.99)) 
0

當您使用EXISTS指定的子查詢本身內的約束。如果子查詢爲給定條件C.CUSTNUM = P.CNUM返回至少一行,則認爲條件滿足。

我想這可以重寫一個JOINPRODUCTS表。

SELECT C.CUSTNUM 
FROM CUSTOMERS AS C 
WHERE EXISTS (
    SELECT 1 
    FROM PURCHASES AS P 
    JOIN PRODUCTS AS PR ON 
     ON P.PNUM = PR.PNUM -- not sure what column to join on in PRODUCTS 
    WHERE 
     C.CUSTNUM = P.CNUM -- added the correlation, I believe this is what you mean 
     PR.MSRP = 9.99 
    ) 

如果不是這種情況,只要堅持到您的修改後的查詢:

SELECT C.CUSTNUM 
FROM CUSTOMERS AS C 
WHERE EXISTS (
    SELECT 1 
    FROM PURCHASES AS P 
    WHERE 
     EXISTS (
     SELECT 1 
     FROM PRODUCTS AS PR 
     WHERE PR.MSRP = 9.99 
     ) 
     AND C.CUSTNUM = P.CNUM 

但要注意的是,外部子查詢將從PURCHASES返回所有行,如果有至少一個排PRODUCTS表無論任何列的匹配如何(您沒有指定它們之間的任何相關條件)都有MSRP = 9.99

0

使用的例子存在:

create table tab1(id1 number); 
create table tab2(id2 number); 
insert into tab1 values (1); 
insert into tab1 values (2); 
insert into tab2 values (2); 
select * 
from tab1 
where exists (select 1 
       from tab2 
       where tab2.id2 = tab1.id1 
      ) 

結果:2

注意,子查詢相關,基於一些領域,這似乎是你需要做什麼外一個。

0

我想你想使用,而不是EXISTS

SELECT C.CUSTNUM 
FROM CUSTOMERS AS C 
WHERE C.CUSTNUM IN (
    SELECT P.CNUM 
    FROM PURCHASES AS P 
    WHERE P.PNUM IN (
     SELECT PR.PNUM /* I'm unsure of the proper column here*/ 
     FROM PRODUCTS AS PR 
     WHERE PR.MSRP = 9.99))