代码之家  ›  专栏  ›  技术社区  ›  whispers

MySQL:UNION是我想要的吗?(将行分解为多行返回)

  •  0
  • whispers  · 技术社区  · 7 年前

    我有一个包含以下列的表:

    id
    first
    last
    institution
    address
    space1_1_value
    space1_2_value
    space2_1_value
    space2_2_value
    space3_1_value
    space3_2_value
    agreement
    

    最后,我想将我的查询导出到电子表格,但我似乎无法得到一个好的工作查询。(因此该职位)

    虽然表中的一个记录/行将具有id、first、last、institution、address、space1\u 1\u值、space1\u 2\u值和协议字段/列的值。。。

    它可能有COL值,也可能没有COL值:

    空格2\u 2\u值 和 空格3\u 1\u值 空格3\u 2\u值

    因此,对于表中的每一行/记录。。

    我想返回以下内容:

    id |第一个|最后一个|机构|地址|空格1|u值|

    如果空格2\u 1\u值中有值,则:

    space2_2_值|协议

    id | first | last | institution | address | space3_1_值|

    总之,每条记录都有上面列出的所有初始COL。我试图按“spaceX\u X\u value”组“分解”每行的返回值。如果不是空的。

    http://www.mysqltutorial.org/sql-union-mysql.aspx

    它说使用UNION垂直附加结果。。

    尝试失败(似乎有些臃肿)……我觉得我可以在每个所需的行/结果中专门选择“static/commons”字段,并合并/选择不同的spaceX\u Xvalue组。

    SELECT * FROM 
    (
        (SELECT first, last, space2_value FROM report WHERE space2_value <> '')
        UNION
        (SELECT first, last, space3_value FROM report WHERE space3_value <> '')
    ) AS results
    

    从下面的评论来看……这是一个工作示例:(只是觉得为每个选择键入相同的cols名称有点多余,比如first、last等)

    SELECT first, last, space1_value as space_value FROM report
    UNION
    SELECT first, last, space2_value as space_value FROM report WHERE space2_value <> ''
    UNION
    SELECT first, last, space3_value as space_value FROM report WHERE space3_value <> ''
    ORDER BY first
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   geof2832    7 年前

    如果不希望自动删除重复行,请考虑使用UNION ALL。

    来自MySQL文档:

    UNION的默认行为是从结果中删除重复行。可选的DISTINCT关键字除了默认关键字之外没有任何效果,因为它还指定了重复行的删除。使用可选的ALL关键字,不会删除重复行,结果包括所有SELECT语句中的所有匹配行。

        2
  •  1
  •   MVG1984    7 年前
    SELECT first, last, space2_value as space_value FROM report WHERE space2_value <> ''
            UNION
    SELECT first, last, space3_value as space_value FROM report WHERE space3_value <> ''
    

        3
  •  0
  •   OLIVER.KOO    7 年前

    使用 unpivot 要使列成为行,请执行以下操作:

    数据: 我创建了一个名为 yourtable

    id          first      last       institution address              space1_1_value space1_2_value space2_1_value space2_2_value space3_1_value space3_2_value agreement
    ----------- ---------- ---------- ----------- -------------------- -------------- -------------- -------------- -------------- -------------- -------------- --------------------
    1           oliver     koo        mac         123 street           1              1              2              3              3              5              agree
    2           mr.derp    herp       carl        sesame street        7              7              NULL           1              4              9              disagree
    

    查询: 然后我执行了这个查询,包括两个 unpivot公司 关系运算符 :

    SELECT id,first, last, institution, address, spacex_1_value , spacex_2_value
    from yourtable
    
    unpivot
    (spacex_1_value for x1 in 
     (space1_1_value, space2_1_value,space3_1_value)
    ) unpvt1
    
    unpivot
    (
    spacex_2_value for x2 in 
     (space1_2_value, space2_2_value,space3_2_value)
    ) unpvt2
    
    WHERE SUBSTRING(x1,6,1) =  SUBSTRING(x2,6,1)
    

    结果:

    id          first      last       institution address              spacex_1_value spacex_2_value
    ----------- ---------- ---------- ----------- -------------------- -------------- --------------
    1           oliver     koo        mac         123 street           1              1
    1           oliver     koo        mac         123 street           2              3
    1           oliver     koo        mac         123 street           3              5
    2           mr.derp    herp       carl        sesame street        7              7
    2           mr.derp    herp       carl        sesame street        4              9
    

    注意:where子句在连接x1(未选定)和x2(未选定)列时至关重要。没有它,我们就无法告诉SQL Server第二组未插入的数据如何与第一组匹配。SQL将进行交叉连接。因此,where子句是筛选不需要的行所必需的。