Как пропустить строки с одинаковыми значениями столбцов в SQL Server? - PullRequest
0 голосов
/ 19 марта 2019

У меня есть таблица, как показано ниже:

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

Результирующая таблица должна выглядеть так:

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

Строки с одинаковым значением в ColB должны быть удалены. Как я могу удалить / исключить такие строки?

Ответы [ 5 ]

2 голосов
/ 19 марта 2019

Вы можете использовать похожую логику:

SELECT * 
FROM TABLE 
WHERE COLB NOT IN (SELECT COLB 
                   FROM TABLE 
                   GROUP BY COLB 
                   HAVING COUNT(*) > 1)
1 голос
/ 19 марта 2019

С НЕ СУЩЕСТВУЮЩИМ:

select * from tablename t
where not exists (
  select 1 from tablename
  where colb = t.colb and cola <> t.cola
)
0 голосов
/ 20 марта 2019

Вы также можете использовать

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

0 голосов
/ 20 марта 2019

Если у вас есть индекс покрытия с начальным столбцом 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 
0 голосов
/ 20 марта 2019

Я просто хочу заметить, что вы можете сделать это с агрегацией:

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

Если счетчик 1, то min() возвращает значения в этой строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...