如何在SQL Server中跳过具有相同列值的行?

时间:2019-03-19 20:41:46

标签: sql sql-server tsql

我有一张桌子,如下:

ColA    ColB    ColC
`````  ``````  ``````  
1       Steve   Rodgers  
2       Tony    Stark  
3       Steve   Jobs

结果表应如下所示:

ColA    ColB    ColC
`````  ``````  ``````   
2       Tony    Stark  

ColB中具有相同值的行应被删除。如何删除/排除此类行?

5 个答案:

答案 0 :(得分:2)

您可以使用类似的逻辑:

SELECT * 
FROM TABLE 
WHERE COLB NOT IN (SELECT COLB 
                   FROM TABLE 
                   GROUP BY COLB 
                   HAVING COUNT(*) > 1)

答案 1 :(得分:1)

不存在:

select * from tablename t
where not exists (
  select 1 from tablename
  where colb = t.colb and cola <> t.cola
)

答案 2 :(得分:0)

我只想指出您可以通过聚合来做到这一点:

select min(cola) as col1, colb, min(colc) as colc
from t
group by colb
having count(*) = 1;

如果计数为1,则min()将带回该行中的值。

答案 3 :(得分:0)

如果您有一个覆盖索引且其前导列为ColB,则也可以使用LAG / LEAD。这样可以按顺序扫描索引(无需排序),并保留其中ColB与它的任何一个邻居都不相同的行

WITH T
     AS (SELECT *,
                LAG(ColB) OVER (ORDER BY ColB) AS PrevColB,
                LEAD(ColB) OVER (ORDER BY ColB) AS NextColB
         FROM   YourTable)
SELECT *
FROM   T
WHERE  IIF(ColB IN ( PrevColB, NextColB ), 0, 1) = 1 

答案 4 :(得分:0)

您也可以使用

CREATE TABLE T(
  Col1 INT,
  Col2 VARCHAR(45),
  Col3 VARCHAR(45)
);

INSERT INTO T VALUES
(1, 'Steve',  'Rodgers'),  
(2, 'Tony',  'Stark' ), 
(3, 'Steve',  'Jobs');

SELECT *
FROM T
WHERE 1 = (SELECT COUNT(Col2) 
           FROM T TT 
           WHERE T.Col2 = TT.Col2 
          );

返回:

+------+------+-------+
| Col1 | Col2 | Col3  |
+------+------+-------+
|    2 | Tony | Stark |
+------+------+-------+

Live Demo