【问题标题】:What kind of SQL join do I need to compress a One to Many relationship into the same view row?我需要什么样的 SQL 连接才能将一对多关系压缩到同一视图行中?
【发布时间】:2011-02-02 10:59:37
【问题描述】:

编辑:这不是动态输出,输出视图结构是固定的。

我正在尝试创建一个 SQL Server 视图,该视图为每个用户显示单个固定列行,并将关联的一对多表展平到该行中。

虽然关联表具有一对多关系,但输出表结构仅限于该表的 4 个元素。

我的表结构是这样的:

User (Id, FirstName, LastName)
Assessment (Id, Date, Location, User_Id)
Topics (Id, Topic, Assessment_Id)

评估通过 User_Id(一 2 一)加入到用户,主题通过 Assessment_Id 加入评估。

所以,如果我有三个评估主题,我希望视图看起来像:

User_Id | FirstName | LastName | Date   | Location | Topic1 | Topic2  | Topic3 | Topic4 |
    1   |  dave     |  toby    | 2/2/11 | In situ  | apples | pears   | lemons | NULL   |

我当前的 SQL 如下所示:

SELECT  User.Id, User.FirstName, User.LastName, Assessment.Date, Assessment.Location, Topic.Topic
FROM   User LEFT OUTER JOIN
           Assessment INNER JOIN
              Topic ON Assessment.Id = Topic.Assessment_Id ON 
                  User.Id = Assessment.User_Id

但这会为每个关注点返回一行 - 它不会将它们压缩到一行。我玩过几个不同的连接,但无法获得我想要的行为。

是否可以在视图中执行此操作?
我需要做什么才能实现它??

谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2005 join


    【解决方案1】:

    没有这样的JOIN。 SQL 具有固定的列输出:因此您不能添加任意数量的列。无论是视图、直接视图还是存储过程中的视图。

    有两个主要选项

    1. 连接many rows into one column,这是 SO 上的一个热门问题。 One random solution using XML PATH

    2. 使用dynamic SQL to add a column per row in a stored procedure

    注意:PIVOT 也是固定列输出

    编辑:最多 4 个子行

    SELECT 
      P.col1, P.col2,
      C1.col1 AS Topic1,
      C2.col1 AS Topic2,
      C3.col1 AS Topic2,
      C4.col1 AS Topic4
    FROM
      Parent P
      LEFT JOIN
      Child C1 ON P.Key = C1.FKey AND C1.ID = 1
      LEFT JOIN
      Child C2 ON P.Key = C2.FKey AND C2.ID = 2
      LEFT JOIN
      Child C3 ON P.Key = C3.FKey AND C3.ID = 3
      LEFT JOIN
      Child C4 ON P.Key = C4.FKey AND C4.ID = 4
    

    您也可以使用 PIVOT,但我更喜欢更简单的自联接。

    【讨论】:

    • 我担心有人会说...鉴于主题的数量固定为最多四个,我可以生成一个视图来满足我的要求。数据将被固定包使用,我现在正在研究动态 SQL 选项,谢谢。
    • 干杯,看起来不错。有什么办法可以绕过硬编码的 id??
    • 如果我定义了一个 SEQ 列,并将其定义为 1...4?
    • @lainie:是的,您需要一些东西来识别子行。检查 PIVOT 以防它更好地为您避免添加列
    • @lainie:我想你可能想看看ROW_NUMBER()msdn.microsoft.com/en-us/library/ms186734.aspx
    【解决方案2】:

    查看 PIVOT 表功能 - 例如http://www.help-sql.info/27/9/610208.htmlhttp://blog.sqlauthority.com/2008/05/22/sql-server-pivot-table-example/

    尽管在编写 PIVOT 之前您需要知道 AssessmentId

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2020-01-16
      • 2012-08-08
      相关资源
      最近更新 更多