RIGHT \ LEFT Join不提供无条件的空值

时间:2016-11-01 05:55:21

标签: sql-server tableau

我有两个表,一个是查找表,另一个是数据表。查找表具有名为cycleid,cycle的列。数据表具有SID,cycleid,cycle。以下是表格的结构。

Data Table

Lookup Table

如果检查数据表,则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,并且从画面开始,我将完成其余的事情。

我需要的预期输出如下所示。

Expected Output

我写了一个如下所示的交叉连接查询来实现我预期的输出

  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。

1 个答案:

答案 0 :(得分:1)

您可以先创建一个主表(合并所有SIDCYCLE 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

Fiddle

或者,如果您不想使用公用表表达式,子查询版本:

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