Ищите способ не показывать дублированные строки с помощью SQL-запроса - PullRequest
0 голосов
/ 11 февраля 2019
SELECT 
    AEC.gwd_people.id_people,
    AEC.gwd_people.uid_people, 
    AEC.gwd_people.cod_people,
    AEC.gwd_people.name_people, 
    AEC.gwd_people.surname_people,
    AEC.gwd_people.email, 
    AEC.gwd_people.people_status, 
    AEC.gwd_people.people_type,
    AEC.gwd_people.facility_reference,
    AEC.gwd_people.sc_id_sap,
    AEC.gwd_people.c_id_sap,
    AEC.gwd_people.descr_people, 
    AEC.gwd_people.cod_sector,
    AEC.gwd_people.descr_sector,
    AEC.gwd_people.cod_org_sector,
    AEC.gwd_people.descr_org_sector,
    AEC.gwd_people.cod_company,
    AEC.gwd_people.descr_company, 
    AEC.gwd_people.cod_company_sap,
    AEC.gwd_people.cod_department,
    AEC.gwd_department.descr_department,
    AEC.gwd_people.cod_subdepartment,
    AEC.gwd_people.descr_subdepartment, 
    AEC.gwd_people.cod_cdc,
    AEC.gwd_cost_center.descr_cdc,
    AEC.gwd_people.cod_category_job,
    AEC.gwd_people.descr_category_job,
    AEC.gwd_people.cod_people_job,
    AEC.gwd_people.descr_people_job, 
    AEC.gwd_people.cod_position,
    AEC.gwd_people.descr_position,
    AEC.gwd_people.uohr,
    AEC.gwd_people.qual_contract,
    AEC.gwd_people.level_position,
    AEC.gwd_people.cod_manager, 
    AEC.gwd_people.cod_validator,
    AEC.gwd_people.cod_country,
    AEC.gwd_people.descr_country,
    AEC.gwd_people.cod_region_area,
    AEC.gwd_people.descr_region_area,
    AEC.gwd_people.descr_city, 
    AEC.gwd_people.descr_site,
    AEC.gwd_people.address_1,
    AEC.gwd_people.address_2,
    AEC.gwd_people.descr_building,
    AEC.gwd_people.descr_room,
    AEC.gwd_people.validity_date, 
    AEC.aec_workstation.cod_workstation,
    AEC.aec_workstation.geometry,
    AEC.aec_workstation.drawing,
    AEC.gwd_people.tax_code,
    AEC.gwd_people.phone_1,
    AEC.gwd_people.phone_2,
    AEC.gwd_people.phone_3, 
    AEC.gwd_people.phone_4,
    AEC.gwd_people.ext_email_1,
    AEC.gwd_people.flagvip,
    AEC.gwd_people.hiring_date,
    AEC.gwd_people.cease_date,
    AEC.gwd_people.cid_resp_liv_1,
    AEC.gwd_people.cid_resp_liv_2, 
    AEC.gwd_people.id_resp,
    AEC.gwd_people.descr_resp, 
    AEC.gwd_people.id_ref,
    AEC.gwd_people.descr_ref, 
    AEC.gwd_people.descr_ext_people,
    AEC.gwd_people.ext_email_2,
    AEC.gwd_people.descr_sede, 
        (CASE WHEN AEC.aec_r_workstation_people.cod_people IS NULL
          THEN AEC.gwd_people.idplan
          ELSE NULL
          END) AS idplan,
        (CASE WHEN AEC.aec_r_workstation_people.cod_people IS NOT NULL 
          THEN SUBSTRING(AEC.aec_workstation.cod_workstation, 5, 7)
           ELSE NULL
           END) AS idplan_wrkst,
        (CASE WHEN AEC.aec_r_workstation_people.cod_people IS NULL 
          THEN AEC.view_iam_r_unitp_building.IDEDIFICIO
           ELSE NULL
           END) AS cod_building,
        (CASE WHEN AEC.aec_r_workstation_people.cod_people IS NOT NULL 
          THEN SUBSTRING(AEC.aec_workstation.cod_workstation, 5, 3)
           ELSE NULL
           END) AS cod_building_wrkst,
        (CASE WHEN AEC.aec_r_workstation_people.cod_people IS NOT NULL 
          THEN AEC.aec_workstation.id_room
           ELSE NULL
           END) AS id_room_wrkst,
        (CASE WHEN AEC.aec_r_workstation_people.cod_people IS NOT NULL
          THEN AEC.aec_workstation.id_room
           ELSE NULL
           END) AS id_room_wrkst2
