我想找出一个复杂数据结构的sql语句
我正在尝试使用联接从表中访问数据。我得到了a中主键的信息,希望从X检索信息。有两种方法可以到达X,一种是通过B,另一种是通过C。我选择的路径由a中的一列决定。我尝试创建一个sql语句,该语句使用CASE WHEN,并以这种方式将表与from语句连接起来: X-连接-B-右外连接-A-左外连接-C-连接-X 但是sql告诉我不能在两端连接同一个表。我使用外部连接,因为A将要么连接到B,要么连接到C,但不能同时连接到两者我想找出一个复杂数据结构的sql语句,sql,Sql,我正在尝试使用联接从表中访问数据。我得到了a中主键的信息,希望从X检索信息。有两种方法可以到达X,一种是通过B,另一种是通过C。我选择的路径由a中的一列决定。我尝试创建一个sql语句,该语句使用CASE WHEN,并以这种方式将表与from语句连接起来: X-连接-B-右外连接-A-左外连接-C-连接-X 但是sql告诉我不能在两端连接同一个表。我使用外部连接,因为A将要么连接到B,要么连接到C,但不能同时连接到两者 基本上,我需要从X检索数据,但X是使用不同的键访问的,这取决于a列中的路径。如
基本上,我需要从X检索数据,但X是使用不同的键访问的,这取决于a列中的路径。如果您选择两种路径,这是可行的,如下所示:
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
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>;
然后,如果您只想从X中取出字段1,那么您可以使用如下函数:
SELECT ISNULL(XB.field1, XC.field1)...
或者一些类似的如果您选择以下两种路径,这是可行的:
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
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>;
然后,如果您只想从X中取出字段1,那么您可以使用如下函数:
SELECT ISNULL(XB.field1, XC.field1)...
或者,如果两个表相互排斥,您还可以执行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
如果两个表互斥,还可以执行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
您应该使用如下查询:
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
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 |
------ ------
表十:
------ -------
| id | value |
------ -------
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 9 | 90 |
------ -------
如果删除WHERE子句并选择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 |
-------- -------- -------- -------- ---------
希望它对你有用 您应该使用如下查询:
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
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 |
------ ------
表十:
------ -------
| id | value |
------ -------
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 9 | 90 |
------ -------
如果删除WHERE子句并选择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 |
-------- -------- -------- -------- ---------
希望它对你有用 如果可能的话,您尝试了哪些实际代码,以及您使用的是什么数据库。语法因数据库而异。这听起来像是对存储过程的一种相当恰当的使用。是否要求您使用单个select而不是存储过程?如果可能,您尝试了哪些实际代码,以及您使用的是什么数据库。语法因数据库而异。这听起来像是对存储过程的一种相当恰当的使用。是否要求您使用单一选择而不是存储过程?