2016-08-24 68 views
2

因此,我必须在DB2中编写一个SQL,并且我无法弄清楚如何执行该操作。 喜欢的东西挑这些域代码和它们的值从财务表 只要他们是高于$ 10,000个从同一个表中选择多个(带空值)

Select 
(A.Value), 
(B.Value), 
(C.Value) 

... 

From 
Client K, 
Finance A, 
Finance B, 
Finance C 
... 

的问题是在哪里声明。我不能忍受:

Where 
K.Client = A.Client 
AND A.FieldCode = 1 
AND A.Value > 10000 
AND K.Client = B.Client 
AND B.FieldCode = 2 
AND B.Value > 10000 
... 

等等......因为这并不包括空值,所以它大大降低了结果集,更多的时候,我叫财务表。

如何保持上述格式并使其包含空值,以便只要财务A或财务B或财务C等存在就会显示该行? (注意:做第一个最明显的事情就像重复调用财务表一次,比如说财务A,但没有B,C,D等不能解决这个问题,因为结果(来自A,B,C, D等)不能在许多行上分开)。

这是我做的一个压缩版本:

SELECT 
    A.CLIENT_ID, 
    A.PERIOD_ID, 
    FN0.AMOUNT, 
    FN2.AMOUNT 
FROM ASSESMENT A 
LEFT OUTER JOIN FINANCE FN0 
    ON A.CLIENT_ID = FN0.CLIENT_ID 
    AND A.PERIOD_ID = FN0.PERIOD_ID 
LEFT OUTER JOIN FINANCE FN1 
    ON A.CLIENT_ID = FN1.CLIENT_ID 
    AND A.PERIOD_ID = FN1.PERIOD_ID 
WHERE 
    FN0.FLD_CD = 1258860 
AND FN1.FLD_CD = 1258861 

林仍然是,如果我空出的FN1相关的线,我得到了很多的返回值的问题。 AKA它仍然不包含NULL值,并且只有在所有字段代码都有值时才返回值。

回答

3

你需要Left Outer Join,而不是逗号分隔INNER Join

SELECT A.Value, 
     B.Value, 
     C.Value 
FROM Client K 
     LEFT JOIN Finance A 
       ON K.Client = A.Client 
       AND A.Value > 10000 
       AND A.FieldCode = 1 
     LEFT JOIN Finance B 
       ON K.Client = B.Client 
       AND B.Value > 10000 
       AND B.FieldCode = 2 
     LEFT JOIN Finance C 
       ON K.Client = c.Client 
       ...... 

更新:

移动左表过滤器ON条件否则将被隐式转换为INNER JOIN。像这样尝试

SELECT A.client_id, 
     A.period_id, 
     FN0.amount, 
     fn2.amount 
FROM assesment A 
     LEFT OUTER JOIN finance FN0 
        ON A.client_id = FN0.client_id 
         AND A.period_id = FN0.period_id 
         AND FN0.fld_cd = 1258860 
     LEFT OUTER JOIN finance FN1 
        ON A.client_id = FN1.client_id 
         AND A.period_id = FN1.period_id 
         AND FN1.fld_cd = 1258861 
+0

感谢您的回复。我不知道它的工作原理。但首先:我不能添加行AND A.FieldCode = 1到from语句,它说无效的ON语句。任何想法为什么?目前,我把A.FieldCode行放在了它的工作地点......但是我想这可以避免练习的全部重点? – Ardia

+0

@Ardia *我无法添加行AND A.FieldCode = 1 *显示您添加的完整代码AND AND.FieldCode = 1' –

+0

更新了主要问题中的代码。仍然没有摆脱空? – Ardia