none
Como poder hacer consultas entre bases de datos distintas.

    Question

  • Estimados, tengo la siguiente interrogante en TRANSACT SQL.  Tengo dos base de datos distintas, BASE1 Y BASE2, ambas bases de datos poseen tablas distintas y todo distinto. (están en el mismo servidor), salvo una tabla, tabla_hermana la cuál está presente en ambas bases de datos, pero ambas tablas a pesar de tener los mismos campos y la misma estructura, tienen algunos registros distintos.

    Necesito saber QUÉ REGISTROS DE LA TABLA HERMANA DE LA BASE2 no están en la TABLA HERMANA DE LA BASE

    Cualquier ayuda será bienvenida. 

    Wednesday, October 10, 2012 12:51 PM

Answers

  • Hola,

    debes especificar de donde proviene RUT, porque este campo esta en ambas tablas prueba con el siguiente query. Recuerda que debes tomar en cuenta siempre el origen de la columna que debes retorna, de lo contrario siempre tendras este problema

    select bd2.Rut
    FROM BASEDATOS2.dbo.Tabla2 bd2
    LEFT JOIN BASEDATOS1.dbo.Tabla1 bd1
    ON bd1.rut = bd2.Rut 
    WHERE bd1.rut IS NULL


    Ahias Portillo

    • Marked as answer by Excoriate Saturday, October 13, 2012 6:42 PM
    Saturday, October 13, 2012 6:35 PM

