SQL-запрос двух таблиц с отношением один-ко-многим - PullRequest
3 голосов
/ 24 февраля 2012

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

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

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

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

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

изм:

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

ВЫБРАТЬ SOME_COLUMN_NAME ОТ A a, B b, ГДЕ a.ID = b.ID и считать (b.SOME_OTHER_COLUMN_NAME)> 1;

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

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

Ответы [ 3 ]

4 голосов
/ 24 февраля 2012

Вы не указали, какую систему баз данных вы используете (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)
0 голосов
/ 24 февраля 2012
select * 
from tableA 
where Id in (select IdA from tableb group by idA having COUNT(*)>1)

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

0 голосов
/ 24 февраля 2012

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

select *
  from A
  where ( select count(*) from B where B.id = A.id ) > 1
...