2016-09-26 69 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))