Выбор строк, которые имеют только одну уникальную связь между двумя столбцами СУБД SQL

#sql

#sql

Вопрос:

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

например:

 1   2   3   4
-------------
a   t   g   1
a   f   d   1
b   h   l   2
b   r   g   2
b   q   m   3
  

Здесь я рассматриваю только столбцы 1 и 4.

В этой таблице я хотел бы выбрать строки 1 и 2, потому что в обеих из них столбец 1 = a и столбец 4 = 1. другими словами, каждый раз, когда a встречается в первом столбце, 1 встречается в четвертом столбце. Я бы не хотел выбирать какие-либо строки, содержащие b для столбца 1, потому что соответствующие значения для столбца 4 могут быть либо 2, либо 3.

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

1. Таблица настолько большая, что я не могу искать конкретные вхождения. Мне нужно написать запрос для выбора, когда возникает описанное выше условие. Кроме того, с помощью этой логики «где col1 = ‘b’ и col4 = ‘2’» возвращало бы строки, которые мне не нужны, потому что есть строка, где col1 = b и col4 = 3.

2. Я думаю, что вам нужен список тех строк, где значение столбца 4 зависит только от значения столбца 1 .

Ответ №1:

Вы можете легко получить значения столбца 1, которые удовлетворяют вашим требованиям, с помощью этого запроса:

 SELECT col1
FROM mytable
GROUP BY col1
HAVING COUNT(DISTINCT col4) = 1
  

Итак, ваш окончательный запрос будет:

 SELECT *
FROM mytable
WHERE col1 IN 
(
    SELECT col1
    FROM mytable
    GROUP BY col1
    HAVING COUNT(DISTINCT col4) = 1
)
  

Ответ №2:

Если вы хотите выбрать фактические строки, затем используйте not exists :

 select t.*
from t
where not exists (select 1 from t t2 where t2.c1 = t.c1 and t2.c4 <> t.c4);
  

Если вам просто нужны c1 значения, тогда используйте group by , как предложено в других ответах.

Ответ №3:

Я думаю, это то, что вы хотите:

 select *
from my_table
where "1" in (
  select c1
  from (
    select "1" as c1, count("4") as cnt
    from my_table
    group by "1" -- fixed here.
    having count("4") > 1
  ) x
  group by c1
  having count(cnt) = 1 -- this is the key condition.
)
  

Учитывая, что имена ваших столбцов не начинаются с буквы, большинство баз данных примут их, если вы заключите их в двойные кавычки ( " ), как это сделал я.

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

1. я получаю сообщение об ошибке, в котором говорится, что «1» должно появиться в предложении group by. Мои столбцы в базе данных основаны на буквах. Я просто использовал числа для целей публикации

2. Да, теперь исправлено.