使用来自另一个 table 行的最大匹配项更新行

Update rows with max matches from rows of another table

我在 8mln 行周围有 table1 并且想在搜索 tale2 中的每一行后用最大匹配更新列 status (基于 rows from table2)

的最大匹配

示例table1

ID |  a  |  b  |  c  |  d  |  e  |  f  |  g  | grade | status |
--------------------------------------------------------------- 
01 | 100 | 101 | 105 | 108 | 110 | 126 | 188 |   x   |        |

示例 table2(大约 100k 行):

 a  |  b  | c  |  d  | e  |  f  |  g  |
----------------------------------------
 75 | 101 |106 | 107 |110 | 122 | 188 |
100 | 104 |105 | 110 |114 | 126 | 188 |
 95 | 100 |105 | 108 |126 | 207 | 285 |

基于以上示例,结果将为 5 因为;

所以 maximum/highest 匹配是 5 来自 table2

中的 second row

更新 table1 列后的示例 status:

ID |  a  |  b  |  c  |  d  |  e  |  f  |  g  | grade | status |
--------------------------------------------------------------- 
01 | 100 | 101 | 105 | 108 | 110 | 126 | 188 |   x   |   5    |

我正在使用此处显示的脚本,但更新整个报告需要很长时间,而且结果也不准确。
所以,如果有人可以通过减少查询的执行时间

来提供替代/更好的option/script,我将不胜感激
UPDATE public.table1 AS t1 SET status = 
(SELECT MAX(tmp.mtch) FROM 
    (SELECT   (SELECT CASE WHEN t1.a=t2.a THEN 1 ELSE 0 END) + 
              (SELECT CASE WHEN t1.b=t2.b THEN 1 ELSE 0 END) + 
              (SELECT CASE WHEN t1.c=t2.c THEN 1 ELSE 0 END) + 
              (SELECT CASE WHEN t1.d=t2.d THEN 1 ELSE 0 END) +
              (SELECT CASE WHEN t1.e=t2.e THEN 1 ELSE 0 END) +
              (SELECT CASE WHEN t1.f=t2.f THEN 1 ELSE 0 END) +
              (SELECT CASE WHEN t1.g=t2.g THEN 1 ELSE 0 END)
      AS mtch FROM public.table2 AS t2 ) AS tmp );
     

我认为下面的查询应该适合你 -

UPDATE public.table1 AS t1 SET status = 
(SELECT MAX(tmp.mtch)
  FROM (SELECT SUM(CASE WHEN t1.a IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
               SUM(CASE WHEN t1.b IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
               SUM(CASE WHEN t1.c IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
               SUM(CASE WHEN t1.d IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
               SUM(CASE WHEN t1.e IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
               SUM(CASE WHEN t1.f IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
               SUM(CASE WHEN t1.g IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
               AS mtch
          FROM public.table2 AS t2 ) AS tmp )
 WHERE t1.grade>0;