我想找出一个复杂数据结构的sql语句

时间:2013-03-21 20:50:53

标签: sql

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

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

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

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

3 个答案:

答案 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