Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想找出一个复杂数据结构的sql语句_Sql - Fatal编程技术网

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

我想找出一个复杂数据结构的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列中的路径。如

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

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

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


基本上,我需要从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而不是存储过程?如果可能,您尝试了哪些实际代码,以及您使用的是什么数据库。语法因数据库而异。这听起来像是对存储过程的一种相当恰当的使用。是否要求您使用单一选择而不是存储过程?