0

mySQL クエリで問題が発生しています。

テーブルcredit_memoからの最後のレート交換ごとに返したいです。HISTORIQUE_DEVISE

テーブルの私の記録HISTORIQUE_DEVISEは次のとおりです。

ID  |  account_id|  code_source  |  code_destination |  date      |   taux     | ..
242 |         12 |             1 |               133 | 2013-02-22 |    0.82000 | ..
243 |         12 |             1 |               133 | 2013-03-26 |    0.96000 | ..
244 |         12 |             1 |               133 | 2013-03-26 |    1.29000 | ..

現在、最後の左結合は 3 行を返します ( SELECTのcredit_memo.dateequals2013-03-26と がを返す場合。クエリを変換して、左結合の最後の値を取得するにはどうすればよいですか?最後のレコード #244 のみが必要なためです。左結合内のサブクエリを回避することは可能ですか?rate.taux0.820001.29000

助けてくれてありがとう!

SELECT credit_memo.code_avoir_client, 
       credit_memo.total_ttc, 
       credit_memo.date, 
       credit_memo.code_utilisateur, 
       credit_memo.montant_restant_a_payer, 
       DEVISE.code_iso, 
       PAIEMENT_FACTURE_FOURNISSEUR.date_reglement, 
       customer.code_client, 
       customer.code_utilisateur_client, 
       customer.prenom, 
       customer.raison_social, 
       lead.code_client, 
       lead.code_utilisateur_client, 
       lead.prenom, 
       lead.raison_social, 
       project.project_code, 
       project.name,  
       rate.taux
FROM AVOIR_CLIENT AS credit_memo
       LEFT JOIN CLIENT AS customer 
              ON customer.code_client = credit_memo.code_client 
                 AND customer.code_profil_client = 1 
                 AND ( customer.account_id = 0 
                        OR customer.account_id = 12 ) 
                 AND customer.etat = 0 
       LEFT JOIN CLIENT AS lead 
              ON lead.code_client = credit_memo.code_client 
                 AND lead.code_profil_client = 2 
                 AND ( lead.account_id = 0 
                        OR lead.account_id = 12 ) 
                 AND lead.etat = 0 
       LEFT JOIN PROJECT AS project 
              ON project.project_code = credit_memo.project_code 
                 AND ( project.account_id = 0 
                        OR project.account_id = 12 ) 
                 AND project.etat = 0 
       LEFT JOIN DEVISE 
              ON DEVISE.code_devise = credit_memo.code_devise 
                 AND ( DEVISE.account_id = 0 
                        OR DEVISE.account_id = 12 ) 
                 AND DEVISE.etat = 0 
       LEFT JOIN PAIEMENT_FACTURE_FOURNISSEUR 
              ON PAIEMENT_FACTURE_FOURNISSEUR.code_avoir_client = 
                 credit_memo.code_avoir_client 
                 AND ( PAIEMENT_FACTURE_FOURNISSEUR.account_id = 0 
                        OR PAIEMENT_FACTURE_FOURNISSEUR.account_id = 12 ) 
                 AND PAIEMENT_FACTURE_FOURNISSEUR.etat = 0
       LEFT JOIN ETABLISSEMENT AS eta
              ON eta.code_etablissement = 
                 credit_memo.code_etablissement 
                 AND ( eta.account_id = 0 
                        OR eta.account_id = 12 )
       LEFT JOIN HISTORIQUE_DEVISE AS rate
              ON rate.code_etablissement = 
                 credit_memo.code_etablissement 
                 AND rate.CODE_DEVISE_SOURCE = credit_memo.CODE_DEVISE
                 AND rate.CODE_DEVISE_DESTINATION = eta.CODE_DEVISE
                 AND rate.date <= credit_memo.date
                 AND ( rate.account_id = 0 
                        OR rate.account_id = 12 )
                 AND rate.etat = 0
WHERE  ( credit_memo.account_id = 0 
          OR credit_memo.account_id = 12 ) 
       AND credit_memo.etat = 0 
GROUP BY credit_memo.code_avoir_client ;
4

1 に答える 1

0

他の行を除外する where 句を追加することで、他の行を削​​除できます。あなたのSQLは、知識がなければ理解するのが少し複雑ですが、一般的にwhere句は次のようになります。

AND NOT EXISTS 
(Select * 
 From HISTORIQUE_DEVISE rate_2 
 WHERE rate.accoun_id=rate_2.accountid 
    ... add other keys fields here if they need to be equal ...
   AND rate_2.ID > rate.ID
)

つまり、HISTORIQUE_DEVISE で「一致するレコード」が見つかったが、より高い ID を持つレコードを除外します。

于 2013-03-27T03:08:13.433 に答える