【问题标题】:Querying all data from multiple tables查询多个表中的所有数据
【发布时间】:2014-02-24 11:46:15
【问题描述】:

所以我有三个表...结构像这样

位置表

LocationID       LocationName

1                Location 1
2                Location 2
3                Location 3

子区域表

SubAreaID       LocationID      SubAreaName
1               1               SubName1
2               1               SubName2
3               2               SubName3
4               2               SubName4

还有一个详细信息表

SubAreaID       LocationID      UserName
1               1               Bob
2               1               Frank
3               2               Jeff
null            3               Dave
  • 每个位置都可以有一个子区域
  • 每个子区域都可以有细节
  • 每个子区域都必须有一个位置
  • 每个细节都可以有一个子区域
  • 每个细节都必须有一个位置

    理想情况下,结果如下所示。我将如何构建查询?

    LOCATION NAME      SUB AREA NAME     USERNAME
    Location 1         SubName1          Bob
    Location 1         SubName2          Frank
    Location 2         SubName3          Jeff
    Location 2         SubName4          null
    Location 3         null              Dave
    

真正让我失望的是空值的可能性

SELECT a.LocationID, a.LocationName, b.SubAreaID, b.SubAreaName, c.UserName
FROM Location a
JOIN SubArea b ON a.LocationID = b.LocationID
FULL JOIN Detail c ON a.LocationID = c.LocationID

但是,这不会产生预期的结果。有什么意见/建议吗?

【问题讨论】:

    标签: sql tsql select join


    【解决方案1】:

    试试这个

    SELECT a.LocID, a.LocName, b.SubAreaID, b.SubAreaName, c.UserName
    FROM Location a
        LEFT JOIN SubArea b ON a.LocID = b.LocID
        OUTER APPLY (SELECT c.UserName 
                 FROM Details c 
                 WHERE a.LocID = c.LocID 
                     AND (c.SubAreaID = b.SubAreaID OR B.SubAreaId IS NULL)
        ) as c
    

    编辑:OUTER APPLY 试试这个查询。

    还可以查看此 [SQL FIDDLE] (sqlfiddle.com/#!3/b4bce/5ce/5) 以获取演示。

    【讨论】:

    • 这很接近。除了为空的子区域外,我得到了所有内容。那就是......任何具有空子区域但位置的“详细信息”
    • @prawn 我已经更新了答案,但是我无法将小提琴添加为链接,所以我添加了 URL。
    【解决方案2】:

    用 'LEFT JOIN' 代替 JOIN 和 FULL JOIN。

    JOIN 要求位置有一个子区域才能显示在结果中。

    FULL JOIN 会从双方获取数据,即使没有匹配值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2015-08-21
      • 1970-01-01
      • 2019-08-24
      • 2018-12-06
      • 2020-12-08
      相关资源
      最近更新 更多