2017-02-21 47 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)加入評分表