IF / ELSE LEFT JOIN

时间:2013-05-11 15:36:20

标签: mysql join

我需要使用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 个答案:

答案 0 :(得分:9)

您无法使用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条件已被删除从一部分。)

为什么查询速度慢取决于许多因素,并且在连接条件上使用函数可能是众多因素之一。尝试我上面建议的改变。如果它仍然很慢,你将不得不检查执行计划和表上的可用索引。

答案 1 :(得分: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))