当重用次数不是主查询中列的完整列表时,如何重用子查询?

时间:2017-03-22 00:14:40

标签: sql sql-server

所以问题是:

select

column1,
column2,
(select column_x from anotherTable with conditionsDerived) as column3,
(select column_y from anotherTable with conditionsDerived) as column4

from mainTable
where conditions;

在上面的示例中,对于列column3和column4,相同的查询正在使用两次。我相信这需要两倍的时间,我想避免这种情况。如果不存在column1和column2,我知道如何处理它。重要的一点是conditionsDerived基于来自mainTable的当前查询,即它不是一个独立的查询。它至少取决于mainTable的一列。

3 个答案:

答案 0 :(得分:3)

我假设您的查询确实是相关的子查询。如果是这种情况,那么您可以使用"横向连接"。在SQL Server中,这是使用outer apply

完成的
select t.column1, t.column2,
       an.column_x as column3, an.column_y as column4
from mainTable t outer apply
     (select column_x, column_y
      from anothertable an
      where . . .
     ) an
where conditions;

Apply就像在from子句中有一个相关的子查询。但它更好。 。 。子查询可以返回多列和/或多行。

如果查询未关联,您仍然可以使用apply。但您也可以使用cross join

答案 1 :(得分:0)

您可以使用WITH子句,它可以提高性能并使代码更具可读性。

本文可以帮助您:

https://oracle-base.com/articles/misc/with-clause

http://modern-sql.com/feature/with

答案 2 :(得分:0)

使用STD联接查询:

select     table1.id,
           table1.column_1,
           table1.column_2,
           table2.column_3,
           table2.column_4
from       table1
inner join table2
on         table1.id = table2.id
where      table2.field_x = table2.conditions
and        table1.field_y = table1.conditions;