Объедините три разных оператора выбора в один (1) - PullRequest
0 голосов
/ 03 апреля 2020

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

ТАБЛИЦА 1 (информация о папке):

CASE_ID | FOLDER_ID | PARENT_FOLDER_ID | FOLDER_NAME
123       C488785     null               casefolder 1
123       F488785     C488785            folder 1
123       SF48878     F488785            subfolder 1

ТАБЛИЦА 2 (информация о документе):

CASE_ID | FOLDER_ID | DOCUMENT_ID | DOCUMENT_NAME | DOCUMENT_TYPE | IS_VISIBLE | ...
C488785 | SF488785  | d98765432   | document 1    | txt           | 1          | ...

ТАБЛИЦА 3 (информация по электронной почте):

CASE_ID | FOLDER_ID | EMAIL_ID | SUBJECT    | SENDER            | IS_VISIBLE | ...
C488785 | SF48878  | d12345678 | test mail  | sender@sender.nl  | 0          | ...
C488785 | F488785  | d67891234 | test mail2 | sender@sender.nl  | 0          | ...

См. Ниже оператор SQL, который я пробовал и который дает ожидаемый результат. Однако я не хочу включать это СО там. Я предпочитаю не использовать это СО.

WITH folder_information AS (
        SELECT T1.CASE_ID, T1.FOLDER_ID, T1.PARENT_FOLDER_ID, T1.FOLDER_NAME, T2.FOLDER_NAME "PARENT_FOLDER_NAME"
        FROM DB.FOLDER_DATA T1 LEFT JOIN DB.FOLDER_DATA  T2
        ON  (T1.PARENT_FOLDER_ID = T2.FOLDER_ID) 
        WHERE T1.CASE_ID=12345),

     files AS(
        SELECT CASE_ID, DOSSIER_ID, FOLDER_ID, DOCUMENT_ID, DOCUMENT_NAME, DOCUMENT_TYPE, UPLOADED_BY, UPLOADED_ON, MODIFIED_BY, MODIFIED_ON, VERSION, IS_VISIBLE, IS_CHECKEDOUT, CHECKEDOUT_BY,
        NULL AS "EMAIL_ID", NULL AS "SUBJECT", NULL AS "SENDER", NULL AS "RECIPIENT", NULL AS "RECEIVED_DATE", NULL AS "ATTACHMENTS"
        FROM DB.DOCUMENT_DATA WHERE CASE_ID=12345

        UNION

        SELECT CASE_ID, DOSSIER_ID, FOLDER_ID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, IS_VISIBLE, NULL, NULL, EMAIL_ID, SUBJECT, SENDER, RECIPIENT, RECEIVED_DATE, ATTACHMENTS
        FROM DB.EMAIL_DATA WHERE CASE_ID=12345)

SELECT T1.CASE_ID, T1.DOSSIER_ID, T1.FOLDER_ID, T1.DOCUMENT_ID, T1.DOCUMENT_NAME, T1.DOCUMENT_TYPE, T1.UPLOADED_BY, T1.UPLOADED_ON, T1.MODIFIED_BY, T1.MODIFIED_ON, T1.VERSION, T1.IS_VISIBLE, T1.IS_CHECKEDOUT, T1.CHECKEDOUT_BY,
T1.EMAIL_ID, T1.SUBJECT, T1.SENDER, T1.RECIPIENT, T1.RECEIVED_DATE, T1.ATTACHMENTS ,T2.FOLDER_NAME, T2.PARENT_FOLDER_NAME
FROM files T1, folder_information T2
WHERE T1.CASE_ID = T2.CASE_ID AND T1.FOLDER_ID = T2.FOLDER_ID

Приведенный выше код приводит к следующему, и я ожидаю, что результат будет следующим:

RESULT TABLE 1 (folder information):
CASE_ID | FOLDER_ID | DOCUMENT_ID | DOCUMENT_NAME | ... | EMAIL_ID | SUBJECT | ... | FOLDER_NAME | PARENT_FOLDER_NAME

C488785 | SF48878 | d98765432 | document 1 | ... | null | null | ... | subfolder 1 | folder 1
C488785 | SF48878 | null | null | ... | d12345678 | test mail  | ... | subfolder 1 | folder 1
C488785 | F488785 | null | null | ... | d67891234 | test mail2 | ... | folder 1    | casefolder 1

ЗАМЕЧАНИЕ: Для удобства чтения я заменил некоторые столбцы по точкам (...)

1 Ответ

1 голос
/ 04 апреля 2020

просто переместите подзапросы в from part

SELECT T1.CASE_ID, T1.DOSSIER_ID, T1.FOLDER_ID, T1.DOCUMENT_ID, T1.DOCUMENT_NAME, T1.DOCUMENT_TYPE, T1.UPLOADED_BY, T1.UPLOADED_ON, T1.MODIFIED_BY, T1.MODIFIED_ON, T1.VERSION, T1.IS_VISIBLE, T1.IS_CHECKEDOUT, T1.CHECKEDOUT_BY,
T1.EMAIL_ID, T1.SUBJECT, T1.SENDER, T1.RECIPIENT, T1.RECEIVED_DATE, T1.ATTACHMENTS ,T2.FOLDER_NAME, T2.PARENT_FOLDER_NAME
FROM 
(
        SELECT CASE_ID, DOSSIER_ID, FOLDER_ID, DOCUMENT_ID, DOCUMENT_NAME, DOCUMENT_TYPE, UPLOADED_BY, UPLOADED_ON, MODIFIED_BY, MODIFIED_ON, VERSION, IS_VISIBLE, IS_CHECKEDOUT, CHECKEDOUT_BY,
        NULL AS "EMAIL_ID", NULL AS "SUBJECT", NULL AS "SENDER", NULL AS "RECIPIENT", NULL AS "RECEIVED_DATE", NULL AS "ATTACHMENTS"
        FROM DB.DOCUMENT_DATA WHERE CASE_ID=12345

        UNION

        SELECT CASE_ID, DOSSIER_ID, FOLDER_ID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, IS_VISIBLE, NULL, NULL, EMAIL_ID, SUBJECT, SENDER, RECIPIENT, RECEIVED_DATE, ATTACHMENTS
        FROM DB.EMAIL_DATA WHERE CASE_ID=12345
) T1, 
(
        SELECT T1.CASE_ID, T1.FOLDER_ID, T1.PARENT_FOLDER_ID, T1.FOLDER_NAME, T2.FOLDER_NAME "PARENT_FOLDER_NAME"
        FROM DB.FOLDER_DATA T1 LEFT JOIN DB.FOLDER_DATA  T2
        ON  (T1.PARENT_FOLDER_ID = T2.FOLDER_ID) 
        WHERE T1.CASE_ID=12345
) T2
WHERE T1.CASE_ID = T2.CASE_ID AND T1.FOLDER_ID = T2.FOLDER_ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...