Выберите количество (*) или ноль - PullRequest
3 голосов
/ 26 июля 2010

Усталость мешает мне найти это ... Скажем, у вас есть следующие таблицы:

Родитель

  • PARENT_ID (LONG)

Дети

  • CHILD_ID (LONG)
  • PARENT_ID (LONG, FK)
  • HAS_GRADUATED (BOOLEAN)

Я хочу, чтобы запрос возвратил следующее true (1 в случае Oracle), если у родителя есть хотя бы один дочерний элемент, который закончил обучение, и false (0, в случае Oracle), если у родителя нет ребенка, который окончил школу, или вообще не имеет детей :

PARENT_ID ................ HAS_CHILDREN_WHO_GRADUATED

5 ................................. 1

3 ................................. 1

6 ................................. 0

2 ................................. 0

В приведенном выше описании родитель с parent_id = 5 может иметь> = 1 детей, которые закончили обучение. То же самое является родителем с parent_id = 3. Родитель с parent_id = 6 либо вообще не имеет детей, либо имеет детей, но ни один из них не окончил школу.

На что будет похож запрос?

Ответы [ 5 ]

7 голосов
/ 26 июля 2010

Использование:

   SELECT DISTINCT
          p.parent_id,
          CASE WHEN c.parent_id IS NULL THEN 0 ELSE 1 END
     FROM PARENT p
LEFT JOIN CHILD c ON c.parent_id = p.parent_id
                 AND c.has_graduated = 1

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

2 голосов
/ 26 июля 2010

Вероятно, решение OMG Ponies будет работать лучше (именно поэтому он получил +1), но это еще один способ решения проблемы.

Select Parent_Id
    , Case
        When Exists( Select 1
                    From Child
                    Where Child.Parent_Id = Parent.Parent_Id
                        And Child.Has_Graduated = 1 ) Then 1
        Else 0
        End
From Parent
2 голосов
/ 26 июля 2010

Это даст вам то, что вы ожидаете?

SELECT 
    P.Parent_Id,
    CASE WHEN (SUM (CASE WHEN Has_Graduated = 1 then 1 else 0 END)) = 0 THEN 0 ELSE 1  as HAS_CHILDREN_WHO_GRADUATED
FROM Parent P
    LEFT JOIN Child C
        ON P.Parent_Id = C.Parent_Id
GROUP BY P.Parent_Id
0 голосов
/ 26 июля 2010

Вот форма запроса, хотя синтаксис для Oracle может быть выключен:

SELECT
   Parent.PARENT_ID
  ,case count(Child.PARENT_ID) when 0 then 0 else 1 end HAS_CHILDREN_WHO_GRADUATED
 from Parent
  left outer join Child
   on Child.PARENT_ID = Parent.PARENT_ID
 where Child.HAS_GRADUATED = 1
 group by Parent.PARENT_ID

Это перечислит все родительские элементы один раз, с HAS_CHILDREN_WHO_GRADUATED установить на 1 или 0 установить по желанию.

(отредактировано для добавления предложения where)

0 голосов
/ 26 июля 2010

Прежде всего, я не думаю, что вы можете использовать для этого столбцы LONG, поскольку значения LONG нельзя использовать в условиях WHERE. Обратите внимание, что это верно для 10g, так как это то, что я использую.

Во-вторых, я предполагаю, что вы имеете в виду, что ваша дочерняя таблица должна иметь столбец с именем PARENT_ID, иначе не было бы никакой возможности связать две таблицы. Учитывая, что этот запрос должен работать:

SELECT PARENT_ID, COUNT(1) FROM Child WHERE HAS_GRADUATED = 1 GROUP BY PARENT_ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...