Выберите строки, в которых существует однозначное соответствие между двумя столбцами в одной и той же таблице SQL - PullRequest
0 голосов
/ 23 января 2019

У меня есть таблица SQL с двумя типами столбцов идентификаторов. например,

ID_1    Name          Date     ID_2
 487     Joe    09/06/2004      332
 731    Mike    06/01/2004      116
 487     Joe    09/06/2004      354
 777    Rich    01/01/2002      455
 745    Mike    06/01/2004      116

Иногда ID_1 имеет несколько строк с разными значениями для ID_2. И наоборот, иногда ID_2 имеет несколько строк с разными значениями для ID_1.

Я хотел бы сохранить все строки, в которых есть совпадение один к одному между ID_1 и ID_2. В идеале, я бы также сделал еще одну таблицу с оставшимися строками, чтобы я мог легко рассмотреть их позже. Таким образом, в приведенном выше примере только одна строка (четвертая) имеет однозначное соответствие между ID_1 и ID_2:

ID_1    Name          Date     ID_2
 777    Rich    01/01/2002      455

Все остальные строки имеют строки, в которых один из идентификаторов дублируется. Таким образом, в основном удаляются все строки, в которых один из столбцов идентификатора вообще дублируется.

Я пытался использовать DISTINCT, но при этом сохраняется одна из повторяющихся строк, а я хочу, чтобы все они были удалены.

p.s. это не вопрос объединения таблиц - пример - одна таблица.

Ответы [ 4 ]

0 голосов
/ 24 января 2019

этот код поможет вам пожалуйста

create table #temp (ID_1 int,name varchar(255),[Date] date,ID_2 int)
insert into #temp values (487  ,  'Joe','09/06/2004', 332)
insert into #temp values (731  , 'Mike' ,  '06/01/2004'  ,    116   )
insert into #temp values (487  , ' Joe' ,  '09/06/2004'  ,    354   )
insert into #temp values (777  , 'Rich' ,  '01/01/2002'  ,    455   )
insert into #temp values (745  , 'Mike' ,  '06/01/2004'  ,    116   )


Select * from (
Select ROW_NUMBER() OVER(ORDER BY id_1 DESC)  AS Row#,ID_1,Name,Date,ID_2 
FROM #temp

) as T 

Where Row# = 4
Drop table #temp

enter image description here

0 голосов
/ 23 января 2019

Только один к одному

SELECT *
  FROM Table A
 WHERE (SELECT Count(1)
          FROM Table B
         WHERE A.ID_1 = B.ID_1) = 1
   AND (SELECT Count(1)
          FROM Table B
         WHERE A.ID_2 = B.ID_2) = 1

Более одного

SELECT *
  FROM Table A
 WHERE (SELECT Count(1)
          FROM Table B
         WHERE A.ID_1 = B.ID_1) > 1
    OR (SELECT Count(1)
          FROM Table B
         WHERE A.ID_2 = B.ID_2) > 1
0 голосов
/ 24 января 2019
create table #one_to_one
(id_1 int, name varchar(20), dt date, id_2 int)

insert into #one_to_one values( 487,   'Joe',    '09/06/2004'  ,    332)
insert into #one_to_one values( 731,   'Mike',    '06/01/2004' ,     116)
insert into #one_to_one values(487,   'Joe',    '09/06/2004'  ,    354)
insert into #one_to_one values( 777,    'Rich',    '01/01/2002',      455)
insert into #one_to_one values( 745,    'Mike',    '06/01/2004',      116)


select id_1, name, dt, id_2
from (select *, count(*) over(partition by id_1) as id_1_count,
               count(*) over(partition by id_2) as id_2_count
      from #one_to_one) res
where id_1_count = 1 and id_2_count = 1;
0 голосов
/ 23 января 2019

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

CREATE TABLE only_one_to_one
AS
SELECT ID_1, Name, Date, ID_2
FROM (SELECT *,COUNT(*) OVER(PARTITION BY ID_1) AS ID1_cnt,
               COUNT(*) OVER(PARTITION BY ID_2) AS ID2_cnt
      FROM tab) sub
WHERE ID1_cnt = 1 AND ID2_cnt = 1;

ДБ <> Fiddle demo

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