2016-03-18 3 views
-1

У меня есть следующий запросслучай, когда против существует в SQL

SELECT TOP 10 
    CASE 
     WHEN EXISTS (SELECT t1.[Code Article] FROM [Promotion] WHERE t1.datecol BETWEEN [Date Debut Promo] AND [Date Fin Promo]) 
      THEN 1 
     ELSE 0 
    END AS test1, 
    CASE 
     WHEN [Code Article] IN (SELECT [Code Article] FROM [Promotion] WHERE datecol BETWEEN [Date Debut Promo] AND [Date Fin Promo]) 
      THEN 1 
     ELSE 0 
    END AS test2 
FROM [QlikDataWarehouse].[dbo].[Vente] t1 

Результаты

enter image description here

Почему я получаю test1 <> test2? какова разница между test1 и test2? Это не то же самое?

+1

При использовании подзапросов вы должны * всегда * использовать квалифицированные имена таблиц. Квалифицированные имена таблиц - это, как правило, хорошая идея, но еще важнее с подзапросами. –

ответ

1

Причина проста: вы не сравниваете значение [Code Article] в первом подзапросе.

Правильный синтаксис для подвыборки бы это:

(
    SELECT * 
    FROM  [Promotion] 
    WHERE datecol between [Date Debut Promo] and [Date Fin Promo] 
    AND t1.[Code Article] = [Code Article] 
) 

t1 перед datecol был удален и [Код статьи] соединяется с внешней таблицей.

+0

Мне нужно добавить тот же самый во втором подзаголовке? –

+0

Нет, второй уже использует IN, но это не повредит –

0

Мы ничего не знаем о вашей базе данных, поэтому на это трудно ответить.

Использование индексов и, возможно, внешнего соединения. Поместите результаты вашего подселекта во временную таблицу и используйте их для предложения exists.

+1

Добавить комментарий – Sherlock

Смежные вопросы