使用row_number的PostgreSQL查看唯一键不会返回

时间:2014-08-20 21:13:15

标签: sql postgresql

我认为将几张桌子结合在一起。我需要一个唯一的密钥,因为没有唯一的密钥。我添加了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

0 个答案:

没有答案