当TableB没有匹配的条目时,仅使用TableA中的数据

时间:2018-04-09 07:46:45

标签: sql sql-server join coalesce

所以我有:

表A(不仅是名称 - 多列):

| IDA        | Name        |
|:-----------|------------:|
| 1          |        John |
| 2          |       Jonas | 
| 3          |        Carl | 
| 4          |         Foo |
| 5          |         Bar |
| 6          |         Dog |

表B(不仅是名称 - 多列):

| IDB        | Name        |
|:-----------|------------:|
| 1          |         Bob |
| 2          |        Lisa | 

表MAIN:

| ID         | FKtoB       | FKtoA       |
|:-----------|------------:|------------:|
| 1          |           1 |           4 |
| 2          |             |           3 | 
| 3          |             |           1 | 
| 4          |           2 |           6 |
| 5          |             |           2 |
| 6          |             |           5 |

我的目标是从MAIN中选择并且更喜欢使用表B的数据,但如果不可用,我将使用表A的数据。我尝试使用coalesce但这没有用,因为我没有想要混合数据,所以如果例如表B有一行的数据,那么在这一行中应该没有来自表A的数据。

我的查询看起来像这样:

select 
coalesce(b.name, a.name) as surname, coalesce(b.surname, a.surname) as surname 
from MAIN m
left join TableA a on a.IDA = m.FKtoA
left join TableB b on b.IDA = m.FKtoB

我的问题是,如果例如b.name被填充而b.surname不是它会将b.name与a.surname混合,那在我的情况下就不行了。

6 个答案:

答案 0 :(得分:2)

使用Left Join -

尝试Case
SELECT
    M.ID, (CASE WHEN B.IDB IS NOT NULL THEN B.Name ELSE A.Name END) AS NAME
FROM
    MAIN AS M
    LEFT JOIN TableB as B ON B.IDB = M.FKtoB
    LEFT JOIN TableA as A ON A.IDA = M.FKtoA

答案 1 :(得分:2)

也许你可以添加b的非existens作为连接标准:

select 
coalesce(b.name, a.name) as name, coalesce(b.surname, a.surname) as surname 
from MAIN m
left join TableB b on b.IDA = m.FKtoB
left join TableA a on a.IDA = m.FKtoA and b.IDA is null

编辑:将一个姓氏更正为姓名

答案 2 :(得分:1)

从SQL Server 2012(及更高版本),您可以使用IIF

SELECT
IIF(m.FKtoB IS NULL, A.name, B.name) AS surname
FROM MAIN m
LEFT JOIN TableA a ON a.IDA = m.FKtoA
LEFT JOIN TableB b ON b.IDA = m.FKtoB

答案 3 :(得分:1)

试试这个:

    declare @tableA table(IDA INT,Name varchar(MAX))
    declare @tableB table(IDB INT, Name VARCHAR(MAX))
    declare @tableMain table(ID INT,FKtoB INT,FKtoA INT)

    INSERT INTO @tableA
    SELECT 1,'John'
    union all
    SELECT 2, 'Jonas'
    union all
    SELECT 3, 'Carl'
    union all
    SELECT 4,'Foo'
    union all
    SELECT 5 ,'Bar'
    union all
    SELECT 6,'Dog'


    INSERT INTO @tableB
    SELECT 1, 'Bob'
    Union all
    SELECT 2, 'Lisa'


    INSERT INTO @tableMain
    SELECT 1,1,4
    union all
    SELECT 2,null,3
    union all
    SELECT 3,null,1
    union all
    SELECT 4,2,6
    union all
    SELECT 5,null,2
    union all
    SELECT 6,null,5


    Select tm.Id,ISNULL(tb.Name,ta.Name) As NAME from @tableMain tm
    LEFT JOIN @tableB tb on tm.FktoB=tb.IDb and IDb is not NUll
    LEFT JOIN @tableA tA on tm.FktoA=ta.IDA and FktoB is NUll

答案 4 :(得分:1)

只有在表B中没有匹配时才要从表A中进行选择,因此给定的外键完好无损:

select 
  coalesce(b.firstname, a.firstname) as firstname,
  coalesce(b.surname, a.surname) as surname,
  coalesce(b.birthday, a.birthday) as birthday,
  ...
from MAIN m
left join TableB b on b.IDB = m.FKtoB
left join TableA a on a.IDA = m.FKtoA and m.FKtoB is null;

另一种方法是联合所有:

select firstname, surname, birthday, ...
from TableB 
where IDB in (select FKtoB from MAIN)
union all
select firstname, surname, birthday, ...
from TableA 
where IDA in (select FKtoA from MAIN where FKtoB is null);

答案 5 :(得分:0)

试试这个。它会根据您的需要提供结果。

(select ida as ID ,
case when ida is not null then ida end fkToIda,
 case when idb is not null then idb end fkToIdB 
 from A
left outer join B on a.ida=b.idb)

union

(select idb ,
case when ida is not null then ida end,
 case when idb is not null then idb end 
 from A
right outer join B on a.ida=b.idb)