Sql server 右\左联接不提供无条件的空值
我有两个表,一个是查找表,另一个是数据表。查找表包含名为cycleid、cycle的列。数据表具有SID、cycleid和cycle。以下是各表的结构 如果检查数据表,SID可能包含所有周期,也可能不包含所有周期。我想输出完成的SID和错过的周期 我右键连接了查找表并检索了丢失的和完成的循环。下面是我使用的查询Sql server 右\左联接不提供无条件的空值,sql-server,tableau-api,Sql Server,Tableau Api,我有两个表,一个是查找表,另一个是数据表。查找表包含名为cycleid、cycle的列。数据表具有SID、cycleid和cycle。以下是各表的结构 如果检查数据表,SID可能包含所有周期,也可能不包含所有周期。我想输出完成的SID和错过的周期 我右键连接了查找表并检索了丢失的和完成的循环。下面是我使用的查询 SELECT TOP 1000 [SID] ,s4.[CYCLE] ,s4.[CYCLEID] FROM [dbo].[d
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值。我想把所有的希德都还回去,从表中我会做剩下的事情
我需要的预期输出如下所示
我编写了一个如下所示的交叉连接查询,以实现预期的输出
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。您可以先创建一个主表(将所有
SID
和循环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
您在第一次查询中是否有相同的order by?是否第一个查询没有order by,所以在1000条记录的结果中看不到它们?order by没有任何影响。我刚刚用它来进行排序,这样我就可以根据SID CycleID显示数据。事实上,你能给我们提供预期的结果吗?嗨,Alex,我已经有了这个代码。我想要更简单的。我会告诉你我在使用这类代码时遇到的问题。我将把这个sql作为直接查询数据源传递到表中,我有超过10万个数据。tableau视图将被近100个用户访问,每次当这100个用户刷新视图时,这些代码都将在sql上为他们运行。这会降低我的表现。所以我需要一个更简单的代码,这不是SQL的问题,而是如何在tableau中显示数据。我不确定您是如何设计工作表的,但通常我会将
lookup\u data
和data
传递到tableau中,并让它加入tableau,因为记录最少,可以在tableau中使用计算字段进行计算,但这将是另一个对性能影响的故事,计算字段太多。欢迎您,但在tableau中,尝试重用数据,而不是在数据层中构建。您将丢失很多详细信息,并且在需要显示这些详细信息时会很痛苦(添加另一个数据源或替换数据源,第一个会增加数据大小,最后一个会杀死您,我尝试了最后一个…)