所以我有:
表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混合,那在我的情况下就不行了。
答案 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)