2016-05-16 2 views
0

У меня есть запрос, похожий на следующий, где мне нужно вернуть несколько полей из другой таблицы в качестве подзапросов. Есть ли способ, который я могу только вызвать запрос в TABLE2 один раз и использовать результаты этого запроса для заполнения различных полей, которые мне нужны? Я ищу что-то похожее на то, как вы можете использовать оператор let в LINQ. Благодарю.TSQL Как я могу повторно использовать запись в подзапросах

select 

(select field1 from TABLE2 where id = 1) as field1, 
(select field2 from TABLE2 where id = 1) as field2, 
(select field3 from TABLE2 where id = 1) as field3, 
(select field4 from TABLE2 where id = 1) as field4 

from mainTable where p1 = @p1 
+2

Существует несколько способов добиться этого. Вы можете использовать таблицу cte, производную таблицу или, скорее всего, вы можете просто присоединиться к вашим таблицам. Но большая честь для реализации этого не очень эффективна. –

ответ

1

Я хотел бы использовать OUTER APPLY:

select 

x.field1 as field1, 
x.field2 as field2, 
x.field3 as field3, 
x.field4 as field4 

from mainTable as mt 
outer apply (select field1, field2, field3, field4 from TABLE2 where id = 1) as x 
where p1 = @p1 
0

Вы можете использовать CROSS JOIN:

select t.field1, t.field2, ... 
from mainTable 
cross join (select field1, field2, ... from TABLE2 where id = 1) as t 
where p1 = @p1 

Я предполагаю, что подзапрос используется в cross join операции возвращает ровно одну запись.

+0

Если 'where id = 1' является False или Unknown и' where p1 = @ p1' is True, тогда исходный запрос вернет хотя бы одну строку, но это решение ... нет. –

+0

2 строки CROSS JOIN 0 rows = 0 rows –

1

Я думаю, что переменные являются ближайшими к LINQ пусть положение. Например:

declare @field1 bigint; 
declare @field2 nvarchar(64); 

select @field1 = field1, @field2=field2 from TABLE2 where id = 1; 


select @field1, @field2, SomeOtherField from mainTable 
where p1 = @p1; 

Конечно, нужно настроить соответствующие типы переменных.

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