2017-08-11 48 views
0

我有一个100m +行的大表和两个较小的行2m行ea。所有这三个表都有一列公司名称,需要发送给API进行匹配。我想从每列中选择字符串,然后合并为一列唯一字符串。PostgreSQL从三个不同的列中选择唯一身份证

我正在使用此响应的一个版本,但毫不奇怪,性能非常缓慢。 Combined 2 columns into one column SQL

SELECT DISTINCT 
    unnest(string_to_array(upper(t.buyer) || '#' || upper(a.aw_supplier_name) || '#' || upper(b.supplier_source_string), '#')) 
FROM 
    tenders t, 
    awards a, 
    banking b 
; 

一个更高性能的方式来实现这一目标的任何想法?

更新:银行表是100米行最大的表。

+1

注意:您正在尝试俾斯麦连接,导致100M x 100 x 100:= 1E12元组(然后在其上执行截然不同的操作)。这是你真正想要的吗? – wildplasser

回答

1

假设的PostgreSQL 9.6和rd_nielsen的回答借用选择,以下应该给你一个逗号分隔的不同名称的字符串。

WITH cte 
AS (
    SELECT UPPER(T.buyer) NAMES 
    FROM tenders T 

    UNION 

    SELECT UPPER(A.aw_supplier_name) NAMES 
    FROM awards A 

    UNION 

    SELECT UPPER(b.supplier_source_string) NAMES 
    FROM banking b 
    ) 
SELECT array_to_string(ARRAY_AGG(cte.names), ',') 
FROM cte 
1

从所有三个表得到的只是一个组合的名字的列表,你可以改为union在一起,每个表的选择,像这样:

select 
    upper(t.buyer) 
from 
    tenders t 
union 
select 
    upper(a.aw_supplier_name) 
from 
    awards a 
union 
select 
    upper(b.supplier_source_string) 
from 
    banking b 
; 
相关问题