FROM AEC.gwd_people
 LEFT OUTER JOIN AEC.view_iam_r_unitp_building ON 
 AEC.view_iam_r_unitp_building.IDUNITPROD = AEC.gwd_people.cod_sector
 LEFT OUTER JOIN AEC.aec_r_workstation_people ON AEC.gwd_people.cod_people = 
 AEC.aec_r_workstation_people.cod_people
 LEFT OUTER JOIN AEC.aec_workstation ON AEC.aec_workstation.cod_workstation 
 = AEC.aec_r_workstation_people.cod_workstation
 LEFT OUTER JOIN AEC.gwd_department ON AEC.gwd_department.cod_department = 
 AEC.gwd_people.cod_department
 LEFT OUTER JOIN AEC.gwd_cost_center ON AEC.gwd_cost_center.cod_cost_center 
 = AEC.gwd_people.cod_cdc

Это мой запрос, и я использую SQL Server 13, он возвращает 6752 строки, 44 из которых дублированы.Я перепробовал все, что знаю, чтобы не показывать эти дублированные записи, но у меня нет идей, поэтому я ищу несколько полезных советов :-) Одна из самых больших проблем заключается в том, что все поля являются обязательными, поэтому я не могуизбавиться от "AEC.aec_workstation.geometry", который вызывает проблемы с SELECT DISTINCT.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Ваш дизайн стола затрудняет понимание их отношений.Вот как это выглядит для меня:

gwd_department  {1:n}  gwd_people
gwd_people      {m:n}  aec_workstation
gwd_people      {m:n}  view_iam_r_unitp_building
gwd_people      {?:n}  gwd_cost_center

Так что для человека, связанного с 3 aec_workstations и 4 view_iam_r_unitp_buildings, вы получите 3 x 4 = 12 строк результатов.Нет ли дальнейшей связи между aec_workstation и view_iam_r_unitp_building?Если нет, то почему вы объединяете их в своем запросе?

Я не знаю, должен ли cod_cdc быть кратким для cod_cost_center или чем-то другим.Если это также отношение m: n, вы снова делаете то же самое с gwd_cost_center, связанным с aec_workstation и view_iam_r_unitp_building.

Сказав это: либо добавьте отсутствующие критерии, либо спросите себя, что вы хотите выбрать послевсе.

0 голосов
/ 11 февраля 2019

Найдите значение PK из вашей первой таблицы, которая возвращает повторяющуюся строку, и начните со следующего запроса:

SELECT 
    COUNT(1)
FROM 
    AEC.gwd_people
WHERE
    AEC.gwd_people.PrimaryKeyColumn = 'SomeValue'

Теперь начинайте добавлять объединения по одному, каждый раз проверяя результат COUNT(1):

SELECT 
    COUNT(1)
FROM 
    AEC.gwd_people
    LEFT OUTER JOIN AEC.view_iam_r_unitp_building ON AEC.view_iam_r_unitp_building.IDUNITPROD = AEC.gwd_people.cod_sector
WHERE
    AEC.gwd_people.PrimaryKeyColumn = 'SomeValue'

А потом ...

SELECT 
    COUNT(1)
FROM 
    AEC.gwd_people
    LEFT OUTER JOIN AEC.view_iam_r_unitp_building ON AEC.view_iam_r_unitp_building.IDUNITPROD = AEC.gwd_people.cod_sector
    LEFT OUTER JOIN AEC.aec_r_workstation_people ON AEC.gwd_people.cod_people = AEC.aec_r_workstation_people.cod_people
WHERE
    AEC.gwd_people.PrimaryKeyColumn = 'SomeValue'

Пока вы не увидите, как количество строк увеличивается, когда вы этого не ожидаете.Скорее всего, вы:

  • Не считая того, что можно ожидать повторяющихся строк.
  • Отсутствует другой столбец соединения в таблице.
  • Наличие в таблице повторяющихся строк.

... или их комбинация.

...