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;