2011-10-06 70 views
3

我試圖匹配兩位數據,添加到現有查詢中。SQL加入,不確定複雜查詢中的確切語法

我希望查詢本身解釋了我想要做的事情。我遇到的麻煩該生產線是LEFT JOIN從業人員P於insolvencies.practitioner = practitioners.id,

SELECT DISTINCT  i.id   AS id, 
        i.company  AS company, 
        i.insolvencyDate AS insolvency_date, 
        i.city   AS city, 
        i.createdOn  AS createdOn, 
        1    AS rank_id, 
        t.entryCopy  AS insolvency_type, 
        i.businessNature AS business_nature, 
        p.name   AS pract_comp_name, 
        'I'    AS i_type 
    FROM  insolvencies i, 
     LEFT JOIN practitioners p ON insolvencies.practitioner = practitioners.id, 
     lookupcopy t 
    WHERE i.checked = 1  
     AND t.id  = i.insolvencyType 
     AND i.insolvencyDate >= {ts '2010-01-22 00:00:00'} 
     AND i.insolvencyDate <= {ts '2011-10-20 00:00:00'} 
     AND (LOWER(p.name) LIKE '%Hodgsons%') 
    GROUP BY  id 
+1

爲什麼要混合ANSI-86和ANSI-92風格的加入的完美例子可能不是一個好主意 –

+0

對我來說,在我的技能水平上,康拉德真的很有幫助。謝謝。 –

回答

2

我認爲你正在尋找的東西是這樣的:

SELECT DISTINCT i.id AS id 
    , i.company AS company 
    , i.insolvencyDate AS insolvency_date 
    , i.city AS city 
    , i.createdOn AS createdOn 
    , 1 AS rank_id 
    , t.entryCopy AS insolvency_type 
    , i.businessNature AS business_nature 
    , p.name AS pract_comp_name 
    , 'I'  AS i_type 
    FROM insolvencies i 
    LEFT JOIN practitioners p ON insolvencies.practitioner = practitioners.id 
    CROSS JOIN lookupcopy t 
    WHERE i.checked = 1  
    AND t.id  = i.insolvencyType 
    AND i.insolvencyDate >= {ts '2010-01-22 00:00:00'} 
    AND i.insolvencyDate <= {ts '2011-10-20 00:00:00'} 
    AND (LOWER(p.name) LIKE '%Hodgsons%') 
GROUP BY id 

表之間的,相同CROSS JOIN

但無論如何,你應該閱讀約cross join,inner joinouter join並使用最適合您的情況。

+0

從[MySQL參考](http://dev.mysql.com/doc/refman/5.0/en/join.html)'在MySQL中,CROSS JOIN是一個等效於INNER JOIN的語法(他們可以互相替換)'那麼你在SQL之後寫了什麼樣的有趣的 –

+0

是的,但是根據標準瞭解其差異並使用它是很好的。並非所有的RDBMS都是MYSQL :) – DavidEG

2

您需要insolvencies i,後刪除逗號,使LEFT JOIN適用於表,否則LEFT JOIN是被視爲一個獨立的表,交叉應用,這是無效的:

FROM insolvencies i 
      --  ^remove comma 
    LEFT JOIN... 
0

的問題是,你的WHERE子句引用LEFT JOIN起來表

WHERE i.checked = 1  
     AND t.id  = i.insolvencyType 
     AND i.insolvencyDate >= {ts '2010-01-22 00:00:00'} 
     AND i.insolvencyDate <= {ts '2011-10-20 00:00:00'} 
     AND (LOWER(p.name) LIKE '%Hodgsons%') 

如果LEFT JOIN找不到匹配項,則p.Name將爲NULL。通過在WHERE子句中檢查p.Name,可以使LEFT JOIN充當一個FULL JOIN。如果需要檢查名稱,它應該是LEFT JOIN中ON表達式的一部分

4

這裏有很多問題。首先,我拿出逗號並正確加入了lookupcopy。我不是100%確定你的最終目標,但有以下幾點入手:

SELECT DISTINCT i.id AS id, 
       i.company AS company, 
       i.insolvencyDate AS insolvency_date, 
       i.city AS city, 
       i.createdOn AS createdOn, 
       1 AS rank_id, 
       t.entryCopy AS insolvency_type, 
       i.businessNature AS business_nature, 
       p.name AS pract_comp_name, 
       'I' AS i_type 
    FROM insolvencies i 
     INNER JOIN lookupcopy t on (t.id = i.insolvencyType) 
     LEFT JOIN practitioners p ON i.practitioner = p.id 
    WHERE i.checked = 1 
     AND i.insolvencyDate >= {ts '2010-01-22 00:00:00'} 
     AND i.insolvencyDate <= {ts '2011-10-20 00:00:00'} 
     AND (LOWER(p.name) LIKE '%Hodgsons%') 
    GROUP BY id 

如果仍然有問題,請發表您的實際誤差。

另外,還有一件事:在where子句中引用p.Name將導致從業者和破產人之間的內部聯接。這是打算嗎?

+0

+1內部連接 – eykanal