2012-01-26 61 views
1

仍然是一個MySQL的新手,我通過以前的問題試圖找到一個合適的解決方案廣泛看。MySQL與多個ON條件加入同一表?

我有兩個表CaseReportsTempImport2011Q3FDADrugsDB,我希望做一個左連接搭配CaseReportsTempImport2011Q3.drugnameFDADrugsDB.ReferenceDrugNameFDADrugsDB.DrugName

我設想是這樣的:

SELECT DISTINCT(CaseReportsTempImport2011Q3.DRUGNAME) 
, FDADrugsDB_Product.drugname 
, FDADrugsDB_Product.ReferenceDrug 
, FDADrugsDB_Product.activeingred 
FROM CaseReportsTempImport2011Q3 
LEFT JOIN FDADrugsDB_Product ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.ReferenceDrug) 
LEFT JOIN FDADrugsDB_Product ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.DrugName) 
ORDER BY LENGTH(CaseReportsTempImport2011Q3.DRUGNAME) ASC 

但不工作我得到'不是唯一的表/別名:'FDADrugsDB_Product'' - 任何幫助?

感謝

編輯更好的解決方案REQUEST /改寫 每borealids「不過,我不知道這是你想做的事 - 加入表兩次會產生結果的乘號我認爲你可能希望與ON ...或...合併,使連接條件成爲連接的兩個原因的「或」。「

我想知道如何做到這一點。

SOLUTION ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.ReferenceDrug)OR CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.DrugName

感謝湯姆和borealid。

+0

只要使用'和'/'或',你會與'WHERE'像'JOIN富安foo.fk = bar.id AND foo.name = bar.name'並刪除第二個'JOIN '或別名你的表,雖然這似乎毫無意義 –

回答

4

爲了讓你寫的有效查詢,您需要爲同一表的兩種用途分配兩個不同的關係名稱。

LEFT JOIN FDADrugsDB_Product FDA_first ON 

LEFT JOIN FDADrugsDB_Product FDA_second ON 

,然後使用名稱FDA_firstFDA_second指從各組明顯效果。否則,當你說FDADrugsDB_Product時,查詢引擎不能說出你的意思 - 它們有兩個,每個都不相同!

但是,我不確定這是你想要做什麼 - 連接表兩次將產生乘數的結果。我認爲你可能想要加入一個ON ... OR ...,使得加入條件成爲連接的兩個原因的「或」。

+0

是的,我很想弄清楚如何做一個ON或一個連接,我試過但我的語法是相當新的和生鏽的。我將如何做到這一點? – cerd

+0

@cerd:'ON CaseReportsTempImport2011Q3。DRUGNAME LIKE TRIM(FDADrugsDB_Product.ReferenceDrug)或CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.DrugName)''。這與做兩個連接不一樣。 – Borealid

+0

謝謝,這就像一個魅力。 – cerd

0
... 
FROM 
    CaseReportsTempImport2011Q3 i 
    LEFT JOIN FDADrugsDB_Product p ON i.DRUGNAME LIKE TRIM(p.ReferenceDrug) 
            OR i.DRUGNAME LIKE TRIM(p.DrugName) 
ORDER BY 
    LENGTH(i.DRUGNAME) ASC 

請注意,您應該使用=代替LIKE,除非ReferenceDrugDrugName包含匹配模式。

+0

是的,數據非常髒,所以必須使用LIKE,甚至可能使用一些REGEXP。 – cerd

+0

@cerd是的,但是在你的條件中沒有包含'%'的地方,'LIKE'的行爲就像'='。無論如何,如果那是你需要的,那沒關係。 – Tomalak

1

您需要提供表別名,否則MySql將不知道您正在討論的FDADrugsDB表的哪個實例。即

FROM CaseReportsTempImport2011Q3 a 
LEFT JOIN FDADrugsDB_Product b ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.ReferenceDrug) 
LEFT JOIN FDADrugsDB_Product c ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.DrugName) 
+0

您忘記在'LIKE'中使用別名。 – Borealid

+0

謝謝。我只是舉個簡單的例子,而不是檢查整個語法。不好的做法,因爲它會導致混淆:-) – Brian

+1

是的,我不挑剔,只是擔心他們會嘗試運行您的查詢,並得到相同的錯誤信息。 – Borealid