SQL-запрос двух таблиц с отношением один ко многим

У меня есть две таблицы A и Band, отношение между A и B равно A --- > one-to-Many --- > B

Обычно у меня есть одна запись B для каждой записи A.

Я пытаюсь написать запрос, который даст мне список ТОЛЬКО записей A, которые имеют более ОДНОЙ (НЕСКОЛЬКИХ) записей в B.

Я очень смущен, так как выполнял только базовые SQL-запросы, и этот мне кажется сложным.

Может ли кто-нибудь помочь мне с правильным ответом или дать мне решение.

отредактировано:

хорошо, я попробовал что-то вроде ниже, и это дало мне ошибку

SELECT SOME_COLUMN_NAME FROM A a, B b WHERE a.ID=b.ID и count(b.SOME_OTHER_COLUMN_NAME)>1;

ORA-00934: групповая функция здесь не разрешена

Я попытался найти в Интернете объявление, что мне не разрешено использовать группировку в предложении where, и я должен использовать have. Я застрял здесь сейчас.


person oortcloud_domicile    schedule 23.02.2012    source источник


Ответы (3)


Вы не указали, какую систему базы данных вы используете (sql-server/mysql/sqlite/oracle и т. д.), так что это общий ответ.

В этой форме перечислите все столбцы A явно в предложениях SELECT и GROUP BY. Обычно он генерирует хороший простой план в большинстве СУБД. Но он также может с треском провалиться, если тип не поддерживает GROUP, например столбцы TEXT в SQL Server.

SELECT A.Col1, A.Col2, A.Col3
FROM A
JOIN B ON A.LinkID = B.LinkID
GROUP BY A.Col1, A.Col2, A.Col3
HAVING COUNT(*) > 1

Эта другая форма с использованием подзапроса работает для любых типов столбцов в A и обычно создает точно такой же план.

SELECT A.Col1, A.Col2, A.Col3
FROM A
WHERE 1 < (
    SELECT COUNT(*)
    FROM B
    WHERE A.LinkID = B.LinkID)
person RichardTheKiwi    schedule 23.02.2012
comment
Технически это правильно, но будет довольно грязно, если у вас много столбцов в A. Если вам нужны все столбцы в A в результатах, немного чище просто сгруппировать по столбцу ID, а затем соединить A с подзапросом. . - person Bennor McCarthy; 24.02.2012

Вы можете сделать это с помощью подзапроса:

select *
  from A
  where ( select count(*) from B where B.id = A.id ) > 1
person Ray    schedule 23.02.2012
comment
Это будет работать, но вы никогда не захотите делать это в производственной системе с большими таблицами. Вы эффективно выполняете подзапрос для каждой строки в A. - person Bennor McCarthy; 24.02.2012

select * 
from tableA 
where Id in (select IdA from tableb group by idA having COUNT(*)>1)

предполагая, что tableB имеет поле с именем idA, которое связывает его с tableA

person Diego    schedule 23.02.2012