Cuando se pueden encontrar datos, consultar desde otra tabla de base de datos

Supongamos que hay tablas A, B y C.

A y B son de la base de datos AAA, y C es de la base de datos BBB. Que yo sepa, no puedo unir tablas de bases de datos diferentes.

Entonces, quiero unirme a A y B, y si no se devuelve nada, quiero consultar desde la tabla 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

Para un ejemplo,

select * from A outer join B on A_ID= B_ID

1 y 2 devolverán PAUL y BOB bajo "nombre". pero 3 se unirán pero nada regresará. Entonces me gustaría consultar C.

Mi idea es hacer un bucle, pero quería saber si hay una idea mejor. Y soy totalmente nuevo en ASP, así que si etiqueto algo mal... por favor, ayúdenme. Gracias

preguntado el 04 de julio de 12 a las 00:07

Si puede unirse desde diferentes bases de datos o no, depende del DBMS que esté utilizando (¿Servidor Sql?) Y cuán "diferente" sea. -

Como dijo Stefan, esto depende de dbms. Si es Oracle y tiene varios esquemas en la misma instancia, o si es SQL Server y tiene varias bases de datos en la misma instancia, puede unirlas. En SQL Server, tendría que calificar completamente los nombres de las tablas, pero en Oracle podría crear sinónimos públicos para que no tenga que calificar completamente. Si los dos esquemas/bases de datos no están en la misma instancia, en Oracle puede crear un DBLink y aun así puede unirlos, aunque no lo recomendaría para ninguna base de datos de gran volumen. Personalmente, no sé qué ofrecen otros DBMS. -

3 Respuestas

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

Respondido 04 Jul 12, 00:07

C es de otra base de datos. No creo que el sistema permita esto. di jaja

Cuando dijiste hen I would like to query C., ¿cómo planeaba obtener valores de C? - Akhil

Siempre que todas las bases de datos estén en el mismo servidor (y su inicio de sesión tenga acceso a todas ellas), puede simplemente JOIN DatabaseC.dbo.SomeTable, Donde dbo es el nombre del esquema.

Respondido 04 Jul 12, 01:07

Esta respuesta es específica de SQL Server. Además, cuando dice "Servidor", eso no significa servidor físico, significa Instancia. Si tiene varias instancias en el mismo servidor físico, no puede simplemente unir bases de datos a través de ellas sin un enlace. - Jim

Si sus bases de datos están en el mismo servidor, puede usar un nombre completo simplemente unir tablas en las dos bases de datos. Tenga en cuenta que su sintaxis para un outer join no es válido t-sql. Debe especificar qué tipo de outer join quieres una left join, right join, etc.

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

A CASE podría hacer que su salida sea un poco más legible, pero no funcionaría si existiera un nombre en varias tablas para una identificación determinada (bueno, funcionaría, pero perdería algunos datos). Sin embargo, si una ID solo tendrá un nombre en una tabla, entonces podría hacer que su salida sea un poco más legible.

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

Si sus bases de datos están en diferentes servidores, aún puede hacer que esto funcione, pero deberá configurar servidores vinculados, que es un poco más difícil.

Respondido 04 Jul 12, 01:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.