2016-11-18 7 views
1
SELECT * 
FROM 
(SELECT ID, Name 
    FROM .... 
) AS DT 
WHERE NOT EXISTS (SELECT 1 FROM DT AS DT2 WHERE DT.ID=DT2.ID AND DT2.Name='A') 

Попытки использовать производную таблицу DT в экзистенциальном подзапросе, но получает ошибку:Использования EXISTS с производной таблицей

Invalid object name 'DT'

ли объем производной таблицы не распространяется на экзистенциальном подзапрос?

ответ

3

Область действия распространяется на внутренний подзапрос, но вы пытаетесь клонировать таблицу.

В exists() можно использовать (SELECT ID, Name FROM ....) AS DT, но лучше с помощью WITH

WITH cte as ( 
     SELECT ID, Name 
     FROM .... 
) 
SELECT * 
FROM cte as DT 
WHERE NOT EXISTS (SELECT 1 
        FROM cte AS DT2 
        WHERE DT.ID=DT2.ID 
        AND DT2.Name='A') 

Suggestion: Как вы можете видеть объем DT как DT.id будет работать, проблема заключается в попытке клонировать образовавшаяся таблицу и вы не можете. За дверью это точно то, что делает CTE.

SELECT * 
FROM (SELECT ID, Name 
     FROM ....) as DT 
WHERE NOT EXISTS (SELECT 1 
        FROM (SELECT ID, Name 
         FROM ....) AS DT2 
        WHERE DT.ID=DT2.ID 
        AND DT2.Name='A') 
+0

Есть ли альтернативный способ достижения этого, кроме CTE? Я знаю эту технику, но изучал альтернативу, основанную на ограничении на моем конце. Фактический производный код таблицы намного больше и повторное использование его внутри Exists сделает код огромным. – AS91

+0

Да, я объясню это здесь. Вы должны переписать запрос 'DT' внутри' exist'. каково ваше ограничение? –

+0

@JuanCarlosOropeza +1 bien hecho –

2

Не требуется exists. Вы можете использовать функции окна:

SELECT ID, Name 
FROM (SELECT ID, Name, 
      SUM(CASE WHEN DT2.Name = 'A' THEN 1 ELSE 0 END) OVER (PARTITION BY ID) as a_cnt 
     FROM .... 
    ) DT 
WHERE a_cnt = 0; 
+0

Как обычно, я просто отвечаю на вопрос, что вы очень глубоко и решите проблему. Любая причина, по которой вы используете 'SUM()' вместо 'COUNT()'. Я предпочитаю использовать 'COUNT()', когда вы, очевидно, считаете. –

+0

@JuanCarlosOropeza. , , Во-первых, потому что некоторые базы данных поддерживают такие конструкции, как 'sum (DT2.Name = 'A')' - очень хорошая стенография. Во-вторых, потому что 'count (2)' возвращает то же значение, что и 'count (1)', и я нахожу это вводящим в заблуждение. –

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

  • Нет связанных вопросов^_^