【发布时间】:2016-11-01 15:19:35
【问题描述】:
我有两个表,一个是查找表,另一个是数据表。查找表具有名为 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。
【问题讨论】:
-
第一次查询的order by是否相同?会不会是第一个查询没有 order by,所以您只是在 1000 条记录结果中看不到它们?
-
order by 没有任何影响。我刚刚使用它来进行排序,以便我可以根据 SID、CycleID 显示数据。
-
事实上,你能给我们提供预期的结果吗?