您好我有一张桌子,上面有成千上万的人购买不同的车,并且包含购买日期,如下:
ID Car Purchase_Date
-- --- -------------
1 Lancia 2000-01-24
1 Ford 2003-04-17
1 Honda 2007-11-10
1 Honda 2013-06-28
2 Ford 1998-03-03
2 Ferrari 2007-04-19
3 Ford 1995-10-31
3 Honda 2008-08-20
3 Delorian 2230-01-01
如果所有者拥有福特和本田,包括他们拥有的任何其他汽车,我想要带回所有数据的ID,但他们必须同时拥有福特和本田。即如下:
ID Car Purchase_Date
-- --- -------------
1 Lancia 2000-01-24
1 Ford 2003-04-17
1 Honda 2007-11-10
1 Honda 2013-06-28
3 Ford 1995-10-31
3 Honda 2008-08-20
3 Delorian 2230-01-01
所以基本上人们都会删除ID 2的所有数据,因为他们拥有福特,但不是本田。所有数据都是为1人检索的,包括蓝旗亚的数据,因为他们至少有福特和本田 - 对于3人来说也是如此。
我只需要一个起点,因为我很难理解这一点。显然,我只能选择与特定汽车相关的数据,例如:
select * from mytable
where Car in ('Ford','Honda')
但是我失去了我感兴趣的汽车的所有其他数据。
我想我可以为我感兴趣的每种类型的汽车创建一个列,使用案例陈述来告诉我他们是否有车或者没有使用过类似的东西:
select distinct id, Ford, honda from
(select distinct id,
case when (select distinct id from mytable where Car = 'Ford') is null then 0 else 1 end as Ford,
case when (select distinct id from mytable where Car = 'Honda') is null then 0 else 1 end as Honda
from mytable a)
我可以在其中查询每列= 1的所有id,并将id和内部联接的列表保存到原始表中,并仅为这些id返回数据。然而,这对我来说似乎很慢,特别是当不可避免地需要扩大数据库大小和标准所需的汽车数量时。
有没有人有任何建议如何解决这个问题?
答案 0 :(得分:4)
在您的第一个查询中,您使用了IN子句。该条款已翻译为conditionA OR conditionB,因此如果您只有两个品牌中的一个,则查询也会得到满足。
您可以使用双存在子查询,一个用于本田,一个用于福特相关的AND
我认为ID字段不是您的表的主键(已复制)
试试这个:
select t1.*
from mytable t1
where exists(
select 'hasford'
from mytable t2
where t2.id = t1.id
and t2.car = 'Ford'
)
and exists(
select 'hashonda'
from mytable t3
where t3.id = t1.id
and t3.car = 'Honda'
)
答案 1 :(得分:2)
Select * from your_table where id in
(
Select t1.id from
Your_table t1
Inner join your_table t2
On t1.id = t2.id
Where t1.car = 'ford'
And t2.car = 'Honda'
)