因此假设有表A,B和C
A和B来自数据库AAA,C来自数据库BBB 据我所知,我无法连接来自不同数据库的表。
所以我想加入A和B,如果没有返回,我想从C表中查询。
A_ID NAME B_ID NAME C_ID NAME
------------------------------------------------
1 Paul 1 NULL 1 NULL
2 NULL 2 BOB 2 NULL
3 NULL 3 NULL 3 PETER
例如,
select * from A outer join B on A_ID= B_ID
1和2将在“name”下返回PAUL和BOB。 但是3会加入,但什么都不会回来。然后我想查询C。
我的想法是循环它,但我想知道是否有更好的想法。 而且我对ASP完全不熟悉所以如果我标记出错了......请帮忙。 谢谢
答案 0 :(得分:0)
SELECT ID,
Name = CASE temp.ID
WHEN NULL THEN (SELECT Name FROM C WHERE C_ID = temp.ID)
ELSE temp.ID
END
FROM (
SELECT A.ID,
Name = ISNULL(A.Name, B.Name)
FROM A
OUTER JOIN B on A_ID = B_ID
) temp
答案 1 :(得分:0)
只要所有数据库都在同一台服务器上(并且您的登录名都可以访问所有这些数据库),您就可以JOIN DatabaseC.dbo.SomeTable
,其中dbo
是架构名称。
答案 2 :(得分:0)
如果您的数据库位于同一服务器上,则可以使用fully qualified name仅跨两个数据库连接表。请注意,outer join
的语法是无效的t-sql。您需要指定所需的outer join
类型...... left join
,right join
等。
SELECT *
FROM A
LEFT JOIN B on A.A_ID = B.B_ID
LEFT JOIN [BBB].[dbo].C c on B.B_ID = c.C_ID
CASE
语句可能会使您的输出更具可读性,但如果给定ID的多个表中存在名称,那么它就不会起作用(好吧,它会起作用,但会丢失一些数据) 。但是,如果ID只在一个表中有一个名称,那么它可能会使您的输出更具可读性。
SELECT A.A_ID,
CASE WHEN A.[Name] IS NOT NULL THEN A.[Name]
WHEN B.[Name] IS NOT NULL THEN B.[Name]
ELSE c.[Name]
END
FROM A
LEFT JOIN B on A.A_ID = B.B_ID
LEFT JOIN [BBB].[dbo].C c on B.B_ID = c.C_ID
如果您的数据库位于不同的服务器上,那么您仍然可以使其工作,但您需要设置linked servers,这有点困难。