【问题标题】:query with join across multiple databases-syntax error跨多个数据库连接查询 - 语法错误
【发布时间】:2010-11-02 09:59:29
【问题描述】:

我有 2 个数据库,即 db1、db2。我需要一个从这些 dbs(db1,db2) 中获取数据的查询,这些 dbs(db1,db2) 每个都有 2 个表(让步,发票)。

在 db1.concessions => 让步是主键。 db1.invoicing => [Concession Number] 是主键

同样在 db2.concessions => 让步是主键。 db2.invoicing => [Concession Number] 是主键

在数据库1中

db1.tbl1 => 优惠表有数据

    concession
    TH-123
    TH-456
    FP-789
    NZ-609

db1.tbl2 => 发票表有数据

    [Concession Number]          invoiced_on
    TH-322                        10.09.10
    TH-900                        23.10.10
    FP-675                        04.05.09
    NZ-111                        19.11.08

幸运的是,在数据库中,让步的值是唯一的。即让步。[让步] = 发票。[让步号] 不产生任何数据..

在数据库 2 中:

db1.tbl1 => 优惠表有数据

    concession
    TH-123
    FP-789
    NZ-999
    TH-900

db1.tbl2 => 发票表有数据

    [Concession Number]          invoiced_on(dd.mm.yy)
    TH-456                        18.01.06
    TH-777                        23.10.04
    FP-675                        03.05.09
    NZ-149                        26.11.08

这里在 db2 让步是唯一的,让步。[让步] = 开票。[让步号] 不产生任何数据..

现在查询应该获取有共同点的记录 db1.(concessions.concession OR invoicing.concession number) = db2(concessions.concession OR invoicing.concession number)

在它应该返回的样本数据中,TH-123、FP-789、NZ-999、FP-675。

我的第二个问题是有可能将此查询扩展到多个数据库。我无法将数据库的计数更改为 1,因为它们已经固定。请让我知道相同的最佳程序。

我试过这样的,有语法错误,

SELECT a.concession as db1_CON_NUMBER FROM db1.dbo.concessions as a  UNION 
SELECT b.[Concession Number] as db1_CON_NUMBER  FROM db1.dbo.invoicing as b 
INNER JOIN 
SELECT c.concession as db2_CON_NUMBER FROM db2.dbo.concessions as c  UNION 
SELECT d.[Concession Number] as db2_CON_NUMBER  FROM db2.dbo.invoicing as d 
ON db1_CON_NUMBER = db2_CON_NUMBER 

希望您能回答这两个问题。 感谢您耐心阅读这么长的邮件!

【问题讨论】:

  • 只需在表前加上数据库名称,如 db1.dbo.tbl1 并在查询中使用它。
  • 感谢您的回复。我也是这样做的。即 db1.dbo.concessions 和 db1.dbo.invoicing

标签: sql sql-server sql-server-2005


【解决方案1】:

如果用户有权限,可以直接引用其他数据库。

<database>.<user>.<tablename>

是数据库表的完整“路径”。

你经常使用

db1.dbo.tbl1 join db2.dbo.tbl2

其中 dbo 是数据库所有者的默认值,任何不属于特定用户的表默认归 dbo 所有。

UPDATE

要让查询验证,您可以将其扩展至此

SELECT * FROM 
(SELECT a.concession as db1_CON_NUMBER FROM db1.dbo.concessions as a  
UNION 
SELECT b.[Concession Number] as db1_CON_NUMBER FROM db1.dbo.invoicing as b ) c

INNER JOIN 

(SELECT c.concession as db2_CON_NUMBER FROM db2.dbo.concessions as a 
UNION 
SELECT b.[Concession Number] as db2_CON_NUMBER FROM db2.dbo.invoicing as b ) d

ON db1_CON_NUMBER = db2_CON_NUMBER 

但我没有时间检查这是否会返回正确的数据,但您可以测试。

【讨论】:

  • 我拥有所有数据库的权限。我在查询中使用了 db1.dbo.concessions 和 db1.dbo.invoicing。希望您能进一步帮助我更正我的查询。
  • 单独的 Union 语句周围的括号使它们成为您可以连接的派生表,但您需要周围的 select a 才能将任何数据从连接中取出。
  • 你比我快几秒钟:-) 谢谢你的回复。还有一个问题是,我可以将此查询扩展到多个数据库(我的意思是超过 2 个)。还是我需要考虑一些额外的措施...
  • 只要模式没有改变,你应该能够做到这一点,但是使用内连接任何匹配都需要存在于所有数据库中,如果你想从 3 个或更多数据库中捕获任何对,你需要另一种方法,用另一个联合替换连接,然后选择所有计数> 1。
【解决方案2】:

如果数据库在同一个 SQL Server 实例上,您可以使用 3 部分命名:

database_name.schema_name.object_name

Using Identifiers As Object Names

如果数据库不在同一个实例上,创建一个链接服务器:Linked Servers

Creating Linked Servers (SQL Server Database Engine)

链接服务器允许访问 分布式异构查询 针对 OLE DB 数据源。之后 链接服务器已创建、分发 可以对此运行查询 服务器,查询可以连接表 来自多个数据源。如果 链接服务器被定义为 SQL Server 实例,远程存储 程序可以执行。

【讨论】:

  • 嗯。如果数据库在同一个 sql 实例上,则无需链接服务器。
  • 我真的应该更准确地阅读这些问题。谢谢。
【解决方案3】:
select * from(
SELECT a.concession as db1_CON_NUMBER FROM BABMwork6_5_3108.dbo.concessions as a  
        WHERE (a.manuell_archive_delete! = 'Delete' OR  a.manuell_archive_delete IS NULL) 
UNION SELECT b.[Concession Number] as db1_CON_NUMBER  FROM BABMwork6_5_3108.dbo.invoicing as b) as tbl1 
INNER JOIN 
(SELECT c.concession as db2_CON_NUMBER FROM BABMwork6_6_2909.dbo.concessions as c  
        WHERE (c.manuell_archive_delete! = 'Delete' OR  c.manuell_archive_delete IS NULL) 
UNION SELECT d.[Concession Number] as db2_CON_NUMBER  FROM BABMwork6_6_2909.dbo.invoicing as d ) as tbl2
ON tbl1.[db1_CON_NUMBER] = tbl2.[db2_CON_NUMBER]

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多