我对SQL很新,我坚持这个查询。所以我有一个表包含同一个表的两个外键。我要求的结果只是赢得了使用连接。我在这里创建了sqlfiddle
虽然sqlfiddle在MySQL上,但我在Oracle上遇到了同样的问题。
这两个表格如下:
表wedding
wedding_id|civil_union_side_a|civil_union_side_b
________________________________________________
1 |Smith |Jones
表guest
guest_side|guest_name
_____________________
Smith |John
Smith |Jill
Smith |Mark
Jones |Jane
Jones |David
Jones |Mel
现在我需要的结果应该是这样的:
wedding_id|civil_union_side_a|civil_union_side_b|guest_side|guest_name
_______________________________________________________________________
1 |Smith |Jones |Smith |John
1 |Smith |Jones |Smith |Jill
1 |Smith |Jones |Smith |Mark
1 |Smith |Jones |Jones |Jane
1 |Smith |Jones |Jones |David
1 |Smith |Jones |Jones |Mel
我基本上使用union:
select *
from wedding
inner join guest guest_side_a
on wedding.civil_union_side_a = guest_side_a.guest_side
union all
select *
from wedding
inner join guest guest_side_b
on wedding.civil_union_side_b = guest_side_b.guest_side
但是,当我尝试加入表格时,我会得到一个笛卡尔积。这是我的查询:
select *
from wedding wedding
inner join guest guest_side_a
on wedding.civil_union_side_a = guest_side_a.guest_side
inner join guest guest_side_b
on wedding.civil_union_side_b = guest_side_b.guest_side;
和我得到的错误结果(9行而不是6行):
wedding_id|civil_union_side_a|civil_union_side_b|guest_side|guest_name|guest_side1|guest_name1
_______________________________________________________________________________________________
1 |Smith |Jones |Smith |John |Jones |Jane
1 |Smith |Jones |Smith |Jill |Jones |Jane
1 |Smith |Jones |Smith |Mark |Jones |Jane
1 |Smith |Jones |Smith |John |Jones |David
1 |Smith |Jones |Smith |Jill |Jones |David
1 |Smith |Jones |Smith |Mark |Jones |David
1 |Smith |Jones |Smith |John |Jones |Mel
1 |Smith |Jones |Smith |Jill |Jones |Mel
1 |Smith |Jones |Smith |Mark |Jones |Mel
有没有办法通过join
而不是union
获得所需的结果?
答案 0 :(得分:2)
虽然通常不建议在*
列表中使用SELECT
,但以下内容至少应该为您提供一个示例:
SELECT wedding.*, guest.*
FROM guest
RIGHT JOIN wedding
ON guest.guest_side = civil_union_side_a
OR guest.guest_side = civil_union_side_b;