我需要用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条件已从一个部分中删除.)
为什么查询速度慢取决于许多因素,并且在连接条件上使用函数可能是众多因素之一.尝试我上面建议的改变.如果它仍然很慢,则必须检查执行计划和表上的可用索引.
| 归档时间: |
|
| 查看次数: |
11405 次 |
| 最近记录: |