【问题标题】:RIGHT\LEFT Join does not provide null values without conditionRIGHT\LEFT Join 不提供无条件空值
【发布时间】: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 显示数据。
  • 事实上,你能给我们提供预期的结果吗?

标签: sql-server tableau-api


【解决方案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

【讨论】:

  • 嗨,Alex,我已经有了这个代码。我想要更简单的。我会告诉我在使用这种类型的代码时遇到的问题。我将在表格中将此 sql 作为直接查询数据源传递,并且我的数据超过 10 万。近 100 个用户将访问 tableau 视图,并且每次刷新视图时,此代码都会在这 100 个用户的 sql 上运行。这会降低我的表现。所以我需要一个更简单的代码。
  • 那么这不是关于 SQL 的问题,而是你如何在 tableau 中呈现数据。我不确定您如何设计工作表,但通常我会将lookup_datadata 传递到tableau 中,并让它加入到tableau 中,因为记录是最少的并且可以在tableau 中使用计算字段进行计算,但是对于计算字段过多的性能影响,这将是另一个故事。
  • 不客气,但是在tableau中,尽量重用数据而不是在数据层中建立。你会丢失很多细节,当你需要呈现这些细节时会很痛苦(添加另一个数据源或替换数据源,第一个会增加数据大小,最后一个会杀了你,我试过最后一个。 ..)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多