SQL есть способ выбрать строки, которые не похожи по тем же столбцам - PullRequest
1 голос
/ 26 апреля 2019

SQL есть способ выбрать строки, которые не похожи по тем же столбцам.

У меня есть эта таблица City_Names имя базы данных DataPostalCode

id |AR        |HB        |ENG
---+----------+----------+-----------
1  |valueAR   |valueHB   |valueENG
---+----------+----------+-----------
2  |TamraAR   |TamraHB   |TamraENG
---+----------+----------+-----------
3  |TamraAR   |Tamra2HB  |TamraENG
---+----------+----------+-----------
4  |KabulAR   |KabulHB   |KabulENG
---+----------+----------+-----------
6  |KabulAR   |KabulHB   |KabulENG
---+----------+----------+-----------
7  |KabulAR   |KabulHB   |KabulENG
---+----------+----------+-----------
8  |Azor      |Azor      |Azor      
---+----------+----------+-----------
9  |Azor      |Azor      |Azor      
---+----------+----------+-----------
...

Эти данныевыше только демонстрация, а не реальные данные.

См. строки id 4 и 6 и 7 имеют аналогичные значения по AR + HB + ENG.

Строки id 8и 9 одинаковы.

Но строки id 1 одинарные.

И Есть строки id 2 и 3 (что я ищу) похожи по AR +ENG, но столбец HB не похож.

Так что я тренируюсь писать SQL-код, который выбирает те строки, которые не похожи, и результат должен быть.

id |AR        |HB        |ENG
---+----------+----------+-----------
2  |TamraAR   |TamraHB   |TamraENG
---+----------+----------+-----------
3  |TamraAR   |Tamra2HB  |TamraENG
---+----------+----------+-----------

Что мне написать?

SELECT id,AR,HB,ENG FROM  City_Names ....;

Ответы [ 3 ]

2 голосов
/ 26 апреля 2019

Вы можете использовать exists для этого:

select cn.*
from city_names cn
where exists (select 1
              from city_names cn2
              where cn2.ar = cn.ar and
                    cn2.eng = cn.eng and
                    cn2.hb <> cn.hb
             );

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

select cn.ar, cn.eng,
       list_agg(cn.id, ',') over (order by id) as ids,
       list_agg(cn.hb, ',') over (order by id) as hbs
from city_names cn
group by cn.ar, cn.eng
having min(cn.hb) <> max(cn.hb);

Конкретная функция для агрегирования строк зависит от базы данных.

1 голос
/ 26 апреля 2019

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

select cn.*
from City_Names cn
where exists (select 1 
              from City_Names cnn 
              where cn.AR = cnn.AR and cn.ENG = cnn.ENG and cn.HB <> cnn.HB
             );
0 голосов
/ 27 апреля 2019

Вы также можете использовать LEFT JOIN для получения результата:

SELECT
    T2.*
FROM
    temp AS T1
    LEFT JOIN temp AS T2 ON T1.AR = T2.AR AND T1.ENG = T2.ENG AND T1.HB <> T2.HB

Результат:

id  AR  HB  ENG
3   TamraAR Tamra2HB    TamraENG
2   TamraAR TamraHB TamraENG
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...