【问题标题】:Looking for a way to not show duped rows using a SQL query寻找一种不使用 SQL 查询显示重复行的方法
【发布时间】:2019-07-04 17:17:29
【问题描述】:
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 行被欺骗。我已经尝试了我所知道的一切来避免显示那些被欺骗的条目,但我没有想法,所以我正在寻找一些有用的提示:-) 最大的问题之一是所有字段都是必需的,所以我不能摆脱导致 SELECT DISTINCT 出现问题的“AEC.aec_workstation.geometry”。

【问题讨论】:

  • 轻松为您提供帮助:stackoverflow.com/help/mcve
  • 旁注:许多外连接。例如,您真的希望人们不属于某个部门吗?在适当的地方使用内部连接。仅在必要时进行外部连接。
  • 另一个旁注:表别名可以使查询更具可读性(例如FROM aec.gwd_people p JOIN aec.gwd_department d on d.cod_department = p.cod_department)。
  • 你有没有考虑把DISTINCT这个词放在SELECT之后?

标签: sql sql-server duplicates rows


【解决方案1】:

从返回重复行的第一个表中查找 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'

直到您看到行数在您不期望的情况下突然增加。你最有可能:

  • 不考虑可能会出现重复行。
  • 缺少表中的另一个连接列。
  • 表中有重复的行。

...或这些的组合。

【讨论】:

  • 附注:使用COUNT(*)(即计算行数)而不是COUNT(1)(即计算生成的1不会为空的行数)。不要依赖 DBMS 的优化器来解决这个问题。如果它真的按照你的要求做,它会在必要时做更多的工作。仅在适当的情况下使用COUNT(<expression>)。
  • 无论如何,我喜欢你的回答,建议简单地深入研究直到找到罪魁祸首。至于主键:我猜cod_people是表的唯一键。
【解决方案2】:

您的表格设计让人有点难以理解它们之间的关系。在我看来是这样的:

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 关系,那么您将再次使用与 aec_workstation 和 view_iam_r_unitp_building 相关的 gwd_cost_center 做同样的事情。

话虽如此:要么添加缺少的条件,要么问自己到底要选择什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2011-08-30
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多