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 行(如果credit_memo.date等于2013-03-26rate.tauxSELECT 中的返回0.82000。如何转换查询以获得1.29000左连接的最后一个值?因为我只想要最后一条记录 #244。是可以避免左连接内的子查询吗?

谢谢你们的帮助!

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
)

换句话说,忽略在 HISTRIQUE_DEVISE 中找到“匹配记录”但 ID 更高的记录

于 2013-03-27T03:08:13.433 回答