2016-08-26 5 views
0

Пожалуйста, помогите мне с этим запросомНужна помощь в вложенном SQL запросов

SELECT * 
FROM documents 
WHERE doc_id <> (SELECT doc_id 
       FROM doc_submitted 
       WHERE student_IDNUM = 131009685) 

То, что я хочу, чтобы получить все документы, которые не в doc_submitted.

+0

Я предпочту решение «НЕ СУЩЕСТВУЕТ» от Gordan, это быстрее, чем другие методы по крайней мере в SQL SERVER. Также он обрабатывает значения «NULL» в подзапросе. 'NOT IN' терпит неудачу, когда' sub-query' возвращает значения 'NULL' –

+0

. Вот хорошая статья, сравнивающая производительность всех возможных методов. [Должен ли я использовать NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT или NOT EXISTS?] (Http://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join) –

ответ

2

Я обычно рекомендую NOT EXISTS над NOT IN, потому что NOT IN возвращает ноль строк, если даже одна строка подзапроса имеет NULL значение:

SELECT d.* 
FROM documents d 
WHERE NOT EXISTS (SELECT 1 
        FROM doc_submitted ds 
        WHERE ds.doc_id = d.docid AND ds.student_IDNUM = 131009685 
       ) 
+0

Исправлена ​​ошибка, о которой вы не возражаете –

+0

im using xampp, и этот запрос содержит 3 ошибки. почему это? в то время как это работает "SELECT * FROM документов WHERE doc_id NOT IN ( SELECT, DOC_ID FROM doc_submitted WHERE student_IDNUM = 131009685 )" – n4mi

+0

@ n4mi - проверить последний запрос –

0

Попробуйте НЕ:

НЕ будет Omit записи из основного запроса, которые доступных в подзапросе.

SELECT * FROM documents WHERE doc_id NOT IN 
(
    SELECT doc_id FROM doc_submitted WHERE student_IDNUM = 131009685 
) 
+0

Спасибо для быстрого ответа. Оно работает! тьфу! "не в!" lol – n4mi

+0

Добро пожаловать, я согласен с @Gordon –

1

Вы можете использовать левое соединение также для исключения нежелательных записей.

SELECT a.* 
FROM documents a 
    LEFT JOIN doc_submitted b ON a.doc_id=b.doc_id AND b.student_IDNUM = 131009685 
WHERE b. doc_id IS null 
0

Он известен как анти-объединение и, как и многие реляционные операторы, в SQL нет прямого эквивалента. Вместо этого мы должны выбирать из множества обходных решений, например. вот один из них:

SELECT doc_id 
    FROM documents 
EXCEPT 
SELECT doc_id 
    FROM doc_submitted 
WHERE student_IDNUM = 131009685 
Смежные вопросы