左边加入明确的条款

时间:2017-02-21 07:03:08

标签: sql oracle

下面是我的插入查询。

INSERT INTO /*+ APPEND*/ TEMP_CUSTPARAM(CUSTNO, RATING)
SELECT DISTINCT Q.CUSTNO, NVL(((NVL(P.RATING,0) * '10.0')/100),0) AS RATING
FROM TB_ACCOUNTS Q LEFT JOIN TB_CUSTPARAM P
ON P.TEXT_PARAM IN (SELECT DISTINCT PRDCD FROM TB_ACCOUNTS)
AND P.TABLENAME='TB_ACCOUNTS' AND P.COLUMNNAME='PRDCD';

在查询的上一版本P.TEXT_PARAM=Q.PRDCD中,但由于TEMP_CUSTPARAM违反了唯一约束而插入CUSTNO期间。

插入查询需要很长时间才能完成。想知道如何在LEFT JOIN语句中使用distinct。

感谢。

3 个答案:

答案 0 :(得分:1)

 SELECT T1.Col1, T2.Col2 FROM  Table1 T1
  Left JOIN 
(SELECT Distinct Col1, Col2 FROM Table2
) T2 ON T2.Id = T1.Id

答案 1 :(得分:0)

您缺少将TB_ACCOUNTS记录与其相关TB_ACCOUNTS / PRDCD TB_CUSTPARAM记录相关联的条件,从而交叉加入它们。我想你想要:

INSERT INTO /*+ APPEND*/ TEMP_CUSTPARAM(CUSTNO, RATING)
SELECT DISTINCT 
  Q.CUSTNO, 
  NVL(P.RATING, 0) * 0.1 AS RATING
FROM TB_ACCOUNTS Q 
LEFT JOIN TB_CUSTPARAM P ON  P.TEXT_PARAM = Q.PRDCD
                         AND P.TABLENAME = 'TB_ACCOUNTS' 
                         AND P.COLUMNNAME = 'PRDCD';

答案 2 :(得分:0)

如果查询需要年龄完成,请先检查执行计划。您可能会发现一些提示here - 如果您在两个非平凡的表上看到笛卡尔联接,则可能会重新查询该查询。

问问自己对查询的期望是什么。

您期望每CUSTNO个记录一次吗?或者客户可以获得多个评级?

从客户的角度来看,每个客户的一次评估可能是有意义的。获得具有评级的唯一客户列表

1)首先获得一个独特的CUSTNO - 请注意,这不是使用DISTINCT子句,但如果每个客户使用过滤谓词更多行,例如选择最近的一行。

2)而不是加入评级表