2014-11-25 70 views
2

我的目標是左連接表'anla'和'anlz',但只包含anlz字段'bdatu'的值最小的所有行。只接受在特定字段中具有最小值的行

我創建了一個SQL撥弄模式:http://sqlfiddle.com/#!2/ad3ab2/5

不幸的是我需要它的ABAP程序與Oracle數據庫,MySQL的沒有,所以this example不會爲我工作。我添加了MySQL標籤來獲得更多的輸入和可能的解決方案。

表anla:

anln1 | anln2 
-------------- 
10000 | 0 
10000 | 1 
10000 | 2 
10000 | 3 
10001 | 0 
10001 | 1 
10001 | 2 
10002 | 0 
10003 | 0 
10004 | 0 
10005 | 0 
10005 | 1 
10006 | 0 
10006 | 1 
10007 | 0 
10007 | 1 

表anlz:

anln1 | anln2 | kostlv | bdatu 
--------------------------------- 
10000 | 0 | 123 | 200
10000 | 0 | 456 | 99991231 
10000 | 1 | 123 | 99991231 
10000 | 2 | 456 | 99991231 
10000 | 3 | 789 | 99991231 
10001 | 0 | 123 | 99991231 
10001 | 1 | 123 | 99991231 
10001 | 2 | 123 | 99991231 
10002 | 0 | 123 | 99991231 
10003 | 0 | 456 | 99991231 
10004 | 0 | 123 | 99991231 
10005 | 0 | 123 | 99991231 
10005 | 1 | 456 | 99991231 
10006 | 0 | 123 | 200
10006 | 0 | 456 | 99991231 
10006 | 1 | 123 | 99991231 
10007 | 0 | 123 | 200
10007 | 0 | 123 | 99991231 
10007 | 1 | 123 | 99991231 

期待您的幫助!

+0

只是要清楚,期望的結果是什麼?此外,anla和anlz似乎都有一個您在上面排除的id列。 – Strawberry 2014-11-25 11:59:23

回答

1

你幾乎擁有了,小調整需要:

SELECT DISTINCT anla.anln1, anla.anln2, z.kostlv, z.bdatu 
FROM anla 
LEFT OUTER JOIN 
      (SELECT anlz.anln1, anlz.kostlv, min(anlz.bdatu) as bdatu /* note this here*/ 
       FROM anlz 
       GROUP BY anlz.anln1 
       HAVING MIN(anlz.bdatu) > 0) AS Z 
on anla.anln1= z.anln1 

你只需要拿起min(anlz.bdatu)以及在子查詢!

Fiddle Here

輸出

ANLN1 ANLN2 KOSTLV BDATU 

10000 0  123 200
10000 1  123 200
10000 2  123 200
10000 3  123 200
10001 0  123 99991231 
10001 1  123 99991231 
10001 2  123 99991231 
10002 0  123 99991231 
10003 0  456 99991231 
10004 0  123 99991231 
10005 0  123 99991231 
10005 1  123 99991231 
10006 0  123 200
10006 1  123 200
10007 0  123 200
10007 1  123 200

Logic是簡單這裏,挑選在內部查詢minbdatu爲好,這將有助於從外部查詢

0

同樣可以在來達到的oracle使用子查詢保理

請嘗試以下內容

with sub as 
    (SELECT anlz.anln1, anlz.kostlv,(SELECT min(anlz1.bdatu) bdatu 
    from 
    anlz anlz1 
    where anlz.anln1=anlz1.anln1 
    GROUP BY anlz1.anln1 
    HAVING MIN(anlz1.bdatu) > 0)) 
    as bdatu 
    from anlz 
    ) 
    SELECT DISTINCT a nla.anln1, anla.anln2,  sub.kostlv, sub.bdatu 
FROM anla 
LEFT OUTER JOIN sub 
ON anla.anln1 = sub.anln1 
相關問題