Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 基于1个表中的2列条件连接到两个不同的表_Sql_Sql Server_Sql Server 2008_Tsql_Sql Server 2012 - Fatal编程技术网

Sql 基于1个表中的2列条件连接到两个不同的表

Sql 基于1个表中的2列条件连接到两个不同的表,sql,sql-server,sql-server-2008,tsql,sql-server-2012,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2012,我有一张像这样的桌子 dbo.Box ID SourceID OverrideQueueID 1 1 NULL 2 1 2 3 2 NULL 我需要找出一种方法来说明OverrideQueueID是否为NULL,然后只需从dbo.Box连接到dbo.Source.ID,否则如果OverrideQueueID不是NULL,则连接到dbo.Queue.ID。这是否可以在一个select

我有一张像这样的桌子

dbo.Box
ID SourceID    OverrideQueueID
1      1              NULL
2      1              2
3      2              NULL
我需要找出一种方法来说明OverrideQueueID是否为NULL,然后只需从dbo.Box连接到dbo.Source.ID,否则如果OverrideQueueID不是NULL,则连接到dbo.Queue.ID。这是否可以在一个select中执行,因为它正在连接到不同的表

如果可能的话,我尝试在不引入大量左连接的情况下完成此操作。

一种可能的方法:

select * from Box as a
join Box as b ON a.OverrideQueueID is null and a.ID = b.SourceID
join Queue as q ON a.OverrideQueueID is not null and a.ID = q.ID
一种可能的方式:

select * from Box as a
join Box as b ON a.OverrideQueueID is null and a.ID = b.SourceID
join Queue as q ON a.OverrideQueueID is not null and a.ID = q.ID

我希望一个工会能帮助你,就像下面给出的那样

Select Col1,Col2
From  dbo.Box B
Join dbo.Source S On S.Id = b.SourceID
Where B.OverrideQueueID  is Null
Union
Select Col1,Col2
From  dbo.Box B
Join  dbo.Queue Q On Q.Id = b.SourceID
Where B.OverrideQueueID  is Not Null

我希望一个工会能帮助你,就像下面给出的那样

Select Col1,Col2
From  dbo.Box B
Join dbo.Source S On S.Id = b.SourceID
Where B.OverrideQueueID  is Null
Union
Select Col1,Col2
From  dbo.Box B
Join  dbo.Queue Q On Q.Id = b.SourceID
Where B.OverrideQueueID  is Not Null

您有两条SourceID=1的记录。。一个为空,另一个为覆盖。我假设哪一个赢了#2 ID,但有没有更高的数字需要谨慎

因为您可能关心每个源,所以它应该像max()一样简单,并且根本不需要连接。。。差不多

select 
      b.SourceID,
      max( coalesce( b.OverrideQueueID, b.ID )) as FinalQueue
   from
      Box b
   group by
      b.SourceID
应用的合并基本上会接受任何覆盖队列,并用自己的源替换它们。因此,对于记录1和记录3,它们将指向自己作为要应用的队列1和队列3。只有在sourceID=1上有两条记录时,#2队列才会取代#1(空覆盖)队列


因此,sourceID=1的最大值将是队列2,sourceID=2的最大值将是队列3。

对于sourceID=1,您有两条记录。。一个为空,另一个为覆盖。我假设哪一个赢了#2 ID,但有没有更高的数字需要谨慎

因为您可能关心每个源,所以它应该像max()一样简单,并且根本不需要连接。。。差不多

select 
      b.SourceID,
      max( coalesce( b.OverrideQueueID, b.ID )) as FinalQueue
   from
      Box b
   group by
      b.SourceID
应用的合并基本上会接受任何覆盖队列,并用自己的源替换它们。因此,对于记录1和记录3,它们将指向自己作为要应用的队列1和队列3。只有在sourceID=1上有两条记录时,#2队列才会取代#1(空覆盖)队列


因此,sourceID=1的最大值将是队列2,sourceID=2的最大值将是队列3。

试试这个。您可以修改WHERE子句以满足您的需要

SELECT 
    b.*,
    s.*,
    q.*
FROM
    dbo.Box b
    LEFT JOIN dbo.[Source] s ON s.ID = b.SourceID AND b.OverrideQueueID IS NULL
    LEFT JOIN dbo.[Queue] q ON q.ID = b.OverrideQueueID AND b.OverrideQueueID IS NOT NULL
WHERE
    s.ID IS NOT NULL OR q.ID IS NOT NULL

试试这个。您可以修改WHERE子句以满足您的需要

SELECT 
    b.*,
    s.*,
    q.*
FROM
    dbo.Box b
    LEFT JOIN dbo.[Source] s ON s.ID = b.SourceID AND b.OverrideQueueID IS NULL
    LEFT JOIN dbo.[Queue] q ON q.ID = b.OverrideQueueID AND b.OverrideQueueID IS NOT NULL
WHERE
    s.ID IS NOT NULL OR q.ID IS NOT NULL

不,你不能那样做。但是,您可能可以使用ISNULL和左连接来完成。没有关于表结构的更多细节,尽管这只是猜测。左连接有什么问题吗?不,你不能这样做连接。但是,您可能可以使用ISNULL和左连接来完成。没有关于表结构的更多详细信息,尽管这只是猜测。左联接有什么问题?您可能希望将内部联接转换为左联接您可能希望将内部联接转换为左联接