当可以找到数据时,从另一个DB表中查询

时间:2012-07-03 23:32:25

标签: sql asp-classic

因此假设有表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完全不熟悉所以如果我标记出错了......请帮忙。 谢谢

3 个答案:

答案 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 joinright 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,这有点困难。