Объединение в несколько таблиц DB2 дает повторяющиеся строки - PullRequest
0 голосов
/ 13 января 2019

У меня проблемы с объединением нескольких таблиц; при этом я получаю дубликаты данных, которые я не ожидаю.

enter image description here

По сути, каждое приложение может иметь одну или несколько форм. Каждый заявитель может иметь одну или несколько форм. И один заявитель может иметь один или несколько адресов; однако ради простоты я хочу вернуть только один адрес.

SELECT
    APPLICANT.FIRST_NAME,
    APPLICANT.LAST_NAME,
    ADDRESS.STREET,
    ADDRESS.CITY,
    ADDRESS.STATE,
    ADDRESS.POSTAL_CODE,
    FORM.SERIAL
FROM
    APPLICATION JOIN
    FORM ON
        FORM.APPLICATION_SERIAL = APPLICATION.SERIAL JOIN
    APPLICANT ON
        FORM.APPLICATION_SERIAL = APPLICANT.APPLICATION_SERIAL JOIN
    APPLICANT_ADDRESS ON
        APPLICANT.SERIAL = APPLICANT_ADDRESS.APPLICANT_SERIAL

При выполнении этого запроса, если в приложении есть два кандидата, каждый со своим адресом и каждый с формой, результаты дублируются дважды для каждого кандидата. Я пытался выбрать DISTINCT столбцы, а также группировать по серийному номеру, фамилии, имени и т. Д., Но безрезультатно.

+------------+-----------+-----------------+--------------+-------+-------------+-------------+
| First_Name | Last_Name |     Street      |     City     | State | Postal_code | Form_Serial |
+------------+-----------+-----------------+--------------+-------+-------------+-------------+
| John       | Doe       | 123 Main Street | Magical City | ZZ    |       00000 |         001 |
| John       | Doe       | 123 Main Street | Magical City | ZZ    |       00000 |         001 |
| Jane       | Doe       | 456 Y Street    | Another City | ZZ    |       00000 |         002 |
| Jane       | Doe       | 456 Y Street    | Another City | ZZ    |       00000 |         002 |
+------------+-----------+-----------------+--------------+-------+-------------+-------------+

Каков наилучший способ предотвращения дублирования строк при объединении этих таблиц?

1 Ответ

0 голосов
/ 13 января 2019

Утверждение «Каждый заявитель может иметь одну или несколько форм» не следует из вашей схемы - сущность Form связана с сущностью Application, но не с сущностью Applicant. Было бы хорошо иметь образцы данных, на которые вы получаете дубликаты.

WITH 
  APPLICATION (Serial) as (values
  (1)
) 
, FORM (Serial, Application_serial) as (values
  ('001', 1)
--, ('002', 1)
) 
, APPLICANT (Serial, Application_Serial, First_Name, Last_Name) as (values
  (1, 1, 'John', 'Doe')
, (2, 1, 'Jane', 'Doe')
)
, ADDRESS (Serial, Applicant_Serial, Street, City, State, Postal_code) as (values
  (1, 1, '123 Main Street', 'Magical City', 'ZZ', '00000')
, (2, 2, '456 Y Street', 'Another City', 'ZZ', '00000')
)
SELECT 
  APPLICANT.FIRST_NAME, APPLICANT.LAST_NAME
, ADDRESS.STREET, ADDRESS.CITY, ADDRESS.STATE, ADDRESS.POSTAL_CODE
, FORM.SERIAL AS FORM_SERIAL
FROM APPLICATION 
JOIN FORM ON FORM.APPLICATION_SERIAL = APPLICATION.SERIAL 
JOIN APPLICANT ON FORM.APPLICATION_SERIAL = APPLICANT.APPLICATION_SERIAL 
JOIN ADDRESS ON APPLICANT.SERIAL = ADDRESS.APPLICANT_SERIAL;

FIRST_NAME LAST_NAME STREET          CITY         STATE POSTAL_CODE FORM_SERIAL
---------- --------- --------------- ------------ ----- ----------- -----------
John       Doe       123 Main Street Magical City ZZ    00000       001
Jane       Doe       456 Y Street    Another City ZZ    00000       001

  2 record(s) selected.

Мой пример не возвращает дубликаты. Но вы получите свои результаты, если раскомментируете 2-й Form этого Application (не Applicant). Именно эта 2-я Form запись является причиной, по которой вы получаете дубликаты на выходе. Вы должны решить, что возвращать в столбце FORM_SERIAL в случае кратного Forms для данного Application.

...