Sql 使用联接的两个以上表

Sql 使用联接的两个以上表,sql,join,Sql,Join,MainTable ID Column1 TableA.fK TableB.fk 1 some-value 1 null 2 some-value 1 1 3 some-value null 2 表a TableA.pk Column1 1 some-value 表B TableB.pk Column1 1 some-value 2

MainTable

ID Column1         TableA.fK TableB.fk
1  some-value        1          null
2  some-value        1          1
3  some-value        null       2
表a

TableA.pk  Column1
1          some-value
表B

TableB.pk Column1
1         some-value
2         some-value
选择Main.ID、Main.Column1、A.Column1、B.Column1
从主表main
左连接
表A
在Main.TableA.fk=A.TableA.pk上
左连接
表b
在Main.TableB.fk=B.TableB.fk上
其中Main.ID=1
意味着

结果是

  ID  Column1     A.Column1  B.Column1
  1   some-value   some-value  null
 ID    column1         A.Column1
 1     some-value     some-value  
预期输出

  ID  Column1     A.Column1  B.Column1
  1   some-value   some-value  null
 ID    column1         A.Column1
 1     some-value     some-value  
不应显示B.column1

当tableA外键值不为空时,如果在此处使用上述SELECT查询,则应从tableA获取所有详细信息
我正在使用RDBMS Microsoft Sql Server 2008

我不理解这里的问题。如果您不希望它显示
B.Column1
,请从
Select
语句中取出
B.Column1

你现在有

选择Main.ID、A.Column1、B.Column1

换成

选择Main.ID,A.Column1

根据您在下面的评论,您似乎正在寻找
Coalesce
IsNull
,这取决于您使用的DBMS(您在问题中也没有告诉我们)

像这样的方法应该会奏效:

SELECT  
  Main.ID, Coalesce(A.Column1, B.Column1) as Column1
FROM    
  MainTable main
LEFT JOIN
  Table A
ON      
  Main.TableA.fk = A.TableA.pk
LEFT JOIN
  TableB b
ON
  Main.TableB.fk = B.TableB.fk
WHERE   
  Main.ID = 1

只是不要将此列放入
SELECT
列表中:

SELECT  Main.ID, A.Column1
FROM    MainTable main
LEFT JOIN
        Table A
ON      Main.TableA.fk = A.TableA.pk
LEFT JOIN
        TableB b
ON      Main.TableB.fk = B.TableB.fk
WHERE   Main.ID = 1

从查询中删除B.Column1

Select Main.ID,A.Column1 FROM MainTable main LEFT JOIN Table A ON Main.TableA.fk=A.TableA.pk LEFT JOIN TableB b ON Main.TableB.fk =B.TableB.fk WHERE Main.ID =1

如果您只需要
ID
A.Column1
,为什么要将
B.Column1
包含在
SELECT
中?这是原始问题(已删除)。op只希望投影非空列。所以基本上我对OP的建议是使用动态sql。这是原始问题(已经删除)。op只希望投影非空列。所以基本上我对OP的建议是使用动态sql。如果两个表的外键都不可用,我需要两个表null@JW:啊,是的。这种知识确实会极大地改变事情。我将删除这个答案。谢谢你的提醒。:-)@KenWhite稍后删除
:)
其他人可能也需要查看此
:D
@AshokRavi:您需要编辑您的问题以提供更多信息。它现在所说的并不是你刚才在评论中所说的。