6

我需要使用 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)) 

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

4

2 回答 2

13

您不能使用 anIF进行条件连接。因为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)。检查表达式是否为空的方法是 with IS NULL


你的第二个查询,那个词,正在使用IF()MySQL 的功能,似乎是正确的(虽然我看到第一个查询的代码有所不同,但G.idArticolo = M.idArticolo条件已从一部分中删除。)

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

于 2013-05-11T16:54:24.963 回答
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)) 
于 2013-05-11T16:41:11.750 回答