我会尽力解释问题并提供示例。
我有两个表(表A和表B),每个表都有三个可用于加入的键。我想执行连接,我想在多个级别执行连接。通过这个,我的意思是如果Key 1在两个表之间匹配,那么加入它。对于不匹配的剩余部分,使用密钥2加入,对于剩余的仍然不匹配,使用密钥3加入。 联接的层次结构顺序很重要。
示例数据:
-----------------------------------------------
| ------ TABLE A ------ | ------ TABLE B ------ |
| KEY 1 | KEY 2 | KEY 3 | KEY 1 | KEY 2 | KEY 3 |
|-------|-------|-------|-------|-------|-------|
ROW 1 | ABC | AAA | BBB | ABC | PPP | QRS |
ROW 2 | DEF | RRR | NNN | XYZ | RRR | NMO |
ROW 3 | HIJ | TTT | NNN | GHI | MMM | QQQ |
ROW 4 | TUV | VVV | LLL | OPQ | UUU | LLL |
ROW 5 | LMN | III | EEE | XYZ | III | JJJ |
ROW 6 | PQR | CCC | OOO | WXY | HHH | DDD |
-----------------------------------------------
因此,如果我在Key 1上开始加入,只有第1行匹配,我完成了这一步。然后,我转到第2行,第2行和第5行将匹配。最后,我转到Key 3,只有第4行匹配。
所以我希望表A和表B的最终数据看起来像:
-----------------------------------------------
| ------ TABLE A ------ | ------ TABLE B ------ |
| KEY 1 | KEY 2 | KEY 3 | KEY 1 | KEY 2 | KEY 3 |
|-------|-------|-------|-------|-------|-------|
ROW 1 | ABC | AAA | BBB | ABC | PPP | QRS | (Key 1)
ROW 2 | DEF | RRR | NNN | XYZ | RRR | NMO | (Key 2)
ROW 5 | LMN | III | EEE | XYZ | III | JJJ | (Key 2)
ROW 4 | TUV | VVV | LLL | OPQ | UUU | LLL | (Key 3)
-----------------------------------------------
我无法弄清楚如何在SQL的 ON 语句中添加条件以进行连接,或者我是否需要进行某种嵌套连接。
非常感谢你的帮助!
PS:示例表看起来像是以相同的顺序排序,但这只是为了便于理解。
答案 0 :(得分:0)
UNION JOIN ON键1相等,JOIN ON键1不等于AND键2相等,JOIN ON键1不相等AND键2不等于AND键3相等。
答案 1 :(得分:0)
这样的东西会返回指定的结果:
SELECT a1.key1 AS a_key1
, a1.key2 AS a_key2
, a1.key3 AS a_key3
, b1.key1 AS b_key1
, b1.key2 AS b_key2
, b1.key3 AS b_key3
, '(key 1)' AS `match`
FROM tablea a1
JOIN tableb b1
ON b1.key1 = a1.key1
UNION ALL
SELECT a2.key1
, a2.key2
, a2.key3
, b2.key1
, b2.key2
, b2.key3
, '(key 2)' AS match
FROM tablea a2
JOIN tableb b2
ON b2.key1 <> a2.key1
AND b1.key2 = a2.key2
UNION ALL
SELECT a3.key1
, a3.key2
, a3.key3
, b3.key1
, b3.key2
, b3.key3
, '(key 3)' AS match
FROM tablea a3
JOIN tableb b3
ON b3.key1 <> a3.key1
AND b3.key2 <> a3.key2
AND b3.key3 = a3.key3