Sql 通过查看第三个表来了解两个表是如何连接的

Sql 通过查看第三个表来了解两个表是如何连接的,sql,oracle,having,Sql,Oracle,Having,我有两张桌子: boxes Table ToysTable Kitchen Table boxId | ID Name | ID Type | ID ------------- -------------- ----------- 1 | TOY1 Ball | TOY1 Fork | KIT1 1 | TOY2 Car | TOY2 Knife |

我有两张桌子:

boxes Table         ToysTable       Kitchen Table
boxId | ID          Name  | ID      Type   |  ID
-------------      --------------   -----------
1   | TOY1        Ball    | TOY1     Fork  | KIT1
1   | TOY2        Car     | TOY2     Knife | KIT2
1   | KIT1        Puzzle  | TOY3     Spoon | KIT3
2   | KIT2
我想找到哪个盒子里有我的东西。 因此,如果我问: 什么盒子里有叉子和我的汽车玩具。 我想得到那个盒子的Id,在这个例子中是1

我该怎么做

Sqlfiddle:

编辑: 已将厨房上的列名更新为键入

编辑2: 最终的解决方案是这样的(谢谢Gordon):


这有点棘手,因为
id
可以是任意一个表。一种解决方案是
分组方式
联合所有
。这里是一种通用方法,假设两个引用表中的ID具有不同的值:

select b.boxid
from boxes b left join
     (select id, name 
      from toys t
      union all
      select id, name
      from kitchen k
     ) tk
     on b.id = tk.id
group by b.boxid
having sum(case when tk.name = 'Car' then 1 else 0 end) > 0 and
       sum(case when tk.name = 'Fork' then 1 else 0 end) > 0;
注意:在MySQL中,我将此查询编写为:

select b.boxid
from boxes b left join
     (select id, name 
      from toys t
      where t.name in ('Car', 'Fork')
      union all
      select id, name
      from kitchen k
      where k.name in ('Car', 'Fork')
     ) tk
     on b.id = tk.id
group by b.boxid
having count(distinct name) = 2;

实际上,您可以用任何SQL方言以这种方式编写它。

如何实现表之间的关系?你有ToysTable和Kitchen table的外键吗?boxes table中的ID列是与Toy ID或Kitchen ID的连接。它的oracle无法让sqlfiddle工作。我不知道我如何保存任何东西。当我在一个新的选项卡中打开它时,它显示为空白。我得到一个空白的SQL FIDLE,链接有效吗?您的设计中是否有任何东西阻止Toy中的ID列包含与Kitchen中的ID列相同的值?如果发生这种情况,您将永远无法确定返回哪个值。如果可能的话,我建议您重新审视一下您的桌子设计。也许盒子、项目、项目类型和盒子项目外部参照在这里会更好。不,玩具中的id永远不能与中的相同kitchen@ViktorEriksson . . . SQL小提琴是正确的。没有火柴。这个版本显示它可以工作:。现在回到工作中,我有机会看到这个。首先,我可能已经把表格简化了。除了ID列之外,它们没有公共列名。我用kitchentable更新了fiddle,用类型作为列而不是名称。您能解释一下sql中的最后一行吗,它的count(不同名称)=2。这意味着什么?当列具有不同的名称时,这将如何工作?
select b.boxid
from boxes b left join
     (select id, name 
      from toys t
      where t.name in ('Car', 'Fork')
      union all
      select id, name
      from kitchen k
      where k.name in ('Car', 'Fork')
     ) tk
     on b.id = tk.id
group by b.boxid
having count(distinct name) = 2;