在下一列中返回具有不同值的行

时间:2018-09-28 22:40:54

标签: sql

我想编写一个查询,该查询返回具有2个不同值的行,例如:

这是我拥有的表格-表格名称为Deliveryschedulefruits

ContactId  Fruit
-----------------
45166      apple
45168      apple
45169      apple
45166       orange

结果应为:

 45166      apple
 45166      orange

我自己尝试了一些解决方案,但无法得出所需的结果: 这是行不通的。我觉得应该

select  * 
from MOW_DeliveryScheduleFruits 
where ContactId IN (select a.ContactId 
                    from MOW_DeliveryScheduleFruits a
                    join MOW_DeliveryScheduleFruits b On b.ContactId = a.ContactId 
                                                      And b.Fruit <> a.Fruit)

请帮助我。我似乎无法解决这个问题。

2 个答案:

答案 0 :(得分:0)

尝试一下

select MOW_DeliveryScheduleFruits.*
from(    
     select ContactId 
     from MOW_DeliveryScheduleFruits
     group by ContactId 
     having count(*)>1
) as doubles
inner join MOW_DeliveryScheduleFruits on MOW_DeliveryScheduleFruits.ContactId=doubles.ContactId 
order by MOW_DeliveryScheduleFruits.ContactId, Fruit

子查询返回所需的所有ID。您可以阅读带有这些ID的水果。

我认为您的查询有问题是,如果每个contactID的水果数超过2,它将返回双精度字。您需要使用distinct。像这样。

select  * from MOW_DeliveryScheduleFruits 
where ContactId IN (
      select distinct a.ContactId 
      from MOW_DeliveryScheduleFruits a
      Join MOW_DeliveryScheduleFruits b
      ON b.ContactId = a.ContactId AND b.Fruit <> a.Fruit
)

使用group by比额外的join更有效率。

答案 1 :(得分:0)

我只会使用exists

select f.*
from fruits f
where exists (select 1
              from fruits f2
              where f2.contactid = f.contactid and f2.fruit <> f.fruit
             );

如果表很大,则可以最佳利用(contactid, fruit)上的索引。