SQL-запрос с не существует - PullRequest
2 голосов
/ 06 июля 2010

У меня есть этот запрос, но по какой-то причине значения StartDate не фильтруются. Что с этим не так? Пожалуйста, дайте мне знать.

SELECT *
FROM TableA A
WHERE NOT EXISTS( SELECT * FROM TableB B
                  WHERE A.pId = B.pId and A.StartDate >= '20-JUN-10' )

Ответы [ 4 ]

2 голосов
/ 06 июля 2010

Если StartDate является столбцом varchar, вы не можете ожидать получения правильных результатов при выполнении большего, чем сравнение с ним. По сути, вы говорите, что любые значения, которые будут храниться в столбце StartDate, не должны сортироваться после или в '20 -JUN-10 '. Вы должны сделать StartDate фактическим DateTime. Таким образом, пока вы не сделаете это, вы должны привести его к DateTime и, поскольку он ссылается только на внешнюю таблицу, вы можете извлечь его из подзапроса:

Select ..
From TableA As A
Where ( A.StartDate Is Null Or Cast(A.StartDate As DateTime) < '2010-06-20' )
    And Not Exists  (
                    Select 1
                    From TableB As B
                    Where B.pid = A.pid
                    )

То, что StartDate не является действительным DateTime, является фундаментальной проблемой целостности данных и создает эту проблему вместе с множеством других, которые я себе представляю. Однако, если по какой-то безумной причине у вас есть значения, которые нельзя привести к DateTime в столбце StartDate, вам нужно добавить еще одну проверку (и шлепнуть оригинального администратора базы данных вверх ногами):

Select ..
From TableA As A
Where ( A.StartDate Is Null 
    Or (IsDate(A.StartDate) = 1 And Cast(A.StartDate As DateTime) < '2010-06-20' ) )
    And Not Exists  (
                    Select 1
                    From TableB As B
                    Where B.pid = A.pid
                    )
2 голосов
/ 06 июля 2010

Вы имели в виду это?

SELECT *
FROM TableA A
WHERE A.StartDate >= '20-JUN-10'
AND NOT EXISTS( SELECT * FROM TableB B WHERE A.pId = B.pId )

Помещение условия с StartDate в условие NOT EXISTS должно возвращать те строки, в которых этот критерий соответствует , а не .

1 голос
/ 06 июля 2010

В предположении вам может потребоваться пересмотреть скобки:

SELECT * FROM TableA A
WHERE NOT EXISTS(SELECT * FROM TableB B WHERE A.pId = B.pId) 
 and A.StartDate >= '20-JUN-10'
0 голосов
/ 06 июля 2010

использовать форматы ISO для дат, поэтому вместо '20 -JUN-10 'используйте' 20100610 ', предполагая, что это столбец даты / времени

См. Также Установка стандартного формата даты для SQL Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...