2017-02-21 45 views
-1

以下是我的插入查询。左连接与不同的子句

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声明不同。

感谢。

+0

练习SELECT部分​​。 (完成后用SELECT做INSERT。)你能添加一些示例表数据和SELECT的预期结果吗? (以及格式化文本) – jarlh

+0

更改内部选择到内部联接,你应该很好去 – Veljko89

+1

任何机会,你错过了ON子句中的Q.CUSTNO谓词?没有列Q引用的列。 –

回答

1
SELECT T1.Col1, T2.Col2 FROM Table1 T1 
    Left JOIN 
(SELECT Distinct Col1, Col2 FROM Table2 
) T2 ON T2.Id = T1.Id 
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'; 
0

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

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

您是否期望每个CUSTNO有一条记录?或者客户可以有多个评级?

从业务角度来看,每个客户都可以有一定的感觉。 1)首先得到一个UNIQUE CUSTNO - 注意,这是在generel中没有用DISTINCT子句完成的,但是如果用过滤谓词的话,每个客户有更多的行,例如,选择最近的一行。

2)加入评分表