【问题标题】:How do I get SQL query with join and using STUFF and FOR XML PATH be sorted correctly如何使用连接获取 SQL 查询并使用 STUFF 和 FOR XML PATH 正确排序
【发布时间】:2016-07-15 11:34:56
【问题描述】:

我有一个每个键有一行的主表和一个每个键有很多行的详细表,其中一个序列字段有一个描述字段,我需要连接在一起并为每个键创建一行。我的代码可以很好地执行此操作,但详细数据行没有以正确顺序连接的数据。数据以 Excel 电子表格的形式提供给我,我使用导入向导将数据添加到数据库中。由于详细数据中的顺序不正确,我添加了一个子选择来按键和序列号对数据进行排序,该序列号是 STUFF WITH XML PATH 的输入。我仍然以错误的顺序获取数据。如果我先对电子表格中的数据进行排序,然后将其加载到数据库中,它就可以正常工作。我真的需要它动态工作,因为我想将它分发给我的团队,我们可以将它用于不同的表。关于为什么带有 STUFF FOR XML PATH 的子选择不起作用的任何想法?我怎样才能做我需要的?

这是我的代码:

SELECT pic, pisc, piin
    , STUFF((SELECT ' ' + P.PIIDTA FROM PI115AP P
    Where P.PIC =B.PIC
    and P.PISC = B.PISC
    and P.PIIN = B.PIIN FOR XML PATH(''), type
    ).value('.', 'nvarchar(max)'),1,1,'') As CombinedDetail
    From 
    ( select TOP 100 PERCENT
        pic, pisc, piin, piisn, piidta
     from PI115AP
    order by pic, pisc, piin, piisn) B
    Group By B.PIC, B.pisc, B.piin

谢谢!

【问题讨论】:

  • 能否请您展示一下您目前提供的查询是什么以及您的预期输出是什么。
  • #TheGameiswar - 只有在连续行之间有行时才会出现此问题。详细数据超过 15,000 行,我和
  • 对不起#TheGameiswar - 只有在连续行之间有行时才会出现此问题。例如,我可以拥有 200 072 00002 1 个 PERM。按; 7 牢不可破的按钮 e01 006 00003 1 SOME TEXT 更多行... 200 072 00002 2 FRONT;两个 POCKETS,一个 FALSE 和更多行组合的数据将具有 seq 3、seq1、seq5,这样排序。结果应该是 seq 1 数据,seq2 数据,依此类推。我在添加评论上的空间有限,所以我已经浓缩了这一点,我认为这是有道理的。
  • 您能否提供测试脚本来创建和加载与当前和预期输出一起使用的表?

标签: sql sql-server tsql for-xml-path


【解决方案1】:

您有很多不合适的部分,无法按您希望的方式工作。您的 FOR XML 不是您想要的顺序,因为子查询没有 order by。实际结果集也不是您想要的顺序,因为主查询没有排序依据。我不太明白 B 子查询的意义。使用 top 时,top 不会对实际结果进行排序,它只是定义要检索的行。

很确定你想要更多这样的东西。

SELECT pic
    , pisc
    , piin
    , STUFF((SELECT ' ' + P.PIIDTA 
            FROM PI115AP P
            Where P.PIC = B.PIC
                and P.PISC = B.PISC
                and P.PIIN = B.PIIN 
            order by p.pic
                , p.pisc
                , p.piin
                , p.piisn
            FOR XML PATH(''), type
    ).value('.', 'nvarchar(max)'),1,1,'') As CombinedDetail
From PI115AP B
Group By B.PIC
    , B.pisc
    , B.piin
order by b.pic
    , b.pisc
    , b.piin

【讨论】:

  • #Sean Lange,感谢您的回复。我确实有一个订单 y in by sub select。这是子查询: select TOP 100 PERCENT pic, pisc, piin, piisn, piidta from PI115AP order by pic, pisc, piin, piisn 你的代码给了我以下错误:Msg 8127, Level 16, State 1, Line 24 ORDER BY 子句中的“PI115AP.PIISN”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
  • 您的 STUFF 子查询没有 order by。我实际上无法测试我发布的查询,因为我没有什么可处理的。我编码了那个盲人。
  • #Sean Lange,stuff 中的子查询不能有 order by,因为 piisn 不在 select 上,不能在。我需要将数据连接到其他三个字段级别。我没有得到的是子查询(select TOP 100 PERCENT pic, pisc, piin, piisn, piidta from PI115AP order by pic, pisc, piin, piisn)以正确的顺序返回数据。我虽然这是 STUFF 查询的提要,但 STUFF 的顺序不正确。
  • 不,不会按该顺序返回这些结果。 select * from (select top 100 percent * from table order by)x. order by 仅确定将出现哪些行。如果行是按这个顺序排列的,那是偶然的。确保订单的唯一方法是在您没有的最终查询中。如果你想以某种方式订购你的东西,你也必须订购该查询。只需尝试在用于内容的子查询中添加顺序。这就是你遇到的问题的症结所在。
  • 我仍然对如何说 order by 确实按顺序返回数据感到困惑。这不是 order by 子句的目的吗?我们在 select 语句中一直使用 order by 来按我们想要的顺序获取数据。我也很困惑,如果表按排序顺序,这工作正常,但如果我在子查询中排序,它不会。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2012-12-16
  • 2019-05-26
相关资源
最近更新 更多