将子查询作为两列执行

时间:2018-04-12 02:44:57

标签: sql sql-server stored-procedures subquery

我已经搜索了类似的问题,但我没有找到任何问题。有两个几乎类似的问题,但解决方案是使用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_4field_3两次子查询):

field_4

如果可能,或者我可以使用任何语法来完成同样的事情

我已更新上述(预期)及以下(我当前的)查询。

3 个答案:

答案 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 APPLYCROSS 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中的每个其他记录。