SQL не может заставить предложение WHERE EXISTS работать правильно и возвращать только те строки, которые имеют тип для клиента, в течение определенной даты - PullRequest
1 голос
/ 09 марта 2019

Хорошо, это сводит меня с ума, и решение, которое, я уверен, будет довольно простым, и я, вероятно, ударился головой о стену.У меня есть запрос, где у меня есть данные клиента.По некоторым запросам я ТОЛЬКО хочу, чтобы клиенты между определенной датой, которые посещали клиентов в какой-то момент в этом диапазоне дат, соответствуют 3, 8 или 12 Call_Report_ID. Для этих клиентов я хочу, чтобы они возвращали ВСЕ данные в пределах датыдиапазон, а не только строки с этим кодом посещения клиента.Для других клиентов, у которых нет посещения клиента, я хочу исключить их из данных.

Вот то, с чем я играл, и не могу заставить его работать вообще.

SELECT * 
FROM CV.Data AS CV 
WHERE EXISTS (SELECT * 
              FROM CV.Data AS CVD 
              WHERE CVD.Call_Report_ID IN(3,8,12) 
                  AND CVD.User_ID = 33) 
    AND CV.User_ID = 33 
    AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'

Итак, вот пример того, что я хочу:

Cust_ID Call_Report_ID Activity_Date
  5         3            10/15/2018
  5         7            10/28/2018
  6         9            10/21/2018
  6         11           10/25/2018 

В приведенном выше примере, когда я запускаю этот запрос, я хочу, чтобы он возвратил обе строки из Customer 5, так как они имеют идентификатор отчета о вызове из3,8 или 12 в ЛЮБОЙ строке в диапазоне дат, и исключить обе строки из Клиента 6, поскольку они не имеют call_report_Id с этими типами в диапазоне дат

Однако каждый раз, когда я запускаю его, онвозвращает все строки для этого пользователя, а не только те, которые указаны в подзапросе WHERE EXISTS.

В чем я тут не прав?

Ответы [ 5 ]

1 голос
/ 09 марта 2019

Замена Exist на in:

SELECT * 
FROM Data AS CV 
WHERE Cust_ID in (SELECT Cust_ID 
              FROM Data AS CVD 
              WHERE CVD.Call_Report_ID IN(3,8,12) 
                  AND CVD.User_ID = 33) 
    AND CV.User_ID = 33 
    AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
0 голосов
/ 09 марта 2019

Вы никоим образом не присоединялись к подзапросу с внешним запросом.

SELECT * 
FROM CV.Data AS CV 
WHERE EXISTS (SELECT * 
              FROM CV.Data AS CVD 
              WHERE CVD.Call_Report_ID IN(3,8,12) 
                  AND CVD.User_ID = 33
                  AND CV.Cust_ID = CVD.Cust_ID) <--
    AND CV.User_ID = 33 
    AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
0 голосов
/ 09 марта 2019

возвращает все строки для этого пользователя, а не только те, которые указаны в ГДЕ СУЩЕСТВУЕТ подзапрос

EXISTS не фильтрует данные, возвращаемые запросом.
Возвращает TRUE или FALSE.
Так что если он вернет FALSE, то по вашему запросу будет возвращено строк
и если он возвращает TRUE все строки при условиях:

CV.User_ID = 33 AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'  

будет возвращено

0 голосов
/ 09 марта 2019

Возвращает все строки, потому что вы не выполняете никакой фильтрации в существующем запросе.

Я думаю, что было бы лучше изменить этот запрос, чтобы вы использовали соединение.

0 голосов
/ 09 марта 2019

Как насчет этого:

SELECT * 
FROM CV.Data AS CV 
WHERE EXISTS (SELECT * 
          FROM CV.Data AS CVD 
          WHERE CVD.Call_Report_ID IN(3,8,12) 
              AND CVD.User_ID = 33) 
AND CV.User_ID = 33 
AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
AND CV.Call_Report_ID IN(3,8,12)

Если бы я был вами, я бы подумал, зачем мне это условие EXISTS, это действительно не прямой фильтр, однако у меня недостаточно информации от вас, чтобы просто отказаться от него.

Вы можете рассматривать мой ответ как рабочую подсказку, но подумайте, зачем вам это условие СУЩЕСТВУЕТ. Похоже, что это не нужно, и запрос может выглядеть следующим образом:

SELECT * 
FROM CV.Data AS CV 
WHERE CV.User_ID = 33 
AND CV.Activity_Date BETWEEN '10/1/2018' AND '3/31/2019'
AND CV.Call_Report_ID IN(3,8,12)
...