在Win 2k3中通过MySQL ODBC连接器转换访问SQL查询

时间:2011-07-06 13:47:27

标签: mysql ms-access odbc windows-server-2003

我有一个运行查询的Access文件在我的桌面和运行Windows 2003 Server的服务器上没有相同的行为。 此查询使用MyODBC连接器从多个MySQL链接表中检索数据,以便将其插入到Access文件中的另一个工作表中。

在我的桌面上,一切正常,查询大约需要20秒才能运行。 但是当我尝试在2003服务器上执行相同的操作时,查询需要无限的时间才能运行,即使在几分钟后,它也会继续运行而不会填充我的Access表。

以下是桌面上MySQL ODBC连接器记录的内容:

SELECT `wsDispo_produits`.`code_fournisseur` ,`wsDispo_produits`.`code_int_produit` ,`wsDispo_produits`.`ref_fournisseur` ,`wsDispo_produits`.`qte_plaque` ,`wsDispo_produits`.`plaques_par_roll` ,`wsDispo_produits`.`prix` ,`wsDispo_produits`.`prix_etage` ,`wsDispo_produits`.`prix_roll` ,`wsProduits`.`designation` ,`wsProduits`.`taille_pot` ,`wsProduits`.`hauteur` ,`wsProduits`.`gencod` ,`wsFournisseur`.`raison_sociale` ,`wsProvenance`.`type_expedition` ,`wsProvenance`.`comm_produit` ,`wsProvenance`.`comm_transport` ,`wsProvenance`.`coef_transport` ,`wsTarifs_expedition`.`tarif`  FROM `wsDetail_offre`,`wsZone_departements`,`wsDispo_produits`,`wsProduits`,`wsProvenance`,{oj `wsFournisseur` LEFT OUTER JOIN `wsTarifs_expedition` ON (`wsFournisseur`.`code_fournisseur` = `wsTarifs_expedition`.`code_fou` ) } WHERE ((((((`wsDetail_offre`.`code_int_produit` = `wsDispo_produits`.`code_int_produit` ) AND (`wsDetail_offre`.`code_fournisseur` = `wsDispo_produits`.`code_fournisseur` ) ) AND (((`wsZone_departements`.`departement` IN ('*' ,'75' ) ) AND ((`wsZone_departements`.`code_fournisseur` = `wsDispo_produits`.`code_fournisseur` ) AND (`wsZone_departements`.`code_zone` = `wsDispo_produits`.`code_zone` ) ) ) AND (`wsDispo_produits`.`code_fournisseur` = `wsFournisseur`.`code_fournisseur` ) ) ) AND (`wsDispo_produits`.`code_int_produit` = `wsProduits`.`code_produit` ) ) AND (`wsFournisseur`.`code_pro` = `wsProvenance`.`code_pro` ) ) AND (((`wsTarifs_expedition`.`departement` IS NULL ) OR ((`wsTarifs_expedition`.`departement` = '75' ) AND (`wsTarifs_expedition`.`nb_max_roll` = 3 ) ) ) AND ((`wsDetail_offre`.`code_liste` )= ANY (SELECT `wsOffre`.`code_liste`  FROM `wsOffre` WHERE ((`wsOffre`.`date_deb` = {ts '2011-07-01 15:00:00'} ) AND (`wsOffre`.`date_fin` = {ts '2011-07-08 15:00:00'} ) ) ))) ) ;
COMMIT;

接下来是2003服务器上的日志:

SELECT `wsDetail_offre`.`code_liste` ,`wsDispo_produits`.`code_fournisseur` ,`wsDispo_produits`.`code_int_produit` ,`wsDispo_produits`.`ref_fournisseur` ,`wsDispo_produits`.`qte_plaque` ,`wsDispo_produits`.`plaques_par_roll` ,`wsDispo_produits`.`prix` ,`wsDispo_produits`.`prix_etage` ,`wsDispo_produits`.`prix_roll` ,`wsFournisseur`.`code_fournisseur` ,`wsFournisseur`.`raison_sociale` ,`wsFournisseur`.`code_pro` ,`wsProduits`.`designation` ,`wsProduits`.`taille_pot` ,`wsProduits`.`hauteur` ,`wsProduits`.`gencod`  FROM `wsDetail_offre`,`wsZone_departements`,`wsDispo_produits`,`wsFournisseur`,`wsProduits` WHERE ((((`wsDetail_offre`.`code_int_produit` = `wsDispo_produits`.`code_int_produit` ) AND (`wsDetail_offre`.`code_fournisseur` = `wsDispo_produits`.`code_fournisseur` ) ) AND (((`wsZone_departements`.`departement` IN ('*' ,'75' ) ) AND ((`wsZone_departements`.`code_fournisseur` = `wsDispo_produits`.`code_fournisseur` ) AND (`wsZone_departements`.`code_zone` = `wsDispo_produits`.`code_zone` ) ) ) AND (`wsDispo_produits`.`code_fournisseur` = `wsFournisseur`.`code_fournisseur` ) ) ) AND (`wsDispo_produits`.`code_int_produit` = `wsProduits`.`code_produit` ) ) ;
SELECT `code_fou` ,`departement` ,`nb_max_roll` ,`tarif`  FROM `wsTarifs_expedition`  WHERE (`code_fou` = 1);
SELECT `code_pro` ,`type_expedition` ,`comm_produit` ,`comm_transport` ,`coef_transport`  FROM `wsProvenance`  WHERE (`code_pro` = 1);
SELECT `code_pro` ,`type_expedition` ,`comm_produit` ,`comm_transport` ,`coef_transport`  FROM `wsProvenance`  WHERE (`code_pro` = 1);
...

在我杀死MsAccess之前,它一直在运行最后两个查询。 我无法弄清楚为什么查询没有以相同的方式执行。已经检查过运行了MsAccess和ODBC Connector的相同版本(MsAccess 2003 SP3和MySQL Connector 5.1.8)。 我在运行Windows Server 2008的另一台服务器上运行了相同的测试,它像我的桌面一样工作正常。我甚至尝试在2003服务器上修复Office并卸载/重新安装ODBC Connector。

我唯一注意到的是,在2003服务器上,查询被转换,以便不使用LEFT OUTER JOIN。

有人对此有任何解释吗?

感谢。

0 个答案:

没有答案