1

データの異常を修正するのに助けが必要です。Left Join を使用して 2 つのテーブルに基づいてビューを作成すると、結果にいくつかの重複があります (ロジック セクションで説明されているように)。

データ設定:

*******************
       TEST1
*******************
PRODUCT VALUE1  KEY
1       2       12
1       3       13
1       4       14
1       5       15

*******************
       TEST2
*******************
KEY ATTRIBUTE
12  DESC
13  (null)
14  DESC
15  (null)

これまでに試したこと

SELECT 
    B.KEY,
    B.ATTRIBUTE,
    A.PRODUCT
    A.VALUE1
FROM TEST2 B LEFT JOIN TEST1 A ON TEST2.KEY = TEST1.KEY;

上記のSQLで得られるのは

KEY ATTRIBUTE   PRODUCT VALUE1
12  DESC        1       2
13  (null)      1       3
14  DESC        1       4
15  (null)      1       5

私が得る必要があるもの

KEY ATTRIBUTE   PRODUCT VALUE1
12  DESC        1       2
13  DESC        1       3
14  DESC        1       4
15  DESC        1       5

ロジック: ID 1 のすべての製品は同じであるため、NULL の場合は属性を保持する必要があります。したがって、PRODUCT と ATTRIBUTE を区別すると、製品 ID ごとに常に 1 行になります。Test1 には 100 を超える製品があり、Test2 には対応する説明があります。

注:これはデータ ウェアハウジングであるため、正規化された設計ではありません。なのでデザインに関してはノークレームでお願いします

属性フィールドに CASE ステートメントを入れたいです。

CASE
    WHEN ATTRIBUTE IS NULL THEN {fix goes here}
    ELSE ATTRIBUTE 
END AS ATTRIBUTE

誰かがフィドルを見る必要があり、それからここに行きます

4

3 に答える 3

4

明確ではありませんが、各製品の属性は 1 つだけであると言う場合は、使用してみてくださいMAX() OVER

SELECT 
TEST1.Product,
TEST1.value1,
TEST2.KEY,
MAX(ATTRIBUTE) OVER (PARTITION BY test1.Product) ATTR
FROM TEST2 
  LEFT JOIN 
       TEST1 ON TEST2.KEY = TEST1.KEY

SQLFiddle demo

于 2014-06-04T13:26:51.513 に答える
2

SQLフィドル

SELECT B.KEY,
  CASE WHEN B.ATTRIBUTE IS NULL THEN 
  (
    SELECT s2.ATTRIBUTE
    FROM test2 s2
    LEFT JOIN TEST1 s1 ON s1.KEY = s2.KEY
    WHERE s1.PRODUCT = A.PRODUCT
    AND s2.ATTRIBUTE IS NOT NULL
    AND ROWNUM = 1
  ) ELSE B.ATTRIBUTE END AS ATTRIBUTE, 
  A.PRODUCT, A.VALUE1
FROM TEST2 B 
LEFT JOIN TEST1 A ON A.KEY = B.KEY;
于 2014-06-04T13:29:02.643 に答える
0
SELECT 
NVL(attribute,'DESC')
FROM TEST2 LEFT JOIN TEST1 ON TEST2.KEY = TEST1.KEY;

そのオラクルを見ただけで、上記を試してください

于 2014-06-04T13:37:39.877 に答える