2017-02-21 6 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しかしCUSTNO上で一意制約の違反に起因するTEMP_CUSTPARAMへの挿入時に。

挿入クエリが完了するまでに時間が掛かっています。 LEFT JOINステートメントでdistinctを使用する方法を知りたいですか?

ありがとうございました。

+0

SELECT部分​​で練習してください。 (そして、INSERTをSELECTで終えたら)いくつかのサンプル・テーブル・データと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/PRDCD TB_CUSTPARAMレコードひいてはクロスでTB_ACCOUNTSレコードを結合するための基準が欠落しています。私はあなたがしたいと思います:

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 - 重要ではない2つのテーブルにデカルト結合がある場合は、おそらくクエリを再訪する必要があります。

クエリの期待が何であるか質問してください。

CUSTNOごとに1つのレコードが必要ですか?または、顧客は複数のレーティングを持つことができますか?

お客様一人一人がビジネスからの感覚を持つことができます。

1)最初にユニークなCUSTNOを取得します。これはDISTINCT句では行われないgenerelにありますが、フィルタ述語を持つ顧客あたりの行が多い場合などに注意してください。最新の行を選択します。

2)レーティングテーブルへの参加