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

IFを使用して条件付き結合を行うことはできません。は構文IFの一部ではないため、(式のように) あったとしても、このように使用することは許可されません。ただし、ロジックをステートメントに移動できます。SELECTCASEON

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)

また、式が null かどうかをチェックするために等式を使用できないことにも注意してください。
M.idArtVar = nullが真になることはNULL決してありませんNULL。式が null かどうかを確認する方法は withIS NULLです。


2番目のクエリ、その言葉IF()はMySQLの機能を使用しており、正しいようです(最初のクエリとのコードの違いはわかりますが、G.idArticolo = M.idArticolo条件は一部削除されています。)

クエリが遅い理由は多くの要因に依存し、結合条件で関数を使用することは多くの要因の 1 つです。上記で提案した変更を試してください。それでも遅い場合は、実行計画とテーブルで使用可能なインデックスを調べる必要があります。

于 2013-05-11T16:54:24.963 に答える
0

on句 に条件を入れるだけです。IfSQL ステートメントの一部ではありません。

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 に答える