在UNION语句的子查询B中引用子查询A的结果?

时间:2018-06-21 17:26:36

标签: sql sql-server

我正在尝试解决一个问题,该问题要求我根据同一表中其他行的值从表中获取行(我在输出中也需要)。 我正在寻找以下功能:

SELECT a.id,a.col1,a.col2 FROM tbl a WHERE col1 = @col
UNION
SELECT b.id,b.col1,b.col2 FROM tbl b WHERE b.col2 IN (SELECT a.col1)
UNION
SELECT c.id,c.col1,c.col2 FROM tbl c WHERE c.col1 IN (SELECT b.col1)

(SELECT id,col1,col2 FROM tbl WHERE col1 = @val) a
UNION
SELECT id,col1,col2 FROM tbl b WHERE b.col2 IN (SELECT col1 FROM a)
UNION
SELECT id,col1,col2 FROM tbl c WHERE c.col1 IN (SELECT col1 FROM b)

但这两个都不被允许。有什么方法可以做到这一点,避免在扩展时避免繁琐的递归语句,例如下面的功能语句:

SELECT * FROM #tbl WHERE col1 = @val
UNION
SELECT * FROM #tbl WHERE col2 = (SELECT col1 FROM #tbl WHERE col1 = @val)
UNION
SELECT * FROM #tbl WHERE col1 = (SELECT col1 FROM #tbl WHERE col2 = (SELECT col1 FROM #tbl WHERE col1 = @val))

fiddle

1 个答案:

答案 0 :(得分:0)

这是您想要的吗?

with cte as (
      SELECT a.id, a.col1, a.col2
      FROM tbl a
      WHERE col1 = @col
      UNION ALL
      SELECT b.id, b.col1, b.col2
      FROM tbl b JOIN
           cte
           ON b.col2 = cte.col1
     )
select *
from cte;

您可能希望在外部查询中使用select distinct或在内部查询中使用union

如果您的关系有周期,则查询本身可能会更复杂。

相关问题