sql为一个表有两个外键到同一个表导致笛卡尔积

时间:2015-05-23 04:56:46

标签: mysql sql database oracle

我对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获得所需的结果?

1 个答案:

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