【问题标题】:How to fetch rows in column manner in sql?如何在sql中以列方式获取行?
【发布时间】:2012-01-21 22:17:23
【问题描述】:

我的表中有一条记录,例如

memberId    PersonId    Year
4057        1787         2
4502        1787         3

我想要这样的查询的结果

memberId1   MemberId2   PersonId
4057        4502        1787

如何编写查询??

【问题讨论】:

    标签: mysql sql sql-server sql-server-2008 sql-server-2005


    【解决方案1】:

    如果您想要每个 person_id 的所有成员 ID,您可以使用 [for xml path] 语句(功能强大) 将所有 memberId 连接到一个字符串中

    select distinct PersonId
           , (select ' '+cast(t0.MemberId as varchar)
              from table t0 
              where t0.PersonId=t1.PersonId
              for xml path('')
             ) [Member Ids]
    from table t1
    

    导致:

    PersonId   Members Ids
    1787      ' 4057 4502'
    

    如果您真的需要单独的列,并且成员 ID 数量不受限制,请考虑使用 一个 PIVOT 表,但使用起来要复杂得多

    【讨论】:

      【解决方案2】:

      下面是一个关于如何直接在 SQL 中执行此操作的示例。请注意,还有很大的优化空间,但这个版本应该相当快,尤其是如果您有关于 PersonID 和年份的索引。

      SELECT DISTINCT PersonID,
                      memberId1 = Convert(int, NULL),
                      memberId2 = Convert(int, NULL)
        INTO #result
        FROM myTable
       WHERE Year IN (2 , 3)
      
      CREATE UNIQUE CLUSTERED INDEX uq0_result ON #result (PersonID) 
      
      UPDATE #result 
         SET memberId1 = t.memberId
        FROM #result upd
        JOIN myTable t
          ON t.PersionId = upd.PersonID
         AND t.Year = 2
      
      UPDATE #result 
         SET memberId2 = t.memberId
        FROM #result upd
        JOIN myTable t
          ON t.PersionId = upd.PersonID
         AND t.Year = 3
      
      SELECT * FROM #result 
      

      【讨论】:

      • 您不需要为此使用聚集索引。一个普通的就可以了,而且可能会更快。
      • 你让我很好奇,我对一些样本数据做了一些测试(在大型数据库上用 object_id 替换了 PersonID,用 user_type_id 替换了 memberId,用 sys.columns 替换了 myTable。(返回大约 2000 条记录)。结果它对查询计划没有任何影响,而且统计时间也几乎相同。虽然我同意集群时索引的创建会稍微慢一些(更多 IO),但根据我的经验,之后通常会更快(如果索引合适!)因为不需要书签查找,也因为 MSSQL 似乎根本不喜欢堆。恕我直言
      • 当您需要以特定顺序返回结果集时,使用聚集索引(帮助)。但是您只能在表上拥有一个这样的索引。现在声明 personID 应该是该列还为时过早。即使不了解此应用程序的更多信息,我也可以说必须返回按任意 ID(例如 personID)排序的结果集是非常罕见的。在我知道哪一列是按顺序排序的列之后,我只会创建一个聚集索引。如果我不知道那是哪一列,我就不会使用聚集索引并将其留作以后的选择。
      • 它在你的测试中并没有更快,因为你没有对结果进行排序,所以聚集索引什么都不做,它实际上减慢了速度(如果你有插入和更新),因为你必须维护物理表的顺序(尽管 ID 列始终按顺序排列,因此此处不适用)。我对 mssql 和 heaps 一无所知,但如果速度变慢会很奇怪。
      【解决方案3】:

      不要在 SQL 中这样做。充其量你可以尝试:

      SELECT table1.memberId memberId1, table2.memberId MemberId2, PersonId
      FROM table table1 JOIN table table2 USING (PersonId)
      

      但是,如果您为一个人拥有超过 2 个成员,它就不会如您所愿。 (它将返回所有可能的组合。)

      【讨论】:

        【解决方案4】:

        不要在查询中执行此操作,而是在应用程序层执行此操作。

        【讨论】:

        • 怎么做?你能解释一下吗?
        • 显然这取决于所涉及的记录数。我强烈建议不要在大记录集的应用层这样做。
        • 我不同意,我认为您可以使用它并看看什么有效,多久完成一次等
        • @vivek - 您需要指定您使用的语言
        猜你喜欢
        • 2022-08-13
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        相关资源
        最近更新 更多