SQL — Запрос — где не в select

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

Хорошо, вот мой SQL:-

 SELECT Telephone, 
       Houseno, 
       Street, 
       Tostreet, 
       Passengername, 
       Acceptancedate 
FROM   Telephone 
WHERE  Acceptancedate !> '2014/05/01' 
       AND Telephone LIKE '011%' 
       AND ( Zoneno = '6' 
              OR Zoneno = '5' 
              OR Zoneno = '9' 
              OR Zoneno = '108' ) 
       AND Telephone = 'XXX' 
ORDER  BY Acceptancedate 
  

Это отображает 5 записей для этого телефонного номера.

Однако, если я изменю !> на >

он показывает 3 записи.

SQL, который у меня есть, правильный, но я хочу отображать цифры только в том случае, если этот номер телефона не отображается, когда AcceptanceDate > '2014/05/01' (поскольку номера телефонов не уникальны)

Любая помощь будет высоко оценена!

Комментарии:

1. Каков именно ваш вариант использования? Если вы измените операторы в операторе where, то очевидно, что вы получите разные результаты, так что вы пытаетесь сказать, изменив!> на>?

2. В принципе, я хочу отобразить все номера из приведенного выше SQL, ГДЕ телефона нет в следующем запросе; ВЫБЕРИТЕ * из телефона, ГДЕ Acceptancedata> ‘2014/05/01’

Ответ №1:

Вы могли бы использовать NOT EXISTS для исключения телефонных номеров, которые появляются после определенной даты

 SELECT  Telephone, 
        Houseno, 
        Street, 
        Tostreet, 
        Passengername, 
        Acceptancedate 
FROM    Telephone AS t
WHERE   Telephone LIKE '011%' 
AND     Zoneno IN ('6', '5', '9', '108')
AND     Telephone = 'XXX' 
AND     NOT EXISTS
        (   SELECT  1
            FROM    Telephone AS t2
            WHERE   t2.Telephone = t.Telephone
            AND     t2.Acceptancedate > '20140501' 
        );
  

Комментарии:

1. Спасибо, это именно то, что мне было нужно 🙂

Ответ №2:

Вы должны написать where предложение следующим образом:

 WHERE  Acceptancedate <= '2014-05-01' AND
       Telephone LIKE '011%' AND
       Zoneno IN ('6', '5', '9', '108') AND
       Telephone = 'XXX' 
  

Это не изменит результат, но вот изменения:

  • !< не является стандартным оператором сравнения. Используйте <= то, что понятнее.
  • Я изменил формат даты на стандартный формат ISO ГГГГ-ММ-ДД
  • Я изменил сравнение ZoneNo s на использование IN , а не OR

Кроме того, я отмечаю два сравнения Telephone . Первый является избыточным.