【问题标题】:SQL query to select one of multiple rows from a table用于从表中选择多行之一的 SQL 查询
【发布时间】:2013-10-15 15:09:09
【问题描述】:

我有一个表,其中包含多个特定值的行。这是表结构:

NAME,NUMBER,STATUS,DESC,START_DATE,END_DATE
A,3,X,DetailsOfX,13-10-15,13-10-15
A,2,Y,DetailsOfY,13-10-15,13-10-15
A,2,Z,DetailsOfZ,13-10-15,13-10-15
A,1,X,DetailsOfX,12-10-15,12-10-15

我需要的输出是i.e.

A,3,X,DetailsOfX,13-10-15,13-10-15
A,2,Y,DetailsOfY-DetailsofZ,13-10-15,13-10-15
A,1,X,DetailsOfX,12-10-15,12-10-15

所以基本上我想从一个表中选择两行或多行之一,其中的数据来自两行的列(上面以粗体显示)。下面我尝试使用 JOIN 的查询返回 4 行。

SELECT A.NAME,A.NUMBER,B.STATUS,A.DESC||"-"||B.DESC,A.START_DATE,A.END_DATE
FROM TABLE A
JOIN (SELECT NUMBER,STATUS,DESC,START_DATE,END_DATE FROM TABLE WHERE NAME='A') B
ON A.NAME=B.NAME AND
A.NUMBER=B.NUMBER

有人可以帮我查询可行的查询吗?

谢谢

【问题讨论】:

  • 这取决于您使用的 RDBMS。
  • 在这种情况下,我认为您不需要 JOIN。
  • 后端是AS400
  • 您可能想要添加一个AND A.STATUS <> B.STATUS,否则您将只是自行加入行并最终得到DetailsOfY-DetailsOfY
  • 除了 A 之外,该表还有更多的 NAME 行。添加此 条件会省略所有其他行,但仍然给我 2 行,其中一行正是我想要的。

标签: sql join db2 ibm-midrange db2-400


【解决方案1】:

如果您使用的是 IBM i 7.1(以前称为 OS/400),您应该可以通过两个技巧做到这一点:hierarchical queriesXML functions

请参阅my tutorial under Q: SQL concatenate strings,它解释了如何在 DB2 for i 上执行此操作以合并描述。

GROUP BY 您希望将行合并为一个的任何字段,但所有其他列必须是聚合函数的结果。因此,例如,如果您希望每个名称、数字有一行,但具有不同的 Status、StartDate、EndDate 值,那么您需要说类似min(Status), min(StartDate), max(EndDate) 的内容。最低状态码真的是你要报告的那个吗?

如果您的操作系统是 6.1 版,您可能仍然可以使用传统的 recursive query(或 under v5r4),但您可能需要一个额外的 CTE(或两个?)来连接描述。

【讨论】:

    【解决方案2】:

    你需要使用GROUP BYFOR XML PATH

    SELECT 
      X.NAME, X.NUMBER, X.STATUS,
      STUFF((
        SELECT '-' + [Desc] AS Desc 
        FROM YourTable Y
        WHERE Y.ID = X.ID
        FOR XML PATH(''),TYPE),1,1,'') AS DescValues,
      StartDate,
      EndDate
    FROM YourTable X
    GROUP BY Name, Number, Status, StartDate, EndDate
    

    这是假设您希望在名称、编号、状态、开始日期或结束日期方面的任何差异都使用单独的行。

    另外,这是假设 SQL Server。

    【讨论】:

    • 我在后端有 AS400。不确定这是否有帮助。谢谢。
    • 不,这不适用于 DB2 for i。我们的语法和对 XML 的支持是不同的。 (在 SQL Server 上,您的查询不会在每个描述前加上连字符,无论是否连接?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多