SQL 使用 cte,如何连接数据,而不是连接

SQL with cte, how to concat data, not join

我有疑问

SELECT Site, Risk_Time_Stamp,COMPUTER_NAME, [IP_ADDR1_TEXT],Number_of_Risks
    FROM dbo.sem_computer
    WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
    GROUP BY Site, Risk_Time_Stamp,COMPUTER_NAME, [IP_ADDR1_TEXT],Number_of_Risks

给出 4 行输出

和另一个查询

select * from SEPM_site

给出 1000 行输出

我希望连接两个输出,以便有 1000 行输出

但是当我这样做时

; with cte as (SELECT Site, Risk_Time_Stamp,COMPUTER_NAME, [IP_ADDR1_TEXT],Number_of_Risks
    FROM dbo.sem_computer
    WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
    GROUP BY Site, Risk_Time_Stamp,COMPUTER_NAME, [IP_ADDR1_TEXT],Number_of_Risks)
select *
from cte
join SEPM_Site ss
on cte.Site = ss.Site

我得到 4 行输出而不是 1000 行

如何解决这个问题?

我想你正在寻找 UNION

USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

这将 'concat' 您的两个查询的结果,因此最终您有 1004 条记录。

我想你想要一个 left join:

with cte (. . .)
select *
from SEPM_Site ss left join
     cte 
     on cte.Site = ss.Site

注意:我颠倒了表格的顺序。对于您的原始查询,您需要 right join。我更喜欢 left join.

您没有获得 1,000 行,因为 JOIN 没有 1,000 个匹配项。如果您想获取所有行,即使没有匹配项,也可以使用从 SEPM_Site table.

开始的 LEFT JOIN
; with cte as (SELECT Site, Risk_Time_Stamp,COMPUTER_NAME, [IP_ADDR1_TEXT],Number_of_Risks
    FROM dbo.sem_computer
    WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
    GROUP BY Site, Risk_Time_Stamp,COMPUTER_NAME, [IP_ADDR1_TEXT],Number_of_Risks)
select *
from SEPM_Site ss
LEFT join cte
on cte.Site = ss.Site