#sql
#sql
Вопрос:
Я пытаюсь запросить 4 столбца A, B, C и D, чтобы найти записи, в которых на A / B.
Отношения иерархичны от A до D; на C может быть несколько Ds, несколько Cs на B и т.д.
например, здесь я хочу найти запись 2 из столбца A, потому что столбцы A и B одинаковы, но C и D разные
A B C D
-------------
1 1 1 1
1 1 2 1
1 1 3 1
2 1 1 1
2 1 2 2
Я решил сгруппировать все 4 и использовать having
количество d> 1, но это, как ни странно, не возвращает результатов, когда их должно быть много.
Есть ли какой-либо способ сделать это, не используя целую кучу подзапросов, или это единственный способ?
ПРИМЕЧАНИЕ: данные не числовые, выше приведен только пример. Фактические данные имеют строковый тип.
Комментарии:
1. найти записи, в которых на A / B приходится более 1 D не то же самое, что я хочу найти запись 2 из столбца A, потому что столбцы A и B одинаковы, но C и D разные . Имеет ли C какое-либо значение в этом требовании?
2. @Mithrandir Я имел в виду столбец A, в таблице 1 и 2 есть два подмножества
3. @forpas На самом деле, я думаю, нет, нет
Ответ №1:
Вы можете сгруппировать по a, b и задать условие в предложении having:
select a, b
from tablename
group by a, b
having count(distinct d) > 1
Если вы хотите, чтобы все строки и столбцы таблицы соответствовали вашим условиям:
select t.*
from tablename t
inner join (
select a, b
from tablename
group by a, b
having count(distinct d) > 1
) d on d.a = t.a and d.b = t.b
Ответ №2:
Это то, что вы хотите?
select a
from t
group by a
having min(d) <> max(d);
Или, если вы хотите, чтобы оба c
и d
были приняты во внимание:
having min(c) <> max(c) and min(d) <> max(d);
Комментарии:
1. Извините, следовало объяснить, что данные не числовые, это было просто для примера, это строки
2. @Absinthe . . . Числовые данные не имеют никакого отношения к этому ответу. Я не уверен, что вы пытаетесь сказать в своем комментарии. Часто
max()
иmin()
имеют лучшую производительность, чемcount(distinct)
.3. Я предположил, что min и max работают только с числовыми данными, но, попробовав ваш запрос, он работает. Можете ли вы подробнее рассказать о том, почему min и max работают с нечисловыми данными?
4. @Absinthe . . . Ваше предположение неверно.
min()
иmax()
работают практически с каждым типом данных. Я бы также отметил, что этот ответ не только правильный, но и был на несколько минут раньше, чем другой ответ.5. Хорошо, я сожалею, что лишил вас некоторых моментов …? Ценю ответ, но, возможно, вы могли бы более подробно рассказать о том, почему это работает.