我认为将几张桌子结合在一起。我需要一个唯一的密钥,因为没有唯一的密钥。我添加了row_number:
CREATE OR REPLACE VIEW ect_va_alert_vw AS
SELECT *, row_number() OVER() AS id
FROM (
( ( SELECT equi_raw.uid AS vendor_alert_uid, 'EQUIFAX' AS alert_type, 'VA_EQUIFAX_RAW_ALERT' AS alert_table,
equi_raw.name_business, equi_raw.name_dba, equi_bus.std_name_business,
equi_addr.std_addr_primary, equi_addr.std_addr_state, equi_addr.std_addr_postal_cd,
equi_phone.std_phone, equi_raw.email, equi_person.std_name_first as con_std_name_first, equi_person.std_name_last as con_std_name_last,
equi_raw.active_dt, equi_raw.sequence_num AS sequence_num, equi_addr.sequence_num AS addr_sequence_num,
equi_bus.sequence_num AS bus_sequence_num, equi_person.sequence_num AS contact_sequence_num,
equi_phone.sequence_num AS phone_sequence_num
FROM va_equifax_raw_alert equi_raw
LEFT JOIN va_equifax_addr_alert equi_addr ON equi_raw.sequence_num = equi_addr.raw_sequence_num
LEFT JOIN va_equifax_business_alert equi_bus ON equi_raw.sequence_num = equi_bus.raw_sequence_num
LEFT JOIN va_equifax_person_alert equi_person ON equi_raw.sequence_num = equi_person.raw_sequence_num
LEFT JOIN va_equifax_phone_alert equi_phone ON equi_raw.sequence_num = equi_phone.raw_sequence_num
WHERE equi_raw.entry_active = true
UNION ALL
SELECT exp.uid AS vendor_alert_uid, 'EXPERIAN' AS alert_type, 'VA_EXPERIAN_ALERT' AS alert_table,
exp.name_business, exp.name_dba, exp.std_name_business,
exp.std_addr_primary, exp.std_addr_state, exp.std_addr_postal_cd,
exp.bus_phone AS std_phone, exp.email,
exp.std_contact_first AS con_std_name_first, exp.std_contact_last AS con_std_name_last, exp.active_dt,
exp.sequence_num AS sequence_num, exp.sequence_num AS addr_sequence_num,
exp.sequence_num AS bus_sequence_num, exp.sequence_num AS contact_sequence_num,
exp.sequence_num AS phone_sequence_num
FROM va_experian_alert exp
WHERE exp.entry_active = true)
UNION ALL
SELECT tu.uid AS vendor_alert_uid, 'TU' AS alert_type, 'VA_TU_ALERT' AS alert_table,
tu.name_business, tu.name_dba, tu.std_name_business,
tu.std_bus_addr_primary AS std_addr_primary, tu.std_bus_addr_state AS std_addr_state, tu.std_bus_addr_postal_cd AS std_addr_postal_cd,
tu.std_bus_phone AS std_phone, tu.email,
tu.std_principle_first AS con_std_name_first, tu.std_principle_last AS con_std_name_last, tu.active_dt,
tu.sequence_num AS sequence_num, tu.sequence_num AS addr_sequence_num,
tu.sequence_num AS bus_sequence_num, tu.sequence_num AS contact_sequence_num,
tu.sequence_num AS phone_sequence_num
FROM va_tu_alert tu
WHERE tu.entry_active = true)
UNION ALL
SELECT name.uid AS vendor_alert_uid, 'NAME' AS alert_type, 'VA_NAME_ALERT' AS alert_table,
name.name_business, '' AS name_dba, name.std_name_business,
'' AS std_addr_primary, '' AS std_addr_state, '' AS std_addr_postal_cd,
'' AS std_phone, '' AS email,
name.std_name_first AS con_std_name_first, name.std_name_last as con_std_name_last, name.active_dt,
name.sequence_num AS sequence_num, name.sequence_num AS addr_sequence_num,
name.sequence_num AS bus_sequence_num, name.sequence_num AS contact_sequence_num,
name.sequence_num AS phone_sequence_num
FROM va_name_alert name
WHERE name.entry_active = true
) x
当我尝试以任何方式加入或查询此视图时,没有任何返回。
EXPLAIN (ANALYZE, BUFFERS) SELECT recon_alerts.* FROM ect_recon_acct_alerts recon_alerts
LEFT JOIN ect_recon_field_acct field_acct ON recon_alerts.ect_recon_field_acct_id = field_acct.id
LEFT JOIN corp_cred_unit_alert cu_alert ON recon_alerts.cred_unit_alert_id = cu_alert.cred_unit_alert_id
LEFT JOIN ect_va_alert_vw va_alert ON va_alert.id = (select id from ect_va_alert_vw WHERE recon_alerts.uid = vendor_alert_uid AND recon_alerts.sequence_num = bus_sequence_num limit 1)
WHERE recon_alerts.recon_report_type_id = 7 OR recon_alerts.recon_report_type_id = 12;
我正在使用id,因为我在视图中没有唯一的键。是否有其他方法可以在视图的JOIN中获取唯一记录?
EXPLAIN (ANALYZE, BUFFERS) SELECT recon_alerts.*
FROM ect_recon_acct_alerts recon_alerts
LEFT JOIN ect_recon_field_acct field_acct ON recon_alerts.ect_recon_field_acct_id = field_acct.id
LEFT JOIN corp_cred_unit_alert cu_alert ON recon_alerts.cred_unit_alert_id = cu_alert.cred_unit_alert_id
LEFT JOIN ect_va_alert_vw va_alert ON recon_alerts.uid = va_alert.vendor_alert_uid AND recon_alerts.sequence_num = va_alert.bus_sequence_num
WHERE recon_alerts.recon_report_type_id = 7 OR recon_alerts.recon_report_type_id = 12;
此查询返回但返回多行。我需要限制为1
以下是查询计划:
Merge Left Join (cost=3102.82..7136009508.14 rows=11420 width=148)
Merge Cond: (((SubPlan 1)) = va_alert.id)
-> Sort (cost=185.25..185.76 rows=202 width=148)
Sort Key: ((SubPlan 1))
-> Bitmap Heap Scan on ect_recon_acct_alerts recon_alerts (cost=10.13..177.52 rows=202 width=148)
Recheck Cond: ((recon_report_type_id = 7) OR (recon_report_type_id = 12))
-> BitmapOr (cost=10.13..10.13 rows=203 width=0)
-> Bitmap Index Scan on idx_recon_alerts_report_type (cost=0.00..5.42 rows=156 width=0)
Index Cond: (recon_report_type_id = 7)
-> Bitmap Index Scan on idx_recon_alerts_report_type (cost=0.00..4.60 rows=47 width=0)
Index Cond: (recon_report_type_id = 12)
SubPlan 1
-> Limit (cost=0.00..614008.45 rows=1 width=8)
-> Subquery Scan on ect_va_alert_vw (cost=0.00..614008.45 rows=1 width=8)
Filter: ((($0)::text = (ect_va_alert_vw.vendor_alert_uid)::text) AND ($1 = ect_va_alert_vw.bus_sequence_num))
-> WindowAgg (cost=0.00..613838.85 rows=11307 width=3464)
-> Append (cost=0.00..613584.44 rows=11307 width=178)
-> Subquery Scan on "*SELECT* 1" (cost=0.00..612821.60 rows=4851 width=196)
-> Nested Loop Left Join (cost=0.00..612773.09 rows=4851 width=196)
Join Filter: (equi_raw.sequence_num = equi_phone.raw_sequence_num)
-> Nested Loop Left Join (cost=0.00..394809.23 rows=3374 width=178)
Join Filter: (equi_raw.sequence_num = equi_bus.raw_sequence_num)
-> Nested Loop Left Join (cost=0.00..239404.24 rows=2957 width=151)
Join Filter: (equi_raw.sequence_num = equi_person.raw_sequence_num)
-> Nested Loop Left Join (cost=0.00..126472.38 rows=2702 width=129)
Join Filter: (equi_raw.sequence_num = equi_addr.raw_sequence_num)
-> Index Scan using va_equifax_raw_alert_pkey on va_equifax_raw_alert equi_raw (cost=0.00..418.63 rows=2545 width=84)
Filter: entry_active
-> Materialize (cost=0.00..84.50 rows=3300 width=53)
-> Seq Scan on va_equifax_addr_alert equi_addr (cost=0.00..68.00 rows=3300 width=53)
-> Materialize (cost=0.00..62.77 rows=2785 width=30)
-> Seq Scan on va_equifax_person_alert equi_person (cost=0.00..48.85 rows=2785 width=30)
-> Materialize (cost=0.00..82.53 rows=3502 width=35)
-> Seq Scan on va_equifax_business_alert equi_bus (cost=0.00..65.02 rows=3502 width=35)
-> Materialize (cost=0.00..98.58 rows=4305 width=26)
-> Seq Scan on va_equifax_phone_alert equi_phone (cost=0.00..77.05 rows=4305 width=26)
-> Subquery Scan on "*SELECT* 2" (cost=0.00..743.61 rows=6205 width=146)
-> Seq Scan on va_experian_alert exp (cost=0.00..681.56 rows=6205 width=146)
Filter: entry_active
-> Subquery Scan on "*SELECT* 3" (cost=0.00..12.56 rows=175 width=172)
-> Seq Scan on va_tu_alert tu (cost=0.00..10.81 rows=175 width=172)
Filter: entry_active
-> Subquery Scan on "*SELECT* 4" (cost=0.00..6.67 rows=76 width=1628)
-> Seq Scan on va_name_alert name (cost=0.00..5.91 rows=76 width=1628)
Filter: entry_active
-> Sort (cost=2917.57..2945.84 rows=11307 width=8)
Sort Key: va_alert.id
-> Subquery Scan on va_alert (cost=432.57..2156.33 rows=11307 width=8)
-> WindowAgg (cost=432.57..2043.26 rows=11307 width=3464)
-> Append (cost=432.57..1788.86 rows=11307 width=178)
-> Subquery Scan on "*SELECT* 1" (cost=432.57..1026.02 rows=4851 width=196)
-> Hash Left Join (cost=432.57..977.51 rows=4851 width=196)
Hash Cond: (equi_raw.sequence_num = equi_phone.raw_sequence_num)
-> Hash Left Join (cost=301.71..692.70 rows=3374 width=178)
Hash Cond: (equi_raw.sequence_num = equi_bus.raw_sequence_num)
-> Hash Left Join (cost=192.91..498.41 rows=2957 width=151)
Hash Cond: (equi_raw.sequence_num = equi_addr.raw_sequence_num)
-> Hash Left Join (cost=83.66..310.86 rows=2785 width=106)
Hash Cond: (equi_raw.sequence_num = equi_person.raw_sequence_num)
-> Seq Scan on va_equifax_raw_alert equi_raw (cost=0.00..113.45 rows=2545 width=84)
Filter: entry_active
-> Hash (cost=48.85..48.85 rows=2785 width=30)
-> Seq Scan on va_equifax_person_alert equi_person (cost=0.00..48.85 rows=2785 width=30)
-> Hash (cost=68.00..68.00 rows=3300 width=53)
-> Seq Scan on va_equifax_addr_alert equi_addr (cost=0.00..68.00 rows=3300 width=53)
-> Hash (cost=65.02..65.02 rows=3502 width=35)
-> Seq Scan on va_equifax_business_alert equi_bus (cost=0.00..65.02 rows=3502 width=35)
-> Hash (cost=77.05..77.05 rows=4305 width=26)
-> Seq Scan on va_equifax_phone_alert equi_phone (cost=0.00..77.05 rows=4305 width=26)
-> Subquery Scan on "*SELECT* 2" (cost=0.00..743.61 rows=6205 width=146)
-> Seq Scan on va_experian_alert exp (cost=0.00..681.56 rows=6205 width=146)
Filter: entry_active
-> Subquery Scan on "*SELECT* 3" (cost=0.00..12.56 rows=175 width=172)
-> Seq Scan on va_tu_alert tu (cost=0.00..10.81 rows=175 width=172)
Filter: entry_active
-> Subquery Scan on "*SELECT* 4" (cost=0.00..6.67 rows=76 width=1628)
-> Seq Scan on va_name_alert name (cost=0.00..5.91 rows=76 width=1628)
Filter: entry_active