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
我有疑问
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