#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. Да, теперь исправлено.