Вывод результатов из сложной структуры базы данных (SQL Server) - PullRequest
0 голосов
/ 07 августа 2009

Это будет длинный вопрос, поэтому я постараюсь объяснить его как можно лучше.

Я разработал простой инструмент отчетности, в котором хранится ряд результатов и с учетом идентификатора отчета, эти результаты были получены из конкретной цитаты, используемой в основной системе, с огромным списком их, хранящихся в таблица котировок. Вот текущая партия:

ДОКЛАДЫ

REP_ID    DESC            QUOTE_ID
-----------------------------------
1         Test            1
2         Today           1
3         Last Week       2

РЕЗУЛЬТАТЫ

RES_ID    TITLE           REFERENCE          REP_ID
---------------------------------------------------
1         Equipment       Toby               1
2         Inventory       Carl               1
3         Stocks          Guest              2
4         Portfolios      Guest              3

QUOTE

QUOTE_ID     QUOTE
------------------------------------
1             Booking a meeting room
2             Car Park Policy
3             New User Guide

Пока все хорошо, простая хранимая процедура смогла извлечь всю необходимую информацию.

Теперь список функций был расширен, чтобы включить категории и группы цитат. В Отчеты таблица quote_id была изменена на group_id для ссылки на следующие таблицы.

REPORTS
- REPORT_ID
- DESC
- GROUP_ID

GROUP
 - GROUP_ID
 - GROUP

GROUP_CAT_JOIN
 - GCJ_ID
 - CAT_ID
 - GROUP_ID

CATEGORIES
 - CAT_ID
 - CATEGORY

CAT_QUOTE_JOIN
 - CQJ_ID
 - CAT_ID
 - QUOTE_ID

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

Чтобы объяснить это далее, таблица результатов имеет report_id, который ссылается на отчеты, отчеты имеют group_id, который связывает группы, группы и категории, связанные через таблицу group_cat_join, то же самое с категориями и кавычками через таблицу cat_quote_join.

В основных терминах я должен быть в состоянии извлечь все результаты из группы цитат или категории цитат. Целью запроса будет получение всех результатов из определенного отчета в определенной категории, группе или обоих. Эта головоломка уже несколько дней ставит меня в тупик, поскольку внутренние объединения, похоже, не работают, и я изо всех сил пытаюсь найти другие способы решения проблемы с помощью SQL.

Может кто-нибудь здесь помочь мне?


Вот некоторые дополнительные разъяснения.

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

Вот пример данных, которые у меня есть на данный момент

Результаты

RES_ID    TITLE           REFERENCE          REP_ID
---------------------------------------------------
1         Equipment       Toby               1
2         Inventory       Carl               1
3         Stocks          Guest              2
4         Portfolios      Guest              3

Отчеты

REP_ID    DESC            GROUP_ID
-----------------------------------
1         Test            1
2         Today           1
3         Last Week       2

GROUP

GROUP_ID     GROUP
---------------------------------
1            Standard
2            Target Week

GROUP_CAT_JOIN

GCJ_ID       GROUP_ID     CAT_ID
----------------------------------
1            1            1
2            1            2
3            2            3

КАТЕГОРИЯ

CAT_ID        CAT
-------------------------------
1             York Office
2             Glasgow Office
3             Aberdeen Office

CAT_QUOTE_JOIN

CQJ_ID       CAT_ID      QUOTE_ID
-----------------------------------
1            1           1
2            2           2
3            3           3

QUOTE

QUOTE_ID     QUOTE
------------------------------------
1             Booking a meeting room
2             Car Park Policy
3             New User Guide

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

Результат, который я ищу, - если я выберу поиск по группе, я получу все внутри группы, если я выберу все внутри категории, я получу все только внутри этой категории, и если я выберу что-то из категории в группа, я получаю все внутри этой категории. Проблема на данный момент заключается в том, что всякий раз, когда на группу ссылаются, все внутри каждой категории, которая связана с группой, вытягивается.

Ответы [ 2 ]

1 голос
/ 10 августа 2009

Следующая строка получит необходимые строки из results:

select
    a.*
from
    results a
    inner join reports b on
        a.rep_id = b.rep_id
        and (-1 = @GroupID or 
            b.group_id = @GroupID)
        and (-1 = @CatID or
            b.cat_id = @CatID)

Обратите внимание, что я использовал -1 в качестве заполнителя для всех групп и категорий. Очевидно, используйте значение, которое имеет смысл для вас. Тем не менее, таким образом, вы можете указать определенный group_id или конкретный cat_id и получить желаемые результаты.

Кроме того, если вам нужны данные группы / категории / цитаты, вы всегда можете добавить больше inner join s, чтобы получить эту информацию.

Также обратите внимание, что я добавил условия Group_ID и Cat_ID в таблицу Reports. Это будет необходимым SQL, если и только если вы добавите столбец Cat_ID в таблицу Reports. Я знаю, что ваша текущая структура таблицы не поддерживает это, но это необходимо. В противном случае, как говорил мой дед: «Мальчик, ты не сможешь добраться отсюда». Проблема заключается в том, что вы хотите ограничить reports group и category, но reports только знает о group. Поэтому нам нужно привязать что-то к category из reports. В противном случае, оно никогда не будет когда-либо ограничивать reports на category. Единственное, что вы можете ограничить как group , так и category, это кавычки. И это, кажется, не ваше требование.

В качестве дополнения: если вы добавите cat_id к results вместо reports, условие соединения должно быть:

    and (-1 = @CatID or
        a.cat_id = @CatID)
0 голосов
/ 08 августа 2009

Это то, что вы ищете?

SELECT a.* 
FROM Results a
JOIN Reports b ON a.REP_Id = c.REP_Id
WHERE EXISTS (
    SELECT * FROM CAT_QUOTE_JOIN c
    WHERE c.QUOTE_ID = b.QUOTE_ID -- correlation to the outer query
      AND c.CAT_ID = @CAT_ID -- parameterization
    )
   OR EXISTS (
    -- note that subquery table aliases are not visible to other subqueries
    -- so we can reuse the same letters
    SELECT * FROM CAT_QUOTE_JOIN c, GROUP_CAT_JOIN d 
    WHERE c.CAT_ID = d.CAT_ID -- subquery join
      AND c.QUOTE_ID = b.QUOTE_ID -- correlation to the outer query
      AND d.GROUP_ID = @GROUP_ID -- parameterization
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...