LEFT JOIN 导致重复行 - ORACLE
LEFT JOIN resulting in duplicate row - ORACLE
我正在使用 WITH 子句编写子查询,并将其加入主查询。
主查询的结果集为 332 条记录,子查询的结果集为 302 条记录。
如果我对主查询执行 LEFT JOIN
子查询,我希望得到 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;
没有代表性的数据,只能帮你解决问题。要确定问题,请从以下查询开始。
是否所有四列 return 都是相同的数字?
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;
我正在使用 WITH 子句编写子查询,并将其加入主查询。
主查询的结果集为 332 条记录,子查询的结果集为 302 条记录。
如果我对主查询执行 LEFT JOIN
子查询,我希望得到 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;
没有代表性的数据,只能帮你解决问题。要确定问题,请从以下查询开始。
是否所有四列 return 都是相同的数字?
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;