Сопоставить повторяющееся значение из второго столбца на основе повторяющегося значения из первого столбца - PullRequest
0 голосов
/ 11 июля 2020

У меня есть такая таблица

CREATE TABLE table1 (
  `ID` VARCHAR(100),
  `Val` VARCHAR(100),
  `Val2` VARCHAR(100)
);

INSERT INTO table1
  (`ID`, `Val`, `Val2`)
VALUES
  ('1','4788','90'),
  ('2','4788','90'),
  ('10','4788','10'),
  ('20','111','10'),
  ('30','111','10'),
  ('57','89','89111'),
  ('59','89','89111'),
  ('60','89','10'),
  ('2','900','7000'),
  ('4','900','7001');

У меня есть два условия для этой таблицы:

  1. Столбец Val должен иметь повторяющееся значение И,
  2. Столбец Val2 должен дублироваться

, поэтому моя цель - вернуть данные, если выполняются два условия. Если столбец val имел повторяющееся значение, а столбец val2 имел повторяющееся значение и каждый столбец в своей собственной строке.

мой запрос выглядит так

select t1.* from table1 t1
where exists (select 1 from table1 where id <> t1.id and val = t1.val)
and exists (
  select 1 from table1 
  where val = t1.val and val2 in (select val2 from table1 group by val2 having count(*) > 1)
)

результат был таким

ID  Val Val2
1   4788    90
2   4788    90
10  4788    10
20  111 10
30  111 10
57  89  89111
59  89  89111
60  89  10

Как видите, столбцы не совпадают друг с другом

Я ожидаю, что данные результата были такими

ID  Val Val2
1   4788    90
2   4788    90
20  111 10
30  111 10
57  89  89111
59  89  89111

вот моя скрипка

Ответы [ 3 ]

1 голос
/ 11 июля 2020

Вам нужны having и join. Вот демонстрация .

select 
   t.* 
from table1 t
join (
    select  
       val, val2 
    from table1 
    group by 
       val, val2 
    having count(*) > 1  
) t1 
on t.val = t1.val 
and t.val2 = t1.val2

вывод:

| ID  | Val  | Val2  |
| --- | ---- | ----- |
| 1   | 4788 | 90    |
| 2   | 4788 | 90    |
| 20  | 111  | 10    |
| 30  | 111  | 10    |
| 57  | 89   | 89111 |
| 59  | 89   | 89111 |
1 голос
/ 11 июля 2020

Вы на правильном пути с exists. Вы только что усложнили лог c:

select t1.*
from table1 t1
where exists (select 1
              from table1 tt1
              where tt1.id <> t1.id and
                    tt1.val = t1.val and
                    tt1.val2 = t1.val2
             ) ;

Вам нужны дубликаты обоих значений в одной строке . Следовательно, это одно предложение exists.

Здесь - скрипт db <>.

1 голос
/ 11 июля 2020

Вы можете подать в суд на группу, имея для проверки дубликат

    select  val, val2 
    from  table1 

    group by val, val2 
    having count(*) > 1   

, затем

select t1.* 
from table1 t1
inner join (
    select  val, val2 
    from  table1 

    group by val, val2 
    having count(*) > 1  
) t on t.val =t1.val and t.val2 = t1.val2
...