【问题标题】:How to reuse subquery in select clause?如何在选择子句中重用子查询?
【发布时间】:2020-12-29 06:00:18
【问题描述】:

我希望能够在我的选择中重复使用子查询,而不必再次全部输入。有没有办法做到这一点?

例如,选择中的第一项是返回名称的子查询。

在第二个选择项中,我想重复使用“NAME”子查询,而不必再次输入。

我查看了 CTE,但看不到您如何为 where 子句传递参数。在此示例中,我需要从子查询中的主查询访问 T1.ID,但我没有看到使用 CTE 的方法。

SELECT

(SELECT NAME FROM TABLE2 T2 WHERE T2.ID=T1.ID) AS NAME,

(SELECT STATE FROM TABLE3 T3 WHERE T3.NAME=(SELECT NAME FROM TABLE2 T2 WHERE T2.ID=T1.ID)) AS STATE

FROM TABLE1 T1



【问题讨论】:

  • 你不能。它是一个相关子查询。
  • 为什么你不能 join t2t1 上使用 ID 然后 t3t2 上使用 name,然后在 SELECT t2.Name, t3.State 上?
  • @Gordon:我倾向于你的答案。其他答案意味着我必须重组整个查询,我不确定这是否可能。我的实际查询很复杂,我只是为这个问题做了一个简单的例子。

标签: sql tsql subquery lateral-join


【解决方案1】:

这看起来像是横向连接的典型用例。在 TSQL 中可以使用outer apply:

select t2.name, t3.state
from table1 t1
outer apply (select * from table2 t2 where t2.id   = t1.id  ) t2
outer apply (select * from table3 t3 where t3.name = t2.name) t3

【讨论】:

  • 也许我应该让我的例子更复杂一点。我的实际子查询包含几个连接和其他逻辑。主要查询也相当复杂。我只是去掉了复杂性,使问题更简单。我认为很难重组整个查询。
【解决方案2】:

我认为连接将被评估为 INNER JOIN。这个查询应该返回相同的输出

SELECT T2.[NAME], T3.[STATE]
FROM TABLE1 T1
     join TABLE2 T2 on T2.ID=T1.ID
     join Table3 T3 on T2.[NAME]=T3.[NAME];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2018-09-10
    • 2011-04-18
    相关资源
    最近更新 更多