Sql 左连接导致重复行-ORACLE

Sql 左连接导致重复行-ORACLE,sql,oracle11g,Sql,Oracle11g,我正在使用WITH子句编写子查询,并将其连接到主查询。 主查询的结果集为332条记录,子查询的结果集为302条记录。 如果我将子查询的左连接到主查询,我希望得到332,但得到336。 我已经检查了主查询和子查询是否存在重复项,特别是重复的记录,并且重复项在查询中不独立存在,这是为什么它们出现在联接中 WITH FacOwner AS( SELECT facility_id_fk, company, contact_first_name, contact_

我正在使用WITH子句编写子查询,并将其连接到主查询。 主查询的结果集为332条记录,子查询的结果集为302条记录。 如果我将子查询的
左连接到主查询,我希望得到332,但得到336。
我已经检查了主查询和子查询是否存在重复项,特别是重复的记录,并且重复项在查询中不独立存在,这是为什么它们出现在联接中

WITH FacOwner AS(
    SELECT 
        facility_id_fk, company,
        contact_first_name, contact_last_name,
        contact_title, contact_address1, contact_address2,
        contact_city, contact_state, contact_zipcode_five,
        contact_zipcode_four, contact_phone_number,
        
        sig_first_name, sig_last_name, 
        sig_title, sig_email,
        sig_address1, sig_address2, sig_city, sig_state, 
        sig_zipcode_five, sig_zipcode_four
        
        FROM Contacts
        WHERE Facility_Role = 'Owner'
)

SELECT 
    fg.facility_id_fk,
    fg.general_id_pk,
    fg.facility_name,
    fg.facility_status,
    fg.facility_type,
    fg.landfill_class,
    fg.dshw_staff_person,
    fg.ownership_type,
    loc.county,
    loc.facility_address_street,
    loc.facility_address_city,
    loc.health_department,
    
    FacOwner.company as Owner_Company, (FacOwner.contact_first_name || ' ' || FacOwner.contact_last_name) as OwnerName,  
    FacOwner.contact_title as OwnerTitle, (FacOwner.contact_address1 || FacOwner.contact_address2) as OwnerAddress,
    FacOwner.contact_city as OwnerCity, FacOwner.contact_state as OwnerState, (FacOwner.contact_zipcode_five || '-' || FacOwner.contact_zipcode_four) as OwnerZipcode,
    FacOwner.contact_phone_number as OwnerPhoneNumber,
    
    FacOwner.sig_first_name || ' ' || FacOwner.sig_last_name as OwnerCertSigName,
    FacOwner.sig_title as OwnerCertSigTitle, FacOwner.sig_email as OwnerCertSigEmail,
    (FacOwner.sig_address1 || ' ' || FacOwner.sig_address2) as OwnerCertSigAddress, FacOwner.sig_city as OwnerCertSigCity, FacOwner.sig_state as OwnerCertSigState, 
    (FacOwner.sig_zipcode_five || '-' || FacOwner.sig_zipcode_four) as OwnerCertSigZipcode

FROM facility_general fg
LEFT JOIN facility_location loc ON loc.facility_id_fk = fg.general_id_pk
LEFT JOIN FacOwner on FacOwner.facility_id_fk = fg.general_id_pk
ORDER BY fg.facility_id_fk;

没有代表性的数据,我只能帮你解决问题。要确定问题,请从以下查询开始

四列是否返回相同的数字

WITH FacOwner AS(
    SELECT 
        facility_id_fk, company,
        contact_first_name, contact_last_name,
        contact_title, contact_address1, contact_address2,
        contact_city, contact_state, contact_zipcode_five,
        contact_zipcode_four, contact_phone_number,
        
        sig_first_name, sig_last_name, 
        sig_title, sig_email,
        sig_address1, sig_address2, sig_city, sig_state, 
        sig_zipcode_five, sig_zipcode_four
        
        FROM Contacts
        WHERE Facility_Role = 'Owner'
)
SELECT count(*), count(distinct fg.general_id_pk), 
count(distinct FacOwner.facility_id_fk),
count(distinct loc.facility_id_fk)
FROM facility_general fg
LEFT JOIN facility_location loc ON loc.facility_id_fk = fg.general_id_pk
LEFT JOIN FacOwner on FacOwner.facility_id_fk = fg.general_id_pk
ORDER BY fg.facility_id_fk;


结果集可以是唯一的,但在您加入的字段中可能仍有重复项。在涉及的3个表中,对联接中涉及的列进行计数(*)和计数(不同..)。那些计数不匹配的可能是问题所在。谢谢@Skaugs-这很有帮助。我得到了332个不同的fg.general_id_pk,这是预期的,但298个不同的设施所有者。设施id_fk。facility owner的结果是302,因此4个计数的差异可能解释了为什么我在加入时获得了336(超出预期)。我将再次查看设施所有者,获取一次以上存在的id的计数。我进行了查询,以查找计数大于1的设施联系人,并找到了扫描完整结果集时忽略的4条重复记录。谢谢我的一位朋友曾经说过,软件开发中没有什么神秘之处。我想他又被证明是对的!很高兴能让你走上正轨!