我遇到了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-26
并且SELECT中的rate.taux
返回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 ;
答案 0 :(得分: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更高