首页 > 解决方案 > 一个查询中的多个 SELECT 使用相同的 WITH

问题描述

此查询过滤主表中的一些 ID,并将来自其他两个表的 ID 作为两个记录集返回所有数据 abpout:

WITH filteredIds (fid) AS 
(
    SELECT id 
    FROM MasterTable 
    WHERE <somecondition>
)
SELECT * 
FROM Table1 
RIGHT JOIN filteredIds ON (Table1.id = filteredIds.fid);

WITH filteredIds (fid) AS 
(
    SELECT id 
    FROM MasterTable 
    WHERE <somecondition>
)
SELECT * 
FROM Table2 
RIGHT JOIN filteredIds ON (Table2.id = filteredIds.fid);

到目前为止,这是可行的,但最好只有一个 WITH 子句,因为条件总是相同的。此外,条件通常是手动编写的,因为它用于收集一些诊断数据。

但是这个

WITH filteredIds (fid) AS 
(
    SELECT id 
    FROM MasterTable 
    WHERE <somecondition>
)
SELECT * 
FROM Table1 
RIGHT JOIN filteredIds ON (Table1.id = filteredIds.fid);

SELECT * 
FROM Table2 
RIGHT JOIN filteredIds ON (Table2.id = filteredIds.fid);

不起作用,SQL Server 声称它不知道filteredIds最后一个查询中的对象。

我是否监督了某些事情,或者它不是那样工作的?我想替代方案将是一个临时表。

标签: sqlsql-server

解决方案


一旦在查询中使用了 CTE,就不能在另一个查询中重用它。据我所知,没有直接的解决方法。最接近您想要的可能是创建一个真正的临时表:

CREATE TABLE #temp (fid int);
INSERT INTO #temp (fid)
SELECT id FROM MasterTable WHERE <somecondition>;

然后,您可以直接重用临时表:

SELECT * FROM Table1 a RIGHT JOIN #temp b ON a.id = b.fid;
SELECT * FROM Table2 a RIGHT JOIN #temp b ON a.id = b.fid;

推荐阅读