我有一个包含以下列的表:
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_1_value,space1_2_value和agreement fields / cols ...
的值它可能有也可能没有cols的值:
space2_1_value space2_2_value 和 space3_1_value space3_2_value
我不确定解释它..但或多或少,..我想将表中的每个记录/行分解为1-3'行'(缺少更好的解释)
所以对于表中的EACH ROW / RECORD ..
我想返回以下内容:
id |第一个|最后|机构|地址| space1_1_value | space1_2_value |协议
如果space2_1_value中有值,则:
id |第一个|最后|机构|地址| space2_1_value | space2_2_value |协议
如果space3_1_value中有值,则:
id |第一个|最后|机构|地址| space3_1_value | space3_2_value |协议
总结..每个记录都包含上面列出的所有初始列。我试图通过'spaceX_X_value'组来“分解”每行的回报..如果不是空的话。
在这里阅读: http://www.mysqltutorial.org/sql-union-mysql.aspx
它说使用UNION垂直附加结果..
但我在工作时没有得到任何值得的东西。
尝试失败(似乎臃肿)......我觉得我可以在每个所需的行/结果中专门选择'static / commons'字段,并UNION / SELECT不同的spaceX_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
EDIT / UPDATE:
从下面的评论中......这是一个有效的例子:(感觉有点多余,输入相同的cols名称,如first,last..etc for each select)
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
答案 0 :(得分:2)
如果您不想自动删除重复的行,请考虑使用UNION ALL。
来自MySQL文档:
UNION的默认行为是从结果中删除重复的行。可选的DISTINCT关键字除了默认值之外没有任何影响,因为它还指定了重复行删除。使用可选的ALL关键字,不会发生重复行删除,结果包括所有SELECT语句中的所有匹配行。
答案 1 :(得分:1)
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 <> ''
UINION的每个查询中的列名必须相等
答案 2 :(得分:0)
使用 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子句来过滤掉不需要的行。
希望这会有所帮助