我目前在我的网络服务器上设置了2个ODBC连接。一个连接到我们的企业QAD数据库,另一个连接到我们的自定义数据库,用于扩展我们的数据库。在这个特例中,我在QAD数据库中有我的员工记录,然后是自定义数据库中另一个表中的员工编号。
有没有办法在php中设置两个odbc连接之间的交叉连接,这样我就不必遍历第一个查询的结果,并根据返回的结果发送几个查询来绑定我的在php数组中一起记录?
我能想到的最好的方法是从我的自定义数据库的第一个查询中构建一个IN子句,将第二个查询发送到QAD数据库,然后在php中进行数组合并。但是,与普通的SQL连接相比,这是一个非常缓慢的过程。
答案 0 :(得分:1)
不确定您是否已找到解决方案,但有一篇关于如何执行此操作的进度文章。
Quick Guide To Setting Up MultiDatabase ODBC Connectivity
我有类似的要求 - 我想在主要QAD数据库中的表和自定义数据库中的自定义表之间创建连接。虽然我的设置略有不同,但我已经对它进行了测试并且效果很好。我需要从Microsoft SSRS连接到QAD以创建针对QAD数据的报告 - 我需要创建一些标准QAD报告设计者无法处理的报告。
我在Progress 10.1c上测试了这个(此方法仅在10.1b +中支持)。
所以我采取的步骤是:
我认为OS / Database和ODBC驱动程序的位版本匹配但尚未确认这一点很重要。
虽然我的要求与您的要求不同,但最重要的是QAD服务器配置和ODBC设置是关键。只要您的PHP客户端可以在OpenQuery命令方面执行类似的功能,您就可以使用它。我没有任何PHP经验,所以无法帮助你。
看起来有点复杂,但实际上效果非常好,在很多情况下,使用QAD浏览实际上优于查询数据!
希望这有帮助。
修改强> 这是一个OpenQuery命令的示例 - 您可以看到该表以正常方式连接工作,但只是需要和表引用中的其他部分。
CREATE VIEW [dbo].[vQADData] AS SELECT * FROM OPENQUERY(LinkedServerName,
'
SELECT custTable.item_date AS DESP_DATE, so_mstr.so_site AS SITE, so_mstr.so_po AS PO_NO, so_mstr.so_inv_nbr AS INV_NO,
ad_mstr.ad_name AS ADNAME, ad_mstr.ad_city AS ADCITY, ad_mstr.ad_state AS ADSTATE
FROM customdbname.pub.customtable custTable
INNER JOIN pub.so_mstr ON so_mstr.so_nbr = custTable.so_nbr
INNER JOIN pub.ad_mstr ON ad_mstr.ad_addr = so_mstr.so_ship
INNER JOIN pub.sod_det ON sod_det.sod_nbr = custTable.so_nbr
WHERE so_mstr.so_site = ''SiteName'' AND so_mstr.so_shipvia = ''SHIPPER'' AND custTable.item_date IS NULL
')
然后只使用普通的SQL语法访问视图。
SELECT * FROM vQADData
答案 1 :(得分:1)
感谢Tiran的建议解决方案。对于那些试图通过SQL服务器引用多个表的人,正如Tiran所做的那样,我有额外的输入。
我正在尝试从多个源(Progress)中提取数据,同时从同一个表结构中提取数据并将其插入到我们的数据仓库(SQL Server)中。所以我只是想在不同的数据库中建立多个相同结构化表的联合。 Tiran的解决方案让我走上了同样的道路,但是Progress数据库的链接是一个繁琐的过程,需要我找到一个具有2-3天空闲时间(他的引用)的Progress DBA来将它们放在一起。当我直接与Progress的人交谈时,他们还指出如果我在Progress侧创建了一个带有union的视图,它将依次从视图中的每个源中提取数据,而不是同时提取。然而,这使我得到了另一个发现,看起来它将解决我们的需求并完全跳过处理在Progress方面链接表。
这是一个包含三个源的示例,相同的表(这应该适用于交叉源加入不同的表)。此处的所有名称仅为了清楚起见而提供。
Source 1 - Table_A
Source 2 - Table_A
Source 3 - Table_A
在SQL Server中,创建到每个源的链接服务器连接。
ls_source1
ls_source2
ls_source3
在您需要引用Progress数据库的SQL Server数据库中,创建一个视图,使用union将三个不同的链接服务器连接连接在一起。链接的服务器引用将需要使用openquery。此示例使用来自每个链接服务器源的select *,假定所有列都是从每个源命名和结构相同的。
CREATE VIEW table_name_v as
SELECT *
FROM
(SELECT *
FROM OPENQUERY(ls_source1,
'select *
from source1.dbo.Table_A
')
union
SELECT *
FROM OPENQUERY(ls_source2,
'select *
from source2.dbo.Table_A
'
union
SELECT *
FROM OPENQUERY(ls_source3,
'select *
from source3.dbo.Table_A
'
)
) x
创建视图后,您现在可以同时查询不同Progress源中的所有三个表。无需在进度方面进行额外设置。
有一个重要的警告,我正在努力解决这个问题。如果您使用64位SQL Server的64位计算机,则需要使用64位驱动程序通过链接服务器选项连接到Progress数据库。我的需求要求我在同一台机器上同时拥有32位和64位驱动程序并遇到问题,因为显然它们在同一台机器上不能很好地协同工作。我已经能够在同一台机器上安装64位和32位驱动程序(在Progress'网站上有一个小故障本应该给我发送该驱动程序的链接但是我能够让那里的某人指引我到正确的地方检索64位odbc驱动程序。普通人不应该只需要两个驱动程序,只能使用64位。作为替代工作,如果我不能让两个驱动程序共存于同一台机器上,我发现并确认Connx公司提供的驱动程序提供64位/ 32位桥接器,可以解决该问题。理想情况下,不需要第三方软件。
现在不幸出现了一个新问题,因为我设置和使用的链接服务器不再正常运行。向前迈出两步,退一步......
我以为我会分享我的发现,因为我确信还有其他人在寻找。
答案 2 :(得分:0)
简答:两个连接之间不能有JOIN
个表。
场景(所有这些都在一个连接中)
(...) FROM defaultDB.TableA INNER JOIN extensionDB.TableA ON ({Condition}) (...)
根据您的数据库(我不深入了解Progress DB),您可能无法加入属于不同服务器中的模式的表。
在不同的数据库中连接表(例如:Progress x MySQL),它更加复杂。我听说过Oracle Gateway,一种专有的解决方案(不太确定)可以实现最后一种情况。
总结:
如果您的情况不适合第一种情况(指出最明显的方法),我想最短的解决方案是分析您的代码并优化可能的性能瓶颈。调整parallel processing的代码可能会有更大胆的改进。