Не работает запрос IN, SQL Server 2008

enter image description here

Первая часть запроса передnot in работает и дает мне список из 100 записей. Второй запрос выполняется и дает мне список из 75 записей. Запрос, который я пытаюсь написать, используяnot in чтобы получить записи, которые находятся в одном наборе результатов, но не другой. Я получаю ошибкуincorrect syntax near the word not.

SELECT distinct  Patient.patientid
FROM Patient INNER JOIN
 patientICD ON Patient.patientid = patientICD.patientid AND Patient.admissiondate = patientICD.admissiondate AND 
                      Patient.dischargedate = patientICD.dischargedate INNER JOIN
                      tblICD ON patientICD.primarycode = tblICD.ICD_ID
WHERE     (tblICD.descrip LIKE N'%diabetes%') and  not in
(
SELECT    distinct Patient.patientid
FROM         Patient INNER JOIN
 patientICD ON Patient.patientid = patientICD.patientid AND Patient.admissiondate = patientICD.admissiondate AND 
                      Patient.dischargedate = patientICD.dischargedate INNER JOIN
                      tblICD ON patientICD.primarycode = tblICD.ICD_ID
WHERE     (tblICD.icd_id LIKE N'25000')
) 

Разрешено ли когда-нибудь написать запрос сexpression AND NOT IN (select query?

Ответы на вопрос(5)

Решение Вопроса

Вам нужно указать, какого поля нет во втором запросе

and Patient.patientid not in
 wootscootinboogie20 июн. 2012 г., 22:34
тьфу, я не могу упускать из виду что-то настолько черное. Спасибо :)

Чисто стилистический: вы можете «выжать» продукт пациентаICD * tblICD и поместите его в CTE, и дважды на него сделайте ссылку, например: (не проверено)

WITH zzz AS (
        SELECT pic.patientid , pic.admissiondate , pic.dischargedate
        , tab.ICD_ID , tab.descrip
        FROM patientICD pic
        JOIN tblICD tab ON pic.primarycode = tab.ICD_ID
        )
SELECT DISTINCT p.patientid
FROM  Patient p
JOIN zzz one ON one.patientid = p.patientid
             AND one.admissiondate = p.admissiondate 
             AND one.dischargedate = p.dischargedate 
WHERE one.descrip LIKE N'%diabetes%'
AND p.patientid NOT IN (
        SELECT two.patientid 
        FROM zzz two
        WHERE two.admissiondate = p.admissiondate
        AND two.dischargedate = p.dischargedate
        AND two.icd_id LIKE N'25000'
        );

ПРИМЕЧАНИЕ. Мне не нравитсяLIKE N'25000', Я думаю, что точное совпадение было бы хорошо. И поле icd_id должно быть числовым, вероятно. И пара {admissiondate, dischargedate} тоже должна быть смоделирована; возможно, используя диагноз_идента или инцидента.

 wootscootinboogie21 июн. 2012 г., 02:50
CTE - это то, о чем я только начинаю узнавать; Я играю с SQL Server всего пару месяцев назад. Мне всегда нравится учиться делать что-то по-новому.distinct, не расстроен :). что вы имеете в виду под "выжать"?

Ты хотел написать это?

WHERE     (tblICD.descrip LIKE N'%diabetes%') and Patient.patientid not in

UPDATE

Можно ли будет переписать все это так?

SELECT distinct  Patient.patientid
FROM Patient INNER JOIN
 patientICD ON Patient.patientid = patientICD.patientid AND Patient.admissiondate = patientICD.admissiondate AND 
                      Patient.dischargedate = patientICD.dischargedate INNER JOIN
                      tblICD ON patientICD.primarycode = tblICD.ICD_ID
WHERE tblICD.descrip LIKE N'%diabetes%' AND tblICD.icd_id NOT LIKE N'25000'
 20 июн. 2012 г., 22:50
Would it be possible to rewrite the entire thing as this? Нет, это разные подробности записи; выбран с использованием разных атрибутов.
 20 июн. 2012 г., 23:20
Да, вот что я сделал. Смотри мой ответ. Но в основном два подзапроса tblICD * tblICD относятся к разным наборам кортежей: один должен существовать, другой не должен существовать. Один для диабета, другой для болезни номер 25000 (что бы это ни было)
 20 июн. 2012 г., 22:55
Пожалуйста, дайте мне знать, если вам случится попробовать это так, и будет ли это работать. Что-то, что определенно сработает - вы можете заключить все свои JOIN-ы в один оператор CTE и оставить предложения WHERE-исключения за пределами CTE. Затем вы будете сканировать таблицы только один раз.

Я считаю, что вам нужно указать столбец, чтоnot in смотрит на Так что в соответствии с вашим сценарием, я думаю, вы бы хотелиand Patient.patientid not in

Вы забыли поле раньше НЕ.

Ваш ответ на вопрос