通过名称字符串将表与不同数据库中的另一个表连接

问题描述 投票:0回答:1

我面前有一个数据库服务器,它由多个数据库组成。为了简单起见,我们假设有一个主数据库,其中有一个 Main 表,如下所示。

Main.dbo.MainTable

| ID | Value | DBName |
| -- | ----- | ------ |
| 1  | 12912 | DBA    |
| 2  | 10113 | DBA    |
| 3  | 00197 | DBB    |
| 4  | 63512 | DBC    |
| 5  | 12312 | DBB    |

在 DBName 列中,定义了包含有关条目的更多信息的数据库的名称。 DBA、DBB、DBC 和 DBD 都使用相同的模式。 我现在需要将主表与其他数据库中找到的表连接起来。确切地说,我需要定义的 DBName 中的表并将其连接到 id = id 上的主表。

DBA.dbo.SomeTable

| ID | Info 1| Info 2|
| -- | ----- | ----- |
| 1  | 82732 | 28192 |
| 2  | 23772 | 71277 |
| 3  | 13913 | 82831 |
| 4  | 02283 | 91028 |
| 5  | 92322 | 81297 |

我尝试使用变量和 exec 语句从数据库名称字符串中获取表,但这不起作用。

declare @dbname nvarchar(100); exec('select @dbname = main.DBName from Main.dbo.MainTable main left join '+ @dbname +'.dbo.SomeTable other on main.ID = other.ID')

sql sql-server left-join
1个回答
0
投票

您可以使用一个大的

UNION ALL
查询,并为每个子表添加一个固定列,以便您可以加入它。

select
  dbname = main.DBName
from Main.dbo.MainTable main
left join (
    SELECT *, 'DBA' AS DBName
    FROM DBA.dbo.SomeTable

    UNION ALL

    SELECT *, 'DBB'
    FROM DBB.dbo.SomeTable

    UNION ALL

    SELECT *, 'DBC'
    FROM DBC.dbo.SomeTable

    UNION ALL

    SELECT *, 'DBD'
    FROM DBD.dbo.SomeTable
) other ON main.DBName = other.DBName AND main.ID = other.ID;

理想情况下将该派生表放入视图中以将逻辑保留在一个位置。

© www.soinside.com 2019 - 2024. All rights reserved.