2013-05-11 69 views
4

我需要做一個LEFT JOIN與IF/ELSE,這是我的查詢:的if/else LEFT JOIN

IF (M.idArtVar=null, 
    LEFT JOIN ArtMaga G 
      ON (G.idMagazzino = V.idMagazzino AND G.idArticolo = M.idArticolo), 
    LEFT JOIN ArtMaga G 
      ON (G.idMagazzino = V.idMagazzino AND G.idArticolo = M.idArticolo AND 
       G.idArtVar = M.idArtVar) 
    ) 

但它不工作。

我也試過這樣:

LEFT JOIN ArtMaga AM 
      ON IF(M.idArtVar IS NULL, 
       (AM.idMagazzino = TM.idMagazzino AND AM.idArticolo = A.idArticoli), 
       (AM.idMagazzino = TM.idMagazzino AND AM.idArtVar = M.idArtVar)) 

但此查詢太慢。 我該怎麼辦? 謝謝。

編輯:這是一個完整的查詢:

SELECT F.Codice AS "CodiceFornitore", F.RagioneSociale AS "RagioneSocialeFornitore", A.ArticoloFornitore, C.Descrizione AS CatDes, S.Descrizione AS Settore, U.Sigla AS Um, U2.Sigla AS Um2, A.Moltiplicatore AS Molt, A.Collo, TM. 
dMagazzino, M.idArtVar, AM.Esistenza, AM.Disponibilita,   AM.QtaImpegnata, AM.QtaOrdinata, TM.TipoSoggetto, TM.idSoggetto, ST.DataMovimento, MC.Codice, ST.Quantita, ST.Prezzo, ST.Sconti, M.idMagaRigMov 

    FROM MagaRigMov M 

    LEFT JOIN Articoli  A ON A.idArticoli  = M.idArticolo 
    LEFT JOIN UnMisura  U ON U.idUnMisura  = A.idUnMisura1 
    LEFT JOIN UnMisura  U2 ON U2.idUnMisura = A.idUnMisura2 
    LEFT JOIN Iva   I ON I.idIva   = A.idIva 
    LEFT JOIN Settori  S ON S.idSettori  = A.idSettore 
    LEFT JOIN Fornitori F ON F.idFornitori = A.idFornitore 
    LEFT JOIN ArtCategorie C ON C.idArtCategorie = A.idArtCategoria 
    LEFT JOIN MagaTesMov TM ON TM.idMagaTesMov = M.idMagaTesMov 
    LEFT JOIN STORICO  ST ON (ST.idSoggetto = TM.idSoggetto AND ST.TipoSoggetto = TM.TipoSoggetto AND ST.idArticolo = M.idArticolo) 
    LEFT JOIN MagaCausali MC ON MC.idMagaCausali = ST.idMagaCausale 
    LEFT JOIN ArtMaga  AM ON IF(M.idArtVar IS NULL,(AM.idMagazzino = TM.idMagazzino AND AM.idArticolo = A.idArticoli), 
                 (AM.idMagazzino = TM.idMagazzino AND AM.idArtVar = M.idArtVar)) 

此查詢過慢..但工程..

+2

我們可以看到完整的查詢和表定義嗎? – 2013-05-11 15:40:13

+1

- 特別是索引?另外,你是否意識到兩個表達式背後的邏輯是不同的? 「太慢」有多慢?與僅使用其中一組連接條件時的性能相比,它有何不同? – 2013-05-11 15:44:47

+1

雖然完整的查詢很有趣,但它不如ArtMaga的索引結構有用 - 如果能夠使用相關索引,查詢將執行得更快。 – 2013-05-11 16:48:04

回答

8

您不能使用IF進行條件連接。因爲IF不是SELECT語法的一部分,即使它是(如CASE表達式),也不允許以這種方式使用它。您可以將邏輯移動到ON聲明,但:

LEFT JOIN ArtMaga G 
     ON (G.idMagazzino = V.idMagazzino AND G.idArticolo = M.idArticolo) 
      AND M.idArtVar IS NULL 
     OR (G.idMagazzino = V.idMagazzino AND G.idArticolo = M.idArticolo AND 
      G.idArtVar = M.idArtVar) 
      AND M.idArtVar IS NOT NULL 

這可以簡化爲:

LEFT JOIN ArtMaga G 
     ON (G.idMagazzino = V.idMagazzino AND G.idArticolo = M.idArticolo) 
     AND (M.idArtVar IS NULL OR G.idArtVar = M.idArtVar) 

還要注意,你不能用平等來檢查表達式是否爲空。
M.idArtVar = null永遠不會是真的,因爲NULL永遠不會等於任何東西(甚至不會等於NULL)。檢查表達式是否爲空的方法是IS NULL


你的第二個查詢,這也就是說,是使用MySQL的IF()功能,似乎是正確的(雖然我看到在代碼中的差異與第一查詢時,G.idArticolo = M.idArticolo條件已經從一個移除。 )

爲什麼查詢速度慢取決於許多因素,並且在連接條件上使用函數可能是許多因素之一。嘗試我上面建議的更改。如果速度仍然很慢,則必須檢查執行計劃和表上可用的索引。

0

只要把條件on子句。 If不是SQL語句的一部分。

SELECT F.Codice AS "CodiceFornitore", F.RagioneSociale AS "RagioneSocialeFornitore", 
A.ArticoloFornitore, C.Descrizione AS CatDes, S.Descrizione AS Settore, U.Sigla AS Um, U2.Sigla AS Um2, A.Moltiplicatore AS Molt, A.Collo, TM. 
dMagazzino, M.idArtVar, AM.Esistenza, AM.Disponibilita,   AM.QtaImpegnata, AM.QtaOrdinata, TM.TipoSoggetto, TM.idSoggetto, ST.DataMovimento, MC.Codice, ST.Quantita, ST.Prezzo, ST.Sconti, M.idMagaRigMov 

FROM MagaRigMov M 

LEFT JOIN Articoli  A ON A.idArticoli  = M.idArticolo 
LEFT JOIN UnMisura  U ON U.idUnMisura  = A.idUnMisura1 
LEFT JOIN UnMisura  U2 ON U2.idUnMisura = A.idUnMisura2 
LEFT JOIN Iva   I ON I.idIva   = A.idIva 
LEFT JOIN Settori  S ON S.idSettori  = A.idSettore 
LEFT JOIN Fornitori F ON F.idFornitori = A.idFornitore 
LEFT JOIN ArtCategorie C ON C.idArtCategorie = A.idArtCategoria 
LEFT JOIN MagaTesMov TM ON TM.idMagaTesMov = M.idMagaTesMov 
LEFT JOIN STORICO  ST ON (ST.idSoggetto = TM.idSoggetto AND ST.TipoSoggetto = TM.TipoSoggetto AND ST.idArticolo = M.idArticolo) 
LEFT JOIN MagaCausali MC ON MC.idMagaCausali = ST.idMagaCausale 
LEFT JOIN ArtMaga  AM ON (AM.idMagazzino = TM.idMagazzino AND (m.idartVar is NULL and AM.idArtVar = M.idArtVar or AM.idArticolo = A.idArticoli))