INSERT OVERWRITE TABLE dw_rpt_report60010105049 SELECT COALESCE(n.char3, dw.tran_country) AS tran_country, dw.col2, dw.col3, ... FROM dw_rpt_report60010105049 dw LEFT JOIN ( SELECT char2, MAX(char3) AS char3 FROM orsuser_kara.para_nationality GROUP BY char2 ) n ON dw.tran_country = n.char2 WHERE n.char2 IS NOT NULL 此段代码中的主表的tran_country不是唯一的,但是他是明细表,除了关联字段不唯一其他字段都是唯一的,还是可能会导致发散,怎么优化
时间: 2024-02-18 15:02:37 浏览: 57
针对这个问题,你可以考虑使用子查询或者临时表的方式,将明细表聚合成唯一的记录,然后再与主表进行关联。
例如,你可以先使用以下 SQL 语句将明细表中的 tran_country 字段聚合成唯一的记录,并将结果保存到一个临时表中:
```
CREATE TEMPORARY TABLE temp_nationality AS
SELECT char2, MAX(char3) AS char3
FROM orsuser_kara.para_nationality
GROUP BY char2;
```
然后,你可以将主表与临时表进行关联,这样就可以避免使用非唯一的 tran_country 字段:
```
INSERT OVERWRITE TABLE dw_rpt_report60010105049
SELECT COALESCE(n.char3, dw.tran_country) AS tran_country, dw.col2, dw.col3, ...
FROM dw_rpt_report60010105049 dw
LEFT JOIN temp_nationality n ON dw.tran_country = n.char2
WHERE n.char2 IS NOT NULL;
```
这样做的好处是,可以避免明细表中的 tran_country 字段出现重复值时导致结果发散的问题。同时,使用临时表的方式也可以提高 SQL 查询的效率。
相关问题
INSERT OVERWRITE TABLE dw_rpt_report60010105049 SELECT COALESCE(n.char3, dw.tran_country) AS tran_country, dw.col2, dw.col3, ... FROM dw_rpt_report60010105049 dw LEFT JOIN ( SELECT char2, MAX(char3) AS char3 FROM orsuser_kara.para_nationality GROUP BY char2 ) n ON dw.tran_country = n.char2 WHERE n.char2 IS NOT NULL 此段代码中的主表的tran_country不是唯一的,可能会导致发散,怎么优化
可以考虑使用子查询或者临时表的方式,先将主表的tran_country进行去重,再进行JOIN操作。具体实现方式如下:
使用子查询:
```
INSERT OVERWRITE TABLE dw_rpt_report60010105049
SELECT COALESCE(n.char3, t.tran_country) AS tran_country, t.col2, t.col3, ...
FROM (
SELECT DISTINCT tran_country, col2, col3, ...
FROM dw_rpt_report60010105049
) t
LEFT JOIN (
SELECT char2, MAX(char3) AS char3
FROM orsuser_kara.para_nationality
GROUP BY char2
) n ON t.tran_country = n.char2
WHERE n.char2 IS NOT NULL
```
使用临时表:
```
CREATE TEMPORARY TABLE temp_table AS
SELECT DISTINCT tran_country, col2, col3, ...
FROM dw_rpt_report60010105049;
INSERT OVERWRITE TABLE dw_rpt_report60010105049
SELECT COALESCE(n.char3, t.tran_country) AS tran_country, t.col2, t.col3, ...
FROM temp_table t
LEFT JOIN (
SELECT char2, MAX(char3) AS char3
FROM orsuser_kara.para_nationality
GROUP BY char2
) n ON t.tran_country = n.char2
WHERE n.char2 IS NOT NULL;
DROP TEMPORARY TABLE temp_table;
```
无论使用哪种方式,在进行JOIN操作之前,都先对主表进行去重,这样可以避免发散的情况发生,提高查询效率。
INSERT OVERWRITE TABLE dw_rpt_report60010105049 SELECT ( SELECT MAX(char3) FROM orsuser_kara.para_nationality WHERE char2 = dw.tran_country ) AS tran_country, col2, col3, ... FROM dw_rpt_report60010105049 dw WHERE EXISTS ( SELECT 1 FROM orsuser_kara.para_nationality WHERE char2 = dw.tran_country ) 不用子查询作字段的写法,换一种写法
可以使用 JOIN 实现类似的功能,以下是可能的写法:
```
INSERT OVERWRITE TABLE dw_rpt_report60010105049
SELECT
COALESCE(n.char3, dw.tran_country) AS tran_country,
dw.col2,
dw.col3,
...
FROM dw_rpt_report60010105049 dw
LEFT JOIN orsuser_kara.para_nationality n
ON dw.tran_country = n.char2
WHERE n.char2 IS NOT NULL
```
这里使用了 LEFT JOIN,将原表和 `orsuser_kara.para_nationality` 表进行 JOIN 操作。在 JOIN 操作中,使用 `COALESCE` 函数将 `orsuser_kara.para_nationality` 表中的 `char3` 字段和原表中的 `tran_country` 字段合并成一个字段。如果 `orsuser_kara.para_nationality` 表中不存在与原表中的 `tran_country` 字段匹配的值,则 `COALESCE` 函数会返回原表中的 `tran_country` 字段。最后使用 WHERE 子句过滤掉没有匹配的记录。
阅读全文