IF/ELSE LEFT JOIN

use*_*165 5 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)
   )   
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

我也尝试过这样:

    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)) 
Run Code Online (Sandbox Code Playgroud)

但是这个查询太慢了.我能怎么做?谢谢.

编辑:这是完整的查询:

    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)) 
Run Code Online (Sandbox Code Playgroud)

这个查询太慢..但是有效..

ype*_*eᵀᴹ 11

您不能使用an 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
Run Code Online (Sandbox Code Playgroud)

可以简化为:

LEFT JOIN ArtMaga G 
       ON  (G.idMagazzino = V.idMagazzino AND G.idArticolo = M.idArticolo)
       AND (M.idArtVar IS NULL OR G.idArtVar = M.idArtVar)
Run Code Online (Sandbox Code Playgroud)

另请注意,您不能使用相等性来检查表达式是否为空.
M.idArtVar = null将永远不会是真实的,因为NULL永远不会等于任何东西(甚至不是NULL).检查表达式是否为null的方法是IS NULL.


您的第二个查询,即单词,使用IF()MySQL 的功能并且似乎是正确的(虽然我看到代码与第一个查询的区别,但G.idArticolo = M.idArticolo条件已从一个部分中删除.)

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