Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 右\左联接不提供无条件的空值_Sql Server_Tableau Api - Fatal编程技术网

Sql server 右\左联接不提供无条件的空值

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

我有两个表,一个是查找表,另一个是数据表。查找表包含名为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值。我想把所有的希德都还回去,从表中我会做剩下的事情

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

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

  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中,尝试重用数据,而不是在数据层中构建。您将丢失很多详细信息,并且在需要显示这些详细信息时会很痛苦(添加另一个数据源或替换数据源,第一个会增加数据大小,最后一个会杀死您,我尝试了最后一个…)