2013-09-20 5 views
8

Не могу понять, как использовать несколько КТРИспользование Multiple КТР

Это не удается

; with [cteOne] as (
    select 1 as col 
), 
    [cteTwo] as (
    select 2 as col 
) 
select 'yesA' where exists (select * from [cteOne]) 
select 'yexB' where exists (select * from [cteTwo]) 

Это работает - но это не то, что мне нужно

; with [cteOne] as (
    select 1 as col 
), 
    [cteTwo] as (
    select 2 as col 
) 
select * from [cteOne] 
union 
select * from [cteTwo] 

Реальный синтаксис был присоединиться к строке row_number()
Я только что закончил использование производной таблицы

+0

Ваш пример не нужно несколько КТР. Вы можете использовать два одиночных. Можете ли вы показать что-то более представительное, почему оно вам нужно? В любом случае они доступны только для одного оператора, следующего за ним. Вы не можете вернуть 2 отдельных набора результатов из одного определения. –

+0

Что вам нужно? Пожалуйста, опубликуйте результаты, которые вы ожидали увидеть. – Quassnoi

+0

Что вы пытаетесь достичь? Почему вы не можете просто ввести «объединение» в первый пример? –

ответ

9

Первый из них терпит неудачу, потому что для CTE или набора CTE может следовать только один оператор.

Вы можете переписать его как

; with [cteOne] as (
    select 1 as col 
) 
select 'yesA' where exists (select * from [cteOne]) 

; with [cteTwo] as (
    select 2 as col 
) 
select 'yexB' where exists (select * from [cteTwo]) 
+0

Я пришел к такому же выводу. Мне определенно не нравится это поведение. – Paparazzi

+0

Зачем нужно иметь двоеточие перед оператором with? "; WITH" Спасибо – Drewdin

+2

@Drewdin Это не технически. Но после предыдущего утверждения требуется иметь в себе двоеточие, в отличие от многих других утверждений, поэтому точка с запятой перед тем, как это сделать, гарантирует, что если вы не используете разделители с разделителями двоеточие. – podiluska

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