DB2:当找到每个主ID的列的多个类别类型时,选择所有数据行

时间:2014-02-28 15:32:27

标签: sql db2

您好我有一张桌子,上面有成千上万的人购买不同的车,并且包含购买日期,如下:

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返回数据。然而,这对我来说似乎很慢,特别是当不可避免地需要扩大数据库大小和标准所需的汽车数量时。

有没有人有任何建议如何解决这个问题?

2 个答案:

答案 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'
 )