代码之家  ›  专栏  ›  技术社区  ›  Zach

DB2多表联接产生重复行

  •  0
  • Zach  · 技术社区  · 7 年前

    我在将多个表连接在一起时遇到了困难;这样做时,我得到了我不希望得到的重复数据。

    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 回复  |  直到 7 年前
        1
  •  1
  •   Mark Barinstein    7 年前

    “每个申请人可以有一个或多个表格”的声明不符合您的模式。 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.
    

    我的示例不返回重复项。 但是如果你取消注释第二个 形式 其中 应用 (不是) 申请人 )也就是说这是第二次 形式 记录是在输出中获得重复项的原因。 你应该决定在 FORM_SERIAL 多列 Forms 对于给定 应用