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

Sql DB2:当为每个主ID找到多个类别类型的列时,选择所有数据行,sql,db2,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

您好,我有一张数千人的表格,每个人都购买了不同的汽车,并包含购买日期,如下所示:

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
如果车主拥有一辆福特和一辆本田,包括他们拥有的任何其他汽车,但他们必须拥有一辆福特和一辆本田。i、 e.如下所示:

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的所有数据都被删除了,因为他们拥有一辆福特,而不是本田。所有数据都是为person 1检索的,包括Lancia的数据,因为他们至少有一辆福特和一辆本田-person 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)
在这里,我可以查询所有id,其中每列=1,并将id和内部联接列表保存到原始表中,并仅为这些id返回数据。然而,这对我来说似乎很慢,尤其是当不可避免地需要扩大数据库大小和标准所需的汽车数量时


有人对我如何处理这个问题有什么建议吗?

在您在第条中使用的第一个查询中。该子句已翻译为conditionA或conditionB,因此,如果您只有两个品牌中的一个,那么查询也可以满足

您可以使用一个双exists子查询,一个用于本田,一个用于福特相关的in和

我想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'
)

在第一个查询中,您使用了In子句。该子句已翻译为conditionA或conditionB,因此,如果您只有两个品牌中的一个,那么查询也可以满足

您可以使用一个双exists子查询,一个用于本田,一个用于福特相关的in和

我想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'
)

您也可以在一个EXISTS中执行此操作,因为这是一个AND条件,使用联接,就像在另一个答案中一样。@brucezepplin:谢谢;祝您有愉快的一天您也可以在一个EXISTS中这样做,因为这是一个条件,通过使用连接,就像在另一个答案中一样。@brucezepplin:谢谢;祝你今天愉快