Как сравнивать строки как списки в SQL?

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть таблица «многие ко многим», в которой 3 первичных ключа показаны ниже :

 table1 : key_1, key_2, key_3
  

Я хочу сравнить строки как списки,

Например :

table1 было бы :

       key_1  key_2  key_3

row1:  10  |  100  | 150
row2:  10  |  101  | 150
row3:  10  |  103  | 151

row4:  11  |  100  | 150
row5:  11  |  101  | 150
row6:  11  |  103  | 151
  

Итак, чего я хотел бы достичь, так это сравнить мою таблицу, отфильтрованную по key_1, и найти повторяющийся список строк.

Итак, в этом сценарии,

 SELECT * FROM table1 where key_1 = 10; 
  

возвращает 3 строки (row1, row2, row3) и

 SELECT * FROM table1 where key_1 = 11;
  

также возвращает 3 строки (row4, row5, row6)

И, как вы видите выше, первый результат из 3 строк имеет одинаковые key_2 key_3 значения amp; со вторым результатом из 3 строк.

Итак, как я могу запросить это, получить строки в виде списков и сравнить их?

Я знаю, что этот вопрос выглядит как-то глупо, но, пожалуйста, я был бы очень рад, если бы вы мне помогли. Заранее спасибо 🙂

Комментарии:

1. Почему вы используете неподдерживаемую версию SQL Server?

2. Я не, это случайно помечено, я думаю

3. Я отредактировал вопрос.

4. Что именно вы хотите сравнить? Наборы строк, отфильтрованные по одному столбцу, но сравниваемые по двум другим?

5. вы хотите просмотреть key_1=10 три раза, потому что есть три строки с одинаковыми значениями для key_2 и key_3?

Ответ №1:

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

Например, следующий запрос находит любую разницу между group 10 и 11 :

 select *
from table1 a
full join table1 b on a.key2 = b.key2 and a.key3 = b.key3
where a.key2 is null or b.key2 is null
  and a.key1 = 10 and b.key1 = 11
  

Если запрос не возвращает строк, то группы идентичны.

Ответ №2:

Если вы хотите найти пары key_2 и key_3, которые повторяются для двух значений key_1:

 select key_2, key_3
from table1
where key_1 in (10, 11)
group by key_2, key_3
having count(1) > 1
  

Чтобы найти значения key_1, для которых существуют одинаковые key_2 и key_3:

 select distinct key_1
from table1
inner join (
  select key_2, key_3
  from table1
  group by key_2, key_3
  having count(1) > 1
) t (key_2, key_3)
on table1.key_2 = t.key_2
and table1.key_3 = t.key_3
  

Приведенный выше запрос сообщает только, что значение key_1 имеет по крайней мере один другой ключ, который имеет те же key_2 и key_3. Он не сообщает вам, какое другое значение key_1 или что такое key_2 и key3. Похоже, это то, о чем вы просили, но я не уверен, что это очень полезно.