Mam 3 stoły:

tb_a                tb_b             tb_c
==============      ==============   ==============
|id|doc1|urla|      |id|doc2|urlb|   |id|doc3| sum|
==============      ==============   ==============
| 1| c1 |url1|      | 1| c2 |urla|   | 1| c2 |sum1|
| 2| c3 |url3|      | 2| c4 |urlb|   | 2| c3 |sum3|
| 3| c2 |url2|      | 3| c6 |urlc|   | 3| c4 |sum4|
==============      ==============   | 4| c6 |sum6|
                                     ==============

Najpierw chcę sprawdzić tb_a i tb_b. Jeśli są takie same dane w doc1 i doc2, po prostu używam danych doc1 w tb_a. oto pierwsze zapytanie :

SELECT 
   a.doc1
FROM 
   tb_a a
LEFT JOIN 
   tb_b b
   ON a.doc1 = b.doc2
WHERE 
   b.doc2 IS NULL 

Następnie w lewo dołącz do tb_c, aby otrzymać sum. czy mogę wykonać te procesy w jednym zapytaniu? Jak? Dziękuję Ci :)

Z przykładu, więc wynik musi być :

c3 url3 sum3 
c2 url2 sum1
c4 urlb sum4
c6 urlc sum6
0
bruine 21 październik 2012, 17:12

2 odpowiedzi

Najlepsza odpowiedź

Możesz dołączyć do wszystkich stołów za pomocą LEFT JOIN z COALESCE.

SELECT  a.doc3 DOCValue, 
        COALESCE(b.urla, c.urlb) AS URLValue,
        a.`SUm` AS SUMValue
FROM    tb_c a
        LEFT JOIN tb_a b
            ON a.doc3 = b.doc1
        LEFT JOIN tb_b c
            ON a.doc3 = c.doc2

Demo sqlfiddle.

3
John Woo 21 październik 2012, 22:24

Poniżej zostaną zwrócone wszystkie rekordy, które pasują do dokumentu w A, B i C. Myślę, że jest to to, czego szukasz.

SELECT 
   a.doc1, C.SUM
FROM 
   tb_a a
LEFT JOIN 
   tb_b b
   ON a.doc1 = b.doc2
left join TB_C C ON C.DOC3=B.DOC2
WHERE 
   b.doc2 IS NOT NULL 
0
xQbert 21 październik 2012, 17:21