使用LEFT JOIN时的CASE语句

时间:2014-06-04 13:10:42

标签: sql oracle join kognitio kognitio-wx2

我需要一些帮助来修复数据偏差。我基于两个带左连接的表创建一个视图,结果有一些重复(如逻辑部分所示)

数据设置:

*******************
       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

有人需要看小提琴,然后去here

3 个答案:

答案 0 :(得分:4)

目前尚不清楚,但如果您说每个产品只能有一个属性,那么请尝试使用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

答案 1 :(得分:2)

SQL Fiddle

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;

答案 2 :(得分:0)

SELECT 
NVL(attribute,'DESC')
FROM TEST2 LEFT JOIN TEST1 ON TEST2.KEY = TEST1.KEY;

刚看到它的Oracle请尝试上面

相关问题