[英]Unable to merge two tables using join or union
这些是我的表: SELECT * FROM TableA
和SELECT * FROM TableB
Table A Table B
+-------+------+ +-------+------+
| FileA | StepA| | FileB | StepB|
+-------+------+ +-------+------+
| 001 | 1 | | 001 | 1 |
| 001 | 2 | | 001 | 2 |
| 001 | 3 | | 001 | 3 |
| 001 | 4 | | 002 | 1 |
| 001 | 5 | | 002 | 2 |
| 002 | 1 | | 002 | 3 |
| 002 | 2 | | 003 | 1 |
| 002 | 3 | +-------+------+
| 002 | 4 |
| 002 | 5 |
| 004 | 1 |
| 004 | 2 |
| 004 | 3 |
| 004 | 4 |
| 004 | 5 |
+-------+------+
我的结果:
SELECT * FROM TableA AS TA LEFT JOIN TableB AS TB ON TA.FileA != TB.FileB GROUP BY TA.FileA ORDER BY TA.StepA ASC
+-------+------+-------+------+
| FileA | StepA| FileA | StepB|
+-------+------+-------+------+
| 001 | 1 | 001 | 1 |
| 001 | 2 | 001 | 1 |
| 001 | 3 | 001 | 1 |
| 001 | 4 | 001 | 1 |
| 001 | 5 | 001 | 1 |
+-------+------+-------+------+
但这是我的预期结果:
+-------+------+-------+------+
| FileA | StepA| FileB | StepB|
+-------+------+-------+------+
| 001 | 1 | 001 | 1 |
| 001 | 2 | 001 | 2 |
| 001 | 3 | 001 | 3 |
| 001 | 4 | null | null |
| 001 | 5 | null | null |
| 002 | 1 | 002 | 1 |
| 002 | 2 | 002 | 2 |
| 002 | 3 | 002 | 3 |
| 002 | 4 | null | null |
| 002 | 5 | null | null |
| null | null | 003 | 1 |
| 004 | 1 | null | null |
| 004 | 2 | null | null |
| 004 | 3 | null | null |
| 004 | 4 | null | null |
| 004 | 5 | null | null |
+-------+------+-------+------+
是否可以使用joins或union进行这些操作,以便获得这些输出?
我认为这些SQL对您有用。
SELECT * FROM (
SELECT * FROM tablea AS TA LEFT JOIN tableb AS TB
ON TA.FileA = TB.FileB AND TA.stepA= TB.stepB
UNION
SELECT * FROM tablea AS TA RIGHT JOIN tableb AS TB
ON TA.FileA = TB.FileB AND TA.stepA= TB.stepB ) a
ORDER BY FileA, stepA,fileb ASC
谢谢。
如果您确实想以此方式对值进行排序,则可以在子查询上使用coalesce():
SELECT
sub.`FileA`,
sub.`StepA`,
sub.`FileB`,
sub.`StepB`
FROM
(
SELECT
ta.`FileA`,
ta.`StepA`,
tb.`FileB`,
tb.`StepB`,
coalesce(ta.`FileA`, tb.`FileB`) AS `File`,
coalesce(ta.`StepA`, tb.`StepB`) AS `Step`
FROM
`TableA` ta
LEFT OUTER JOIN `TableB` tb ON (
ta.`FileA` = tb.`FileB`
AND ta.`StepA` = tb.`StepB`
)
UNION
SELECT
ta.`FileA`,
ta.`StepA`,
tb.`FileB`,
tb.`StepB`,
coalesce(ta.`FileA`, tb.`FileB`) AS `File`,
coalesce(ta.`StepA`, tb.`StepB`) AS `Step`
FROM
`TableA` ta
RIGHT OUTER JOIN `TableB` tb ON (
ta.`FileA` = tb.`FileB`
AND ta.`StepA` = tb.`StepB`
)
) sub
ORDER BY
sub.`File` ASC,
sub.`Step` ASC
有关COALESCE的更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.