【问题标题】:LEFT JOIN SUBSTITUTE左连接替换
【发布时间】:2017-09-05 10:53:44
【问题描述】:

我有一个表 TOPIC (Article_ID,ROOT_TOPIC_ID,LEVEL,TOPIC_NAME)。 选择结果如下:

我需要转置结果集,但我为每个级别使用多个左连接。

我想要的结果集是这样的:

多个左自连接会降低性能,并且无法在字符串列上进行旋转(不确定)!!

有什么建议吗??

【问题讨论】:

  • 嗨。到目前为止你有什么?无数类似的问题/答案对你没有帮助吗? “使用”是什么意思? “有点像”是什么意思?我们无法读懂我们的想法。请阅读minimal reproducible example 并采取行动。请尽可能使用文本,而不是这些图像和链接。将表格格式化为代码。

标签: sql sql-server pivot left-join transpose


【解决方案1】:

左连接不会阻止您旋转结果。如果性能很差,则可能是连接键的列没有正确或适当地索引。 SQLServer Management Studio 是否会告知您任何缺失的索引?

SELECT
  Article_ID, Root_Topic_ID, [0], [1], [2], [3], [4], [5], [6]
FROM
  (your select query here) src
PIVOT
(
  MAX(Topic_name)
  FOR LEVEL IN ([0], [1], [2], [3], [4], [5], [6])
) pvt

枢轴不会影响原始查询的性能;实际上,根据定义,原始查询必须先运行,然后才能进行旋转。 Pivot 只是您在其他答案中给出的 GROUP/MAX(CASE WHEN) 的另一种格式语法

【讨论】:

    【解决方案2】:

    使用CASE 和条件聚合

    SELECT ArticleID, ROOT_TOPIC_ID, 
       MAX (CASE WHEN level = 0 THEN Topic_name END) as Level0,
       MAX (CASE WHEN level = 1 THEN Topic_name END) as Level1,
       MAX (CASE WHEN level = 2 THEN Topic_name END) as Level2,
       MAX (CASE WHEN level = 3 THEN Topic_name END) as Level3,
       MAX (CASE WHEN level = 4 THEN Topic_name END) as Level4,
       MAX (CASE WHEN level = 5 THEN Topic_name END) as Level5,
       MAX (CASE WHEN level = 6 THEN Topic_name END) as Level6
    FROM Topic
    GROUP BY ArticleID, ROOT_TOPIC_ID
    

    也可以使用子查询,但是在这种情况下条件聚合的性能可能会更好。

    SELECT ArticleID, ROOT_TOPIC_ID, 
       (
           SELECT top 1 Topic_name FROM Topic t WHERE t.ArticleID = Topic.ArticleID AND t.ROOT_TOPIC_ID = Topic.ROOT_TOPIC_ID AND level = 0
       ) as Level0,
       (
           SELECT top 1 Topic_name FROM Topic t WHERE t.ArticleID = Topic.ArticleID AND t.ROOT_TOPIC_ID = Topic.ROOT_TOPIC_ID AND level = 1
       ) as Level1,
       -- an so on
    FROM Topic
    GROUP BY ArticleID, ROOT_TOPIC_ID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2011-11-22
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多