我正在尝试使用连接来尝试从表中访问数据。我获得了A中主键的信息,并希望从X中检索信息。有两种方法可以到达X,一种是通过B,另一种是通过C.我选择哪条路径来自A中的一列我尝试创建一个使用CASE WHEN的sql语句,并以这种方式将表连接到FROM语句:
X - 连接 - B - 右外连接 - A - 左外连接 - C - 连接 - X
但是sql告诉我,我不能在两端加入同一个表。我使用外连接,因为A要么连接到B或C,要么不连接两者。
基本上,我需要从X检索数据,但是使用不同的密钥访问X,具体取决于A中列中的路径。
答案 0 :(得分:1)
你应该使用这样的查询:
SELECT X.*
FROM A
LEFT JOIN B ON B.A_id = A.id
LEFT JOIN C ON C.A_id = A.id
LEFT JOIN X ON X.id = IF(A.path = 'B', B.X_id, C.X_id)
WHERE A.id = <numeric_id>;
我使用这些数据在MySQL上测试了这个查询:
表A:
------ ------ | id | path | ------ ------ | 1 | B | | 2 | B | | 3 | C | | 4 | C | ------ ------
表B:
------ ------ | A_id | X_id | ------ ------ | 1 | 9 | | 2 | 8 | ------ ------
表C:
------ ------ | A_id | X_id | ------ ------ | 3 | 7 | | 4 | 6 | ------ ------
表X:
------ ------- | id | value | ------ ------- | 1 | 10 | | 2 | 20 | | 3 | 30 | | 4 | 40 | | 5 | 50 | | 6 | 60 | | 7 | 70 | | 8 | 80 | | 9 | 90 | ------ -------
如果删除WHERE子句和SELECT A.id,B.X_id,C.X_id,X。*,您将得到以下结果,这将确认哪个表是X的实际路径:
-------- -------- -------- -------- --------- | A.id | B.X_id | C.X_id | X.id | X.value | ------ ------ ------ ------ ------- --------- | 1 | 9 | NULL | 9 | 90 | | 2 | 8 | NULL | 8 | 80 | | 3 | NULL | 7 | 7 | 70 | | 4 | NULL | 6 | 6 | 60 | -------- -------- -------- -------- ---------
希望它适合你!
答案 1 :(得分:0)
如果你选择这两个路径,这是可行的:
SELECT ....
FROM A
LEFT JOIN B ON A.bkey = B.bkey
LEFT JOIN X as XB ON B.xkey = XB.xkey
LEFT JOIN C ON A.ckey = C.ckey
LEFT JOIN X as XC ON C.xkey = XC.xkey
然后,如果您只想要(例如)X中的字段1,那么您可以使用如下函数:
SELECT ISNULL(XB.field1, XC.field1)...
或者其他一些
答案 2 :(得分:0)
您还可以执行UNION或UNION ALL查询(如果两个表互斥)
Select a.field1, b.field2
from tableA a
join tableb b on a.table1id - b.table1id
Union all
Select a.field1, c.field2
from tableA a
join tablec c on a.table1id - c.table1id