Нужна помощь оператора SQL JOIN

0

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

            SELECT "ORG_ACCOUNT".ACCOUNT_NUMBER AS "Account Number",
                   "ORG_PERSON".ADDRESS_2 AS "Address",
                   "ORG_ACCOUNT".DODAAC AS "Dodaac",
                   "ORG_DODAAC".DRA AS "Dra",
                   "ORG_PERSON".EMAIL AS "Email",
                   "ORG_PERSON".FIRST_NAME AS "First Name",
                   "ORG_PERSON".LAST_NAME AS "Last Name",
                   "ORG_PERSON".LAST_TRAIN_DATE AS "Last Train Date",
                   "ORG_PERSON".MIDDLE_NAME AS "Middle Name",
                   "ORG_ALT_ACCOUNT_CUST".PERSON_ID AS "Alt Person Id",
                   "ORG_ORG".ORG_NAME AS "Org Name",
                   "ORG_ACCOUNT".PERSON_ID AS "Person Id",
                   "ORG_PERSON".PHONE_COM AS "Phone Com",
                   "ORG_PERSON".PHONE_DSN AS "Phone Dsn",
                   "ORG_PERSON".RANK AS "Rank"
           FROM "ORG"."ORG_ACCOUNT" "ORG_ACCOUNT",
                "ORG"."ORG_DODAAC" "ORG_DODAAC",
                "ORG"."ORG_ORG" "ORG_ORG",
                "ORG"."ORG_PERSON" "ORG_PERSON"
                "ORG"."ORG_ALT_ACCOUNT_CUST" "ORG_ALT_ACCOUNT_CUST"
           WHERE ( ( "ORG_PERSON".PERSON_ID(+) = ORG_ALT_ACCOUNT_CUST".PERSON_ID )
             AND   ( "ORG_ORG".ORG_ID = "ORG_ACCOUNT".ORG_ID ) 
             AND   ( "ORG_PERSON".PERSON_ID = "ORG_ACCOUNT".PERSON_ID )
             AND   ( "ORG_ALT_ACCOUNT_CUST".PERSON_ID = "ORG_ACCOUNT".PERSON_ID )
             AND   ( "ORG_DODAAC".DODAAC = "ORG_ACCOUNT".DODAAC ) ) 
             AND   ( UPPER("ORG_ACCOUNT".DODAAC) LIKE UPPER(:DODAAC) 
             AND    "ORG_DODAAC".DRA IN ( :P_DRA_ENTRIES)
             AND     UPPER("ORG_ACCOUNT".DODAAC_COMMODITY) = UPPER('A') )
           ORDER BY "ORG_DODAAC".DRA ASC, "ORG_ACCOUNT".ACCOUNT_NUMBER ASC, "ORG_PERSON".LAST_NAME ASC
  • 5
    Вы уверены, что используете MySQL, а не SQL-сервер (MSSQL), Oracle или PostgreSQL? Обычно MySQL не поддерживает двойные квоты для идентификаторов, таких как имя базы данных, имя таблицы и столбцы, если вы не настроите sql_mode ANSI_QUOTES .. Я также советую вам прочитать. Почему я должен предоставить MCVE для того, что мне кажется очень простым SQL-запросом? и предоставить примерные данные в текстовом формате и соответствующие ожидаемые результаты в текстовом формате
  • 1
    (+) - это только синтаксис Oracle я не заметил его до того, как изменил теги с MySQL на Oracle. (+) можно использовать для использования соединения LEFT или RIGHT. Это расширение Oracle для поддержки LEFT и RIGHT JOIN ' со старым ANSI синтаксисом запятых JOIN, который вы больше не должны использовать. Вы должны использовать правильный синтаксис JOIN, такой как table1 INNER JOIN table ON ... или table1 RIGHT|LEFT JOIN table ON ...
Показать ещё 1 комментарий
Теги:

1 ответ

0

Когда вы хотите присоединиться к таблице дважды, как вы делаете это с ORG_PERSON, вам нужно дважды перечислить ее в предложении FROM (с разными псевдонимами).

SELECT ORG_ACCOUNT.ACCOUNT_NUMBER AS "Account Number",
                   ORG_PERSON.ADDRESS_2 AS "Address",
                   ORG_ACCOUNT.DODAAC AS "Dodaac",
                   ORG_DODAAC.DRA AS "Dra",
                   ORG_PERSON.EMAIL AS "Email",
                   ORG_PERSON.FIRST_NAME AS "First Name",
                   ORG_PERSON.LAST_NAME AS "Last Name",
                   ORG_PERSON.LAST_TRAIN_DATE AS "Last Train Date",
                   ORG_PERSON.MIDDLE_NAME AS "Middle Name",
                   ORG_ALT_ACCOUNT_CUST.PERSON_ID AS "Alt Person Id",
                   ORG_ORG.ORG_NAME AS "Org Name",
                   ORG_ACCOUNT.PERSON_ID AS "Person Id",
                   ORG_PERSON.PHONE_COM AS "Phone Com",
                   ORG_PERSON.PHONE_DSN AS "Phone Dsn",
                   ORG_PERSON.RANK AS "Rank",
                   alt_person.address_2 as "Alt Address",
                   alt_person.email as "Alt Email",
                   alt_person.first_name as "Alt First Name",
                   alt_person.last_name as "Alt Last Name",
                   alt_person.phone_com as "Alt Phone"
           FROM "ORG".ORG_ACCOUNT ORG_ACCOUNT,
                "ORG".ORG_DODAAC ORG_DODAAC,
                "ORG".ORG_ORG ORG_ORG,
                "ORG".ORG_PERSON ORG_PERSON
                "ORG".ORG_ALT_ACCOUNT_CUST ORG_ALT_ACCOUNT_CUST,
                "ORG".ORG_PERSON alt_person
           WHERE ( ( alt_person.PERSON_ID(+) = ORG_ALT_ACCOUNT_CUST.PERSON_ID )
             AND   ( ORG_ORG.ORG_ID = ORG_ACCOUNT.ORG_ID ) 
             AND   ( ORG_PERSON.PERSON_ID = ORG_ACCOUNT.PERSON_ID )
             AND   ( ORG_ALT_ACCOUNT_CUST.PERSON_ID = ORG_ACCOUNT.PERSON_ID )
             AND   ( ORG_DODAAC.DODAAC = ORG_ACCOUNT.DODAAC ) ) 
             AND   ( UPPER(ORG_ACCOUNT.DODAAC) LIKE UPPER(:DODAAC) 
             AND    ORG_DODAAC.DRA IN ( :P_DRA_ENTRIES)
             AND     UPPER(ORG_ACCOUNT.DODAAC_COMMODITY) = UPPER('A') )
           ORDER BY ORG_DODAAC.DRA ASC, ORG_ACCOUNT.ACCOUNT_NUMBER ASC, ORG_PERSON.LAST_NAME ASC

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

  • 0
    Огромное спасибо. Это сработало. Я обязательно приму ваш совет. Еще раз большое спасибо за помощь!
  • 0
    Мы используем Oracle на нашем рабочем месте

Ещё вопросы

Сообщество Overcoder
Наверх
Меню