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

Posted

技术标签:

【中文标题】DB2:当找到每个主ID的列的多个类别类型时,选择所有数据行【英文标题】:DB2: select all rows of data when multiple categories types of a column for each primary ID is found 【发布时间】:2014-02-28 15:32:27 【问题描述】:

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

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

有人有什么建议吗?

【问题讨论】:

【参考方案1】:

在您的第一个查询中,您使用了 IN 子句。该子句已翻译为条件A OR 条件B,因此,如果您只有两个品牌之一,则也可以满足查询。

您可以使用双重存在子查询,一个用于本田,一个用于与 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'
)

【讨论】:

您也可以在一个EXISTS 中执行此操作,因为这一个AND 条件(通过使用连接,如在另一个答案中)。跨度> @brucezepplin:谢谢 ;) 祝你有美好的一天【参考方案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'
 )

【讨论】:

以上是关于DB2:当找到每个主ID的列的多个类别类型时,选择所有数据行的主要内容,如果未能解决你的问题,请参考以下文章

在 Access 中有多个列的查询中选择单个不同的列

DB2 设置列的类型缺省值(默认值)非空等

db2db 数据库转换设置自增的必须为主键 但是否怎么办

基于另一列的最大值的列上的 SQL 内连接 [重复]

线性方程组 II

如何处理主队列上的多个 moc