2016-09-26 1 views
1

По какой-то причине я получаю синтаксическую ошибку при попытке запустить этот SQL.Ошибка синтаксиса SQL с использованием EXISTS

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

Какой РСУБД это? Добавьте тег, чтобы указать, используете ли вы '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, условие считается выполненным.

Я думаю, это можно переписать с помощью таблицы JOIN на PRODUCTS.

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

Пример использования EXISTS:

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

Я думаю, что вы хотите использовать IN вместо 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))