Выберите элементы дочерних таблиц с заданным свойством - PullRequest
0 голосов
/ 17 сентября 2010

Я действительно плохо разбираюсь в SQL, проблема в следующем: у меня есть таблица метаданных, подобная этой

META:
id(pk)  prop1   prop2
     1  'pr1'   'pr2'
     2  'pr1'   'pr2'

В то же время у меня есть много дочерних таблиц, которые выглядят примерно так:

TABLE1:
metaID(fk-pk)   indx(pk)    active  ...
            1          1         1  ...
            1          2         0  ...
            1          3         1  ...
            2          1         1  ...

и вторая таблица, аналогичная первой

TABLE2:
metaID(fk-pk)   indx(pk)    active  ...
            1          1         1  ...
            1          2         1  ...
            2          1         0  ...
            2          2         0  ...

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

Например, если мне нужны элементы с prop1 = 'pr1, запрос должен ответить:

meta-id prop1   prop2   TAB1CNT TAB2CNT
      1 'pr1'   'pr2'         2       2
      2 'pr1'   'pr2'         1       0

, где TAB1CNT - количество активных элементов TABLE1, и то же самое происходитдля TAB2CNT

1 Ответ

1 голос
/ 17 сентября 2010

Нечто подобное должно сработать. Это вернет все мета записи, независимо от того, были ли какие-либо активные записи в таблице1 или таблице2.

SELECT ID, prop1, prop2, ISNULL(t1.ActiveCount, 0) AS TAB1CNT, ISNULL(t2.ActiveCount, 0) AS TAB2CNT
FROM META m
    LEFT JOIN
    (
        SELECT metaID, COUNT(*) AS ActiveCount
        FROM TABLE1
        WHERE active = 1
        GROUP BY metaID
    ) t1 ON m.ID = t1.metaID
    LEFT JOIN
    (
        SELECT metaID, COUNT(*) AS ActiveCount
        FROM TABLE2
        WHERE active = 1
        GROUP BY metaID
    ) t2 ON m.ID = t2.metaID

Будем надеяться, что из этого вы можете добавить любые пункты, которые хотите вернуть, только те записи META, которые вас интересуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...