比较几行

时间:2015-03-11 12:15:10

标签: sql sql-server

我有一个包含多个重复条目的行的表,例如

|[com_enq_id]|  [comtype_type]  |
|  1         | blah             |
|  1         | Found DP Quotes  |
|  1         | Found Quotes     |
|  2         | Found DP Quotes  |
|  2         | blah             |
|  2         | Found DP Quotes  |
|  3         | Found DP Quotes  |
|  3         | Found DP Quotes  |
|  3         | Found DP Quotes  |

我正在尝试仅选择[com_enq_id]没有Found DP QuotesFound Quotes的表格中的行。应选择具有一个或不具有这些ID的ID,但不应选择具有这两者的ID。 (例如,在这种情况下,只应选择23

我尝试了以下我认为最初工作的以下内容,但是如果该ID与另一个[comtype_type](例如blah)的任何其他行(例如SELECT t1.[com_enq_id] ,t1.[comtype_type], t2.[comtype_type] FROM [comments_view] t1 JOIN [comments_view] t2 ON t1.[com_enq_id] = t2.[com_enq_id] WHERE ( t1.[comtype_type] = 'Found Quotes' AND t2.[comtype_type] <> 'Found DP Quotes') OR ( t2.[comtype_type] = 'Found Quotes' AND t1.[comtype_type] <> 'Found DP Quotes') ),它也会返回包含两者的所有行:

[com_enq_id]

有没有人可以指出我需要如何修改它以排除这些行/只选择{{1}}哪些没有?

1 个答案:

答案 0 :(得分:4)

我认为解决此类问题的最简单,最灵活的方法是使用group byhaving。获取com_enq_id的列表:

select cv.com_enq_id
from comments_view cv
where comtype_type in ('Found DP Quotes', 'Found Quotes')
group by cv.com_enq_id
having count(distinct comtype_type) <> 2;

然后,您可以通过各种方式获取所有行。这使用in

select cv.*
from comments_view cv
where cv.com_enq_id in (select cv.com_enq_id
                        from comments_view cv
                        where comtype_type in ('Found DP Quotes', 'Found Quotes')
                        group by cv.com_enq_id
                        having count(distinct comtype_type) <> 2
                       );