Я создаю отчет, в котором должен быть указан и идентификатор основного лица, и идентификатор альтернативного лица. Но для этого также необходимо указать контактную информацию и идентификаторы основного лица. В отчете, который я создал прямо сейчас, перечисляются только контактные данные идентификатора основного лица, но указывается номер альтернативного идентификатора. Может ли кто-нибудь помочь мне в исправлении моего 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
Когда вы хотите присоединиться к таблице дважды, как вы делаете это с 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, поскольку я знаю, что многие рабочие места все еще используют его в качестве внутреннего стандарта кодирования. Я оставил свои изменения в нижнем регистре, чтобы их было легко увидеть.
ANSI_QUOTES
.. Я также советую вам прочитать. Почему я должен предоставить MCVE для того, что мне кажется очень простым SQL-запросом? и предоставить примерные данные в текстовом формате и соответствующие ожидаемые результаты в текстовом формате(+)
- это только синтаксисOracle
я не заметил его до того, как изменил теги с MySQL на Oracle. (+) можно использовать для использования соединения LEFT или RIGHT. Это расширение Oracle для поддержки LEFT и RIGHT JOIN ' со старым ANSI синтаксисом запятых JOIN, который вы больше не должны использовать. Вы должны использовать правильный синтаксис JOIN, такой какtable1 INNER JOIN table ON ...
илиtable1 RIGHT|LEFT JOIN table ON ...