我有两个表,一个是查找表,另一个是数据表。查找表具有名为cycleid,cycle的列。数据表具有SID,cycleid,cycle。以下是表格的结构。
如果检查数据表,则SID可能具有所有周期,并且可能没有所有周期。我想输出已完成的SID以及错过的周期。
我加入查找表并检索丢失和完成的循环。以下是我使用的查询。
SELECT TOP 1000 [SID]
,s4.[CYCLE]
,s4.[CYCLEID]
FROM [dbo].[data] s3 RIGHT JOIN
[dbo].[lookup_data] s4 ON s3.CYCLEID = s4.CYCLEID
当我查询所有SID时,查询没有显示错过的值。当我使用以下查询专门查询SID时,我得到了正确的结果,包括遗漏的结果。
SELECT TOP 1000 [SID]
,s4.[CYCLE]
,s4.[CYCLEID]
FROM [dbo].[data] s3 RIGHT JOIN [dbo].[lookup_data] s4
ON s3.CYCLEID = s4.CYCLEID
AND s3.SID = 101002
ORDER BY [SID], s4.[CYCLEID]
当我将此查询提供给tableau时,我无法在查询中提供sid值。我想要退回所有的sid,并且从画面开始,我将完成其余的事情。
我需要的预期输出如下所示。
我写了一个如下所示的交叉连接查询来实现我预期的输出
SELECT DISTINCT
tab.CYCLEID
,tab.SID
,d.CYCLE
FROM ( SELECT d.SID
,d.[CYCLE]
,e.CYCLEID
FROM ( SELECT e.sid
,e.CYCLE
FROM [db_temp].[dbo].[Sheet3$] e
) d
CROSS JOIN [db_temp].[dbo].[Sheet4$] e
) tab
LEFT OUTER JOIN [db_temp].[dbo].[Sheet3$] d
ON d.CYCLEID = tab.CYCLEID
AND d.SID = tab.SID
ORDER BY tab.SID
,tab.CYCLEID;
但是我无法将此查询用于更多场景,因为我的数据集有近20到40列,而且当我使用上面的列时我遇到了问题。
有没有办法以更简单的方式做到这一点,只有左或右连接本身?我希望查询返回所有SID的所有缺失值和已完成的值,而不是在查询中提供单个sid。
答案 0 :(得分:1)
您可以先创建一个主表(合并所有SID
和CYCLE ID
),然后右键加入数据表
;with ctxMaster as (
select distinct d.SID, l.CYCLE, l.CYCLEID
from lookup_data l
cross join data d
)
select d.SID, m.CYCLE, m.CYCLEID
from ctxMaster m
left join data d on m.SID = d.SID and m.CYCLEID = d.CYCLEID
order by m.SID, m.CYCLEID
或者,如果您不想使用公用表表达式,子查询版本:
select d.SID, m.CYCLE, m.CYCLEID
from (select distinct d.SID, l.CYCLE, l.CYCLEID
from lookup_data l
cross join data d) m
left join data d on m.SID = d.SID and m.CYCLEID = d.CYCLEID
order by m.SID, m.CYCLEID