mysql - IF/ELSE 左连接

标签 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)) 

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

最佳答案

您不能使用 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


您的第二个查询,即 words,正在使用 MySQL 的 IF() 函数,并且似乎是正确的(尽管我发现第一个查询的代码有所不同,G .idArticolo = M.idArticolo 条件已从一部分中删除。)

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

关于mysql - IF/ELSE 左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498815/

相关文章:

mysql - 对于学生来说,哪一种是 DBMS 的最佳方法?

mySQL - 为每个帖子选择 2 个最新评论

mysql - Entity Framework 6 和 mysql TableDetails 强类型异常

sql - 从连接表中选择两个条目 (1 :m)

function - 加入PySpark时有right_anti吗?

sql - LEFT OUTER JOIN 丢失原始用户 ID

php - 多值插入复选框只有最后一个值正在进入数据库

mysql - 选择具有最大字符串长度的结果

python - 外部加入 python Pandas

c# - 从左连接中选择时出现 NullReferenceException