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的列的多个类别类型时,选择所有数据行的主要内容,如果未能解决你的问题,请参考以下文章