All replies

  • Hola,

    Revisa esta dirección:

    [SQL]Select tabla registros no estan en otra tabla

    Como ves se plantea y soluciona el tema, la única diferencia es que como estas trabajando con diferentes bases de datos, harias referencia a tus tablas de esta manera:

    BaseDatos.Tabla

    Y a tus campos :

    BaseDatos.Tabla.Campo


    Un saludo, Cristian Pérez

    Wednesday, October 10, 2012 1:07 PM
  • Hola... para empezar necesitas que tu usuario tenga acceso a las 2 bases que quieres cruzar, despues referenciarlo como te menciono Cristian Perez de la siguiente manera : 

    select * --- SOLO LOS CAMPOS QUE NECESITES
    FROM baseDatos2.dbo.tuTabla bd2
    LEFT JOIN baseDatos1.dbo.tuTabla bd1
    ON bd1.tuCampo = bd2.tuCampo -- << AQUI VAN LOS CAMPOS POR LOS CUALES SE RELACIONAN
    WHERE bd1.tuCampo IS NULL

    De esta manera, con un LEFT JOIN y con tu WHERE IS NULL, obtendrás los registros que estén en tu Base 2 y no estén en tu Base, pero recuerda, el user con el que vayas a hacer la consulta, debe tener acceso a ambas.

    SALUDOS!


    Sergio Sánchez Arias


    Wednesday, October 10, 2012 1:27 PM
  • Hola... para empezar necesitas que tu usuario tenga acceso a las 2 bases que quieres cruzar, despues referenciarlo como te menciono Cristian Perez de la siguiente manera : 

    select * --- SOLO LOS CAMPOS QUE NECESITES
    FROM baseDatos2.dbo.tuTabla bd2
    LEFT JOIN baseDatos1.dbo.tuTabla bd1
    ON bd1.tuCampo = bd2.tuCampo -- << AQUI VAN LOS CAMPOS POR LOS CUALES SE RELACIONAN
    WHERE bd1.tuCampo IS NULL

    De esta manera, con un LEFT JOIN y con tu WHERE IS NULL, obtendrás los registros que estén en tu Base 2 y no estén en tu Base, pero recuerda, el user con el que vayas a hacer la consulta, debe tener acceso a ambas.

    SALUDOS!


    Sergio Sánchez Arias


    Hola,

    Como menciona sergio, la clave de esta consulta es utilizar un LEFT JOIN y filtrar especificamente aquellos que no esten en el repositorio destino, solo por aportar un poco mas al ejemplo propuesto por sergio, el resultado de query (El select), es el que deberas insertar para ello te muestro el ejemplo de como hacer el insert en base a lo propuesto por sergio.

    --Recuerda que el resultado de tu Select debes insertarlo masivamente.
    INSERT INTO baseDatos2.dbo.tuTabla ([Campo1],.....,[Campon])
    select  --- SOLO LOS CAMPOS QUE NECESITES
           [Campo1],
    	   ...
    	   ...
    	   ...
    	   [Campon]
    FROM baseDatos2.dbo.tuTabla bd2
    LEFT JOIN baseDatos1.dbo.tuTabla bd1
    ON bd1.tuCampo = bd2.tuCampo -- << AQUI VAN LOS CAMPOS POR LOS CUALES SE RELACIONAN
    WHERE bd1.tuCampo IS NULL

    Un punto importante que deberias tomar en cuenta es el proceso de actualizacion, ya que generalmente estos procesos implican las dos tareas para poder manterner sincronizado ambos ambientes, para ello deberas utilizar la clausula UPDATE con INNER JOIN, por medio de los campos llave de tus tablas.

    saludos cordiales


    Ahias Portillo

    Thursday, October 11, 2012 3:25 AM
  • Hola, pero por nos lo pregunta?. Con que version de SQL estas trabajando, tienes algun error al hacerlo.

    te paso la propiedead TRUSTWORTHY -> Confiar en las bbdd de una instancia, http://msdn.microsoft.com/es-es/library/ms187861(v=sql.105).aspx
    Revisa como tienes configurada esta propiedad de base de datos (TRUSTWORTHY), sirve para indicar si la instancia de SQL Server confía en la base de datos y en su contenido. De forma predeterminada, se establece en OFF, pero puede establecerse en ON mediante la instrucción ALTER DATABASE. Por ejemplo, ALTER DATABASE AdventureWorks2012 SET TRUSTWORTHY ON;


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    Thursday, October 11, 2012 10:08 AM
  • Estimados.

    Con la siguiente consulta (construida gracias a sus sugerencias):

    select Rut
    FROM BASEDATOS2.dbo.Tabla2 bd2
    LEFT JOIN BASEDATOS1.dbo.Tabla1 bd1
    ON bd1.rut = bd2.Rut 
    WHERE bd1.rut IS NULL

    Pero me aparece el error 

    El nombre de columna 'Rut' es ambiguo.

    Ya me aseguré de la propiedad TRUSTWORTHY. (SqlServer 2008)

    Si hago ésto, el resultado es correcto, pero sólo necesito obtener el resultado de la columna RUT.

    select *
    FROM BASEDATOS2.dbo.Tabla2 bd2
    LEFT JOIN BASEDATOS1.dbo.Tabla1 bd1
    ON bd1.rut = bd2.Rut 
    WHERE bd1.rut IS NULL




    • Edited by Excoriate Saturday, October 13, 2012 6:34 PM
    Saturday, October 13, 2012 6:30 PM
  • Hola,

    debes especificar de donde proviene RUT, porque este campo esta en ambas tablas prueba con el siguiente query. Recuerda que debes tomar en cuenta siempre el origen de la columna que debes retorna, de lo contrario siempre tendras este problema

    select bd2.Rut
    FROM BASEDATOS2.dbo.Tabla2 bd2
    LEFT JOIN BASEDATOS1.dbo.Tabla1 bd1
    ON bd1.rut = bd2.Rut 
    WHERE bd1.rut IS NULL


    Ahias Portillo

    • Marked as answer by Excoriate Saturday, October 13, 2012 6:42 PM
    Saturday, October 13, 2012 6:35 PM
  • Hola,

    debes especificar de donde proviene RUT, porque este campo esta en ambas tablas prueba con el siguiente query. Recuerda que debes tomar en cuenta siempre el origen de la columna que debes retorna, de lo contrario siempre tendras este problema

    select bd2.Rut
    FROM BASEDATOS2.dbo.Tabla2 bd2
    LEFT JOIN BASEDATOS1.dbo.Tabla1 bd1
    ON bd1.rut = bd2.Rut 
    WHERE bd1.rut IS NULL


    Ahias Portillo

    Por fin pude solucionar el problema, te lo agradezco mucho.
    Saturday, October 13, 2012 6:42 PM