SQL查询基于外键获取

问题描述 投票:0回答:3

我试图从parent and child_address读取数据。但是child_address没有parent_id.Query1 and Query2工作正常。如果我结合错误即将来临。子和其他表中的数据是可选的,只有父将拥有数据所以我使用左连接。请帮我解决这个问题。

表:

create table parent(p_id number,name varchar(5));
create table table1(t1_id number,p_id number,t1_name varchar(5));
create table table2(t2_id number,p_id number,t2_name varchar(5));

create table child(c_id number,p_id number,c_name varchar(5));
create table child_address(ca_id number,c_id number,city varchar(5));

所需字段:

parent.name,table1.name,table2.name,child_address.city

查询1:

select parent.p_id,table1.t1_name,table2.t2_name from parent
left join table1 on parent.p_id = table1.p_id
left join table2 on parent.p_id = table2.p_id;

QUERY2:

select child.p_id,child.c_id,child_address.ca_id,child_address.city from child
left join child_address on child.c_id = child_address.c_id;

组合查询:

select a.*,b.* from (
select * from (
select parent.p_id,table1.t1_name,table2.t2_name from parent
left join table1 on parent.p_id = table1.p_id
left join table2 on parent.p_id = table2.p_id) as a
left join 
select * from (
select child.p_id,child.c_id,child_address.ca_id,child_address.city from child
left join child_address on child.c_id = child_address.c_id) as b  on a.pid = b.pid)
sql sql-server oracle
3个回答
1
投票
select    
  p.name, t1.t1_name, t2.t2_name, ca.city 
from   
  parent p   
  left join table1 t1 on t1.p_id = p.p_id   
  left join table2 t2 on t2.p_id = p.p_id   
  left join child  c  on c.p_id  = p.p_id   
  left join child_address ca on ca.c_id = c.c_id

1
投票

1.pid而不是子查询上的p_id

2.尝试删除qazxsw poi和qazxsw poi子查询后的qazxsw poi关键字如下

你可以试试。

AS

FROM


1
投票

你在这里缺少一个左括号:JOIN。它必须是:SELECT * FROM ( SELECT a.name, a.t1_name, a.t2_name, b.city FROM ( SELECT parent.p_id , parent.name, table1.t1_name, table2.t2_name FROM parent LEFT JOIN table1 ON parent.p_id = table1.p_id LEFT JOIN table2 ON parent.p_id = table2.p_id ) a LEFT JOIN ( SELECT child.p_id , child.c_id , child_address.ca_id , child_address.city FROM child LEFT JOIN child_address ON child.c_id = child_address.c_id ) b ON a.p_id = b.p_id ) a1; 而不是。

无论如何,你的查询有点太复杂了。 SQLFiddle可以写成left join select * from。所以这应该只是:

left join (select * from

当然你可以用(select * from (<query>))条款做同样的事情:

(<query>)
© www.soinside.com 2019 - 2024. All rights reserved.