2017-08-03 5 views
0

oracle sqlを使用してテーブルを結合しています。今までOracle Sql新しいテーブルに参加するときに重複する行

SELECT 
T.TRANSACTION_KEY, 
PR.ACCOUNT_KEY, 
T.ACCT_CURR_AMOUNT, 
T.EXECUTION_LOCAL_DATE_TIME, 
TC.DESCRIPTION, 
T.OPP_ACCOUNT_NAME, 
T.OPP_COUNTRY, 
PT.PARTY_TYPE_DESC, 
P.PARTY_NAME, 
P.CUSTOM_SMALL_STRING_02, 
CO.COUNTRY_NAME, 
LE.LIST_CD 

FROM TRANSACTIONS T 
LEFT JOIN TRANSACTION_CODE TC 
ON T.TRANSACTION_CODE = TC.ENTITY 
LEFT JOIN PARTY_ACCOUNT_RELATION PR 
ON T.ACCOUNT = PR.ACCOUNT 
LEFT JOIN PARTY P 
ON PR.PARTY_KEY = P.PARTY_KEY 
LEFT JOIN PARTY_TYPE PT 
ON P.PARTY_TYPE = PT.ENTITY 
LEFT JOIN COUNTRY CO 
ON T.OPP_COUNTRY = CO.ENTITY 
LEFT JOIN LISTED_ENTITY LE 
ON CO.COUNTRY = LE.ENTITY_KEY 

WHERE 
    PR.PARTY_KEY = '111111111' and T.EXECUTION_LOCAL_DATE_TIME>'2017-01-01'; 

それが正常に動作しますが、私はPARTY_ACCOUNT_RELATIONテーブル(ACCOUNT_KEY)と共通(ENTITY_KEY)内の列を持つ別のテーブルに参加したいと私は、新しいテーブルの一部を含める:私は、次のコードを使用します私がそれを行うと、それは公表されます。私は "場所"の前に次の行を追加しています。

LEFT JOIN EVALUATE_RULE ER 
ON PR.ACCOUNT_KEY = ER.ENTITY_KEY 

誰が問題がどこにあるか知っていますか?

+0

mysqlまたはOracle?互換性のないタグを削除してください – Jens

+0

Oracle sqlを使用しています。 –

+1

真のLEFT JOIN結果を得るには、WHERE句のPR条件をON句に移動します。 – jarlh

答えて

1

既存のクエリに別のテーブルに参加すると、既存の行を複製する原因となる場合に接合されているテーブルは、あなたのケースでは参加

ためのキーとして使用されている列に重複した値を持っているので、それは、もしそうなら、

SELECT ENTITY_KEY FROM EVALUATE_RULE GROUP BY ENTITY_KEY HAVING COUNT(*) > 1 

重複しているentity_keysが表示されます。これらの重複が既存のデータに結合されている場合、既存のデータを倍にして、同じENTITY_KEYを持つEVALUATE_RULEの両方の行が結果セットに存在するようにする必要があります。

テーブルをデデュープするか、 EVALUATE_RULEから来る行をさらに制限するためにON条件を指定します。

例えば、EVALUATE_RULEを追加し、あなたのSELECTリストにER.*を入れた後、あなたはERから行がstatus = 'old'status = 'current'ですが、あなたはあなただけcurrentなものをしたい知っていることを見ることができることを想像...だからあなたのON句でAND er.status = 'current'を置きます

LEFT JOIN 
(SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.entity_key ORDER BY e.name) as rown FROM evaluate_rule e) er 
ON 
    er.entity_key = pr.account_key and 
    er.rown = 1 

コメントが複数のレコードは、あなたが気にしないいくつかの列によって異なりますので、この技術はただ一つだけの行を選択することを示します10あなたは、この作業の理由についての情報が欲しい場合は、孤立しているSQLを実行します。それはちょうど、テーブル内の各行に番号を割り当て

SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.entity_key ORDER BY e.name) as rown FROM evaluate_rule e 

ORDER BY e.entity_key -- i added this to make it more clear what is going on. You don't need it in your main query 

、数は1たびentity_keyの変更で再起動するので、私たちはその後、選択することができます今、最新のcreated_date行は常にを持っています

SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.entity_key ORDER BY e.created_date DESC) as rown FROM evaluate_rule e 

:それは判明した場合、あなたが「evaluate_ruleからの最新行」のような具体的な何かをしたいですかrown = 1

を持つすべてのものは、あなたはこのようなものを使用することができます

+0

レコードの中で、NAMEフィールドは違いますが、違いはありません。ダブルレコードのうちの1つだけを選択する方法はありますか? –

+0

@zahrarabieiアドバイスを追加しました –

+0

ありがとうございます、今すぐ使えます! –

0

説明から除外できない限り、EVALUATE_RULEテーブルにはACCOUNT_KEY = ENTITY_KEYのモロレコードがあります。私はあなたが最終的にEVALUATE_RULE列をINCLUDできるように私の答えを変更することができます

LEFT JOIN EVALUATE_RULE ER ON PR.ACCOUNT_KEY = ER.ENTITY_KEY 

LEFT JOIN (SELECT DISTINCT ENTITY_KEY FROM EVALUATE_RULE) ER ON PR.ACCOUNT_KEY = ER.ENTITY_KEY 

あなたがEVALUATE_RULEの構造を投稿した場合(PK列を示す)へ:

あなたはあなたのクエリのセクションを変更することができますクエリ。

+0

これはうまくいくかもしれませんが、クエリに何も追加しないので、ほとんど役に立ちません!それがすることは、あなたがすでに知っている値の別個のセットに参加することだけです。 OPは「新しいテーブルの列の一部を含める」ことを忘れないでください。 DISTINCTを使用して重複をスクラッシュすることは、ほとんどの状況で、ラーメン/遅延SQLの習慣です。 EVALUATE_RULEの新しい行のどれが望ましくないかを特定し、それらを除外して一意のENTITY_KEYSを取得する方が良いでしょう。あとで返すだけでなく、 –

+0

@CAiusのように、今では指定されているように、私はテーブル構造に関する情報を待っています。 – etsa

関連する問題