gpt4 book ai didi

mysql - IF/ELSE 左连接

转载 作者:可可西里 更新时间:2023-11-01 07:18:30 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com