【问题标题】:SQL Natural Join on Multiple Tables including nulls多个表上的 SQL 自然连接,包括空值
【发布时间】:2012-11-16 23:38:18
【问题描述】:

请原谅我对这个问题的无知,如果它真的很简单,但它让我发疯,我已经从这个网站搜索(尝试过和失败过)不同的解决方案,所以这里......

我正在使用 SQL 2008 并尝试将结果从 12 个表中提取到一个查询中,所以我有;

DECLARE @RefID nvarchar(10)
SET @RefID = 'test'

SELECT * From 
Table1, 
Table2, 
Table3, 
Table4, 
Table5, 
Table6, 
Table7,
Table8,
Table9,
Table10,
Table11,
Table12

WHERE table1.[RefID] = @RefID
AND Table2.[Ref ID] = @RefID
AND Table3.[Ref ID] = @RefID
AND Table4.[Ref ID] = @RefID 
AND Table5.[Ref ID] = @RefID
AND Table6.[Ref ID] = @RefID 
AND Table7.[Ref ID] = @RefID 
AND Table8.[Ref ID] = @RefID 
AND Table9.[Ref ID] = @RefID 
AND Table10.[Ref ID] = @RefID 
AND Table11.[RefID] = @RefID 
AND Table12.[RefID] = @RefID `

现在这工作正常,易于理解,并且给我一行将所有数据正是我正在寻找的......除了一个问题

如果任何表中都不存在记录,而不是忽略它,或者只是给我该表的空白/空值 - 查询失败并且我没有得到任何结果

我真的很感激任何想法

TIA

【问题讨论】:

  • 如果这是您的数据库,那么您需要重新设计它。如果它是由其他人设计的,请拿走他们的键盘并给他们一本有关关系设计的书。

标签: sql sql-server-2008 join natural-join


【解决方案1】:

以下应该也可以工作......

select * 
from (select RefID = @RefID) x
left join Table1 t1 on t1.RefID = x.RefID
left join Table2 t2 on t2.RefID = x.RefID
left join Table3 t3 on t3.RefID = x.RefID
left join Table4 t4 on t4.RefID = x.RefID
left join Table5 t5 on t5.RefID = x.RefID
left join Table6 t6 on t6.RefID = x.RefID
left join Table7 t7 on t7.RefID = x.RefID
left join Table8 t8 on t8.RefID = x.RefID
left join Table9 t9 on t9.RefID = x.RefID
left join Table10 t10 on t10.RefID = x.RefID
left join Table11 t11 on t11.RefID = x.RefID
left join Table12 t12 on t12.RefID = x.RefID

【讨论】:

    【解决方案2】:

    意识到前两个想法不对:

    Select
      *
    From (
      Select 
        @RefID RefID
      ) a
        Left Outer Join
      Table1
        On a.RefID = Table1.RefID
      Table2 
        On a.RefID = Table2.RefID
        Left Outer Join
      Table3
        On a.RefID = Table3.RefID
        Left Outer Join
      Table4
        ...
        Left Outer Join
      Table12
        On a.RefID = Table12.RefID
    

    如果您不希望在开始时使用额外的 RefID,则将 * 替换为 Table1.*, Table2.*, ...

    【讨论】:

    • 谢谢劳伦斯,但同样的问题
    • @SQLBeginner 对不起,也有语法错误,认为这已经解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2018-08-27
    • 2015-06-01
    • 2018-10-25
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多