1

我正在尝试通过使用联接来访问表中的数据。我得到了 A 中主键的信息,并想从 X 中检索信息。有两种方法可以到达 X,一种是通过 B,另一种是通过 C。我选择哪条路径是从 A 中的列决定的. 我尝试创建一个使用 CASE WHEN 的 sql 语句,并以这种方式使用 FROM 语句连接表:

X - 连接 - B - 右外连接 - A - 左外连接 - C - 连接 - X

但是sql告诉我我不能在两端加入同一个表。我使用外连接是因为 A 将连接到 B 或 C,但不能同时连接到两者。

基本上,我需要从 X 中检索数据,但是使用不同的键访问 X,具体取决于 A 中的列中认为哪个路径。

4

3 回答 3

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:

------ ------
| 编号 | 路径 |
 ------ ------
| 1 | 乙|
| 2 | 乙|
| 3 | C |
| 4 | C |
 ------ ------

表 B:

------ ------
| A_id | X_id |
 ------ ------
| 1 | 9 |
| 2 | 8 |
 ------ ------

表 C:

------ ------
| A_id | X_id |
 ------ ------
| 3 | 7 |
| 4 | 6 |
 ------ ------

表十:

------ ------
| 编号 | 价值 |
 ------ ------
| 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 的实际路径:

-------- -------- -------- -------- ---------
| 身份证 | B.X_id | C.X_id | X.id | X.值 |
 ------ ------ ------ ------ -------- ---------
| 1 | 9 | 空 | 9 | 90 |
| 2 | 8 | 空 | 8 | 80 |
| 3 | 空 | 7 | 7 | 70 |
| 4 | 空 | 6 | 6 | 60 |
 -------- -------- -------- -------- ---------

希望对你有帮助!

于 2013-03-21T21:21:24.540 回答
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)...

或者一些这样的

于 2013-03-21T21:03:35.820 回答
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 
于 2013-03-21T21:16:06.183 回答