【问题标题】:(SQL) Query Results on one row(SQL) 单行查询结果
【发布时间】:2016-04-08 08:25:16
【问题描述】:

所以我有两个表,分别命名为“问题”和“答案”

我为这两个表做了一个 INNER JOIN

SELECT Questions.ID, Questions.QText, Answers.AText
FROM Questions INNER JOIN Answers
ON Questions.ID=Answers.QuestionID;

结果如下所示: 但是,您可以清楚地看到,该问题每次显示 4 次,其中一个答案。

现在我的问题是:是否可以将结果放在一行中,由

组成

[ID] - [问题] - [Answer1] - [Answer2] - [Answer3] - [Answer4]

【问题讨论】:

  • 为什么要将它们放在 1 行?我很难相信这样做会解决任​​何问题,以免造成一些问题。
  • 以及如何:)?我看了看,不知道怎么用。 @AbdulRasheed
  • 将它放在一行的问题是它使数据更难处理,因为现在列数是动态的。如果您有 1 个问题有 2 个答案,而另一个问题有 10 个答案怎么办?那么有 2 个答案的那个也将有 8 个“空”答案。
  • @wvdz 我需要在 C# 中使用此查询,以便在一行中获取包含所有答案的问题。之后我处理它以将其用作 API
  • @wvdz 别担心,每个问题都有 4 个答案

标签: sql-server database sql-server-2014-express


【解决方案1】:

对 CSV 使用 CROSS APPLY。不要内联,那么你需要一个分组......

SELECT q.ID, q.QText, Answers = STUFF(x.csv, 1, 1, '')
FROM Questions q
CROSS APPLY
    (
    SELECT
        '-' + a.Atext
    FROM
        Answers a
    WHERE
        a.QuestionID = q.ID
    FOR XML PATH ('')
    ) x (csv)

【讨论】:

  • 第一个 FROM 带有红色下划线 :) “关键字 FROM 附近的语法不正确”
【解决方案2】:

您可以将此查询用于枢轴:

SELECT QID, QText, [1], [2], [3], [4]
FROM (SELECT Q.ID AS QID, A.ID AS AID, Q.QText, A.AText FROM Questions AS Q 
INNER JOIN Answers AS A ON Q.ID = A.QuestionID) QA
PIVOT
(
    MAX(AText)
    FOR AID
    IN ([1], [2], [3], [4])
) AS PV

但是:您必须为答案表使用组合主键。 使用此数据透视表,答案 ID 每次都必须为 1、2、3、4。否则你得不到你的答案。 FOR AID 声明,使用哪一列。 否则,您可以在名为“AnswerNr”或类似名称的答案中添加一列。在此列中,您将 1 到 4 作为答案并将查询更改为:

SELECT QID, QText, [1], [2], [3], [4]
FROM (SELECT Q.ID AS QID, ->A.AnswerNr<-, Q.QText, A.AText FROM Questions AS Q 
INNER JOIN Answers AS A ON Q.ID = A.QuestionID) QA
PIVOT
(
    MAX(AText)
    FOR ->AnswerNr<-
    IN ([1], [2], [3], [4])
) AS PV

【讨论】:

  • 但我认为不可能有重复的主键?
  • 确实如此。这就是您需要组合主键的原因。您需要将列 IDQuestionID 设置为主键。这样,组合 ID + QuestionID 必须是唯一的。
  • 啊,好的。我会尝试并给你一个反馈
  • 好的,经过长时间的尝试和错误,我明白了!我添加了一个名为 ID2 的 ner 行,它执行您所描述的操作。它有效:imgur.com/RJBHwvt
  • 很高兴听到这对您有所帮助:)
【解决方案3】:

要在单行上获得所有答案的问题,请使用COALESCE

DECLARE @Answer VARCHAR(8000) 
SELECT Questions.ID, Questions.QText, @Answer = COALESCE(@Answer + ', ', '') + AText
FROM Questions INNER JOIN Answers ON Questions.ID=Answers.QuestionID
WHERE AText IS NOT NULL

如果您使用的是 SQL Server 2005,则可以使用 FOR XML PATH 命令。

SELECT Questions.ID, Questions.QText,
       (STUFF((SELECT CAST(', ' + [AText] AS VARCHAR(MAX)) 
               FROM Answers 
               WHERE Questions.ID = Answers.QuestionID
         FOR XML PATH ('')), 1, 2, '')) AS Answers
 FROM Questions

【讨论】:

  • 我认为这行不通。至少需要有一个分组。
  • @wvdz 使用COALESCE,你不想分组和所有
  • 使用合并的意义何在?第一个值永远不能为空,对吧?
  • @VigneshKumar 错误是德语。这是错误141。如果您还想看,请看这里:imgur.com/Tc28kU0
  • 您本可以自己搜索该错误并为我们发布英文翻译。 A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations
猜你喜欢
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多