我已经搜索了类似的问题,但我没有找到任何问题。有两个几乎类似的问题,但解决方案是使用JOIN因为他/她要求不同的解决方案,但我的一个是不同的。我必须使用父查询从同一个表中使用Expression的子查询。
我可以像这样执行子查询吗?
[
{
"id": "9b3b835b",
"date": "Tue Mar 27 10:23:18 UTC 2018"
},
{
"id": "57eab193",
"date": "Thu Mar 29 14:45:23 UTC 2018"
},
{
"id": "440f0cd9",
"date": "Thu Mar 29 15:12:00 UTC 2018"
},
]
我需要这个,因为如果我从一个单独的子查询中获取Select summ.*
from
(select
t.column1 as 'field_1',
t.column2 as 'field_2',
(select
Sum(u.col1) as 'field_3',
Sum(u.col2) as 'field_4'
from
table1 u
where
u.col3 = t.column1) as 'field_3', 'field_4'),
t.column5 as 'field_5'
from
table1.t) summ
和field_3
,SQL Server将花费很长时间来执行存储过程。
目前,这样的查询(注意SQL Server需要为field_4
和field_3
两次子查询):
field_4
如果可能,或者我可以使用任何语法来完成同样的事情
我已更新上述(预期)及以下(我当前的)查询。
答案 0 :(得分:3)
你可以使用窗口函数SUM()OVER()和CASE WHEN ..来执行条件求和
select t.column1 as 'field_1',
t.column2 as 'field_2',
sum(case when t.col3 > 3 then col1 end) over() as 'field3' ,
sum(case when t.col3 > 3 then col2 end) over() as 'field4' ,
t.column5 as 'field_5'
from table1 t
您也不需要派生的表格summ
答案 1 :(得分:2)
我认为您可以使用OUTER APPLY
或CROSS APPLY
select t.column1 as field_1,
t.column2 as field_2,
q.field_3,
q.field_4,
t.column5 as field_5
from table1 t
outer apply
(
select
SUM(u.col1) field_3,
SUM(u.col2) field_4
from table1 u
where u.col3 = t.column1
) q
您可以在APPLY
子查询中使用外部参数。子查询对table1 t
的每一行执行。
我认为您也可以使用以下变体
SELECT t.column1 as field_1,
t.column2 as field_2,
q.field_3,
q.field_4,
t.column5 as field_5
FROM table1 t
LEFT JOIN
(
-- calculate field_3 and field_4 for each col3
select
col3,
SUM(col1) field_3,
SUM(col2) field_4
from table1
group by col3
) u
ON u.col3 = t.column1
答案 2 :(得分:1)
否则您无法在标量子查询中返回多个列。
相反,您需要保持原样,或将其转换为连接查询。由于您的子查询与外部查询不相关,您可以使用:
select t.column1 as 'field_1',
t.column2 as 'field_2',
u.column3 as 'field_3',
u.column4 as 'field_4',
t.column5 as 'field_5'
from table1 t
cross join (select SUM(u.col1) as column3
, SUM(u.col2) as column4
from table1 u
where u.col3 > 3) u;
这样,字段3和4将在每次执行时计算一次,而不是每个记录一次(或两次),并加入table1中的每个其他记录。