Pregunta ¿Cómo determinar qué columnas se comparten entre dos tablas?


Muy nuevo para SQL Sever aquí ... Entiendo el concepto de unir tablas, etc., pero ¿cuál es la forma más fácil de determinar qué columnas se comparten?

Digamos, por ejemplo, que tenemos la Tabla 1 y la Tabla 2, supongamos que la tabla 1 tiene más de 100 columnas como en la tabla 2, pero solo tienen 1 columna en común.

¿Hay una manera simple de verificar para ver qué columna / si alguna se comparte sin entrar y verificar molestamente?

Una pregunta bastante trivial pero muy útil. Gracias


8
2018-06-13 16:41


origen


Respuestas:


Puede encontrar datos como este en el INFORMATION_SCHEMA mesas. Técnicamente, esos están más estandarizados que los sys puntos de vista. (Ver esta pregunta.)

Aquí hay una consulta que puede usar:

select A.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS A
join INFORMATION_SCHEMA.COLUMNS B
  on A.COLUMN_NAME = B.COLUMN_NAME
where A.TABLE_NAME = 'table1'
  and B.TABLE_NAME = 'table2'

Si necesita especificar el esquema para evitar colisiones de nombres, agregue A.TABLE_SCHEMA = 'dbo' etc a la where cláusula.


9
2018-06-13 16:47



Use INFORMATION_SCHEMA.COLUMNS como este:

IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE Table1
IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE Table2
GO
CREATE TABLE Table1 (
    a INT
  , b INT
  , c INT
  , d INT
  , e INT
  , f INT
)

CREATE TABLE Table2 (
    c INT
  , d INT
  , e INT
  , f INT
  , g INT
  , h INT
  , i INT
)

GO

SELECT t1.COLUMN_NAME 
FROM        INFORMATION_SCHEMA.COLUMNS AS t1 
INNER JOIN  INFORMATION_SCHEMA.COLUMNS AS t2 ON t1.COLUMN_NAME = t2.COLUMN_NAME 
WHERE t1.TABLE_NAME = 'Table1' AND t2.TABLE_NAME = 'Table2'

- SALIDA

COLUMN_NAME
c
d
e
f

3
2018-06-13 16:49



select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table1'

intersect

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table2'

2
2018-02-10 07:17



Esto bien podría indicar un problema de diseño fundamental, pero para encontrar los nombres de columna compartidos por ambas tablas, un par de opciones serían

SELECT name 
FROM sys.columns 
WHERE object_id IN (object_id('dbo.Table1'),
                    object_id('dbo.Table2'))
GROUP BY name
HAVING COUNT(*) = 2

O

SELECT name 
FROM sys.columns 
WHERE object_id = object_id('dbo.Table1')
INTERSECT
SELECT name 
FROM sys.columns 
WHERE object_id = object_id('dbo.Table2')

1
2018-06-13 16:45



Aquí hay una consulta práctica que puede usar para listar columnas en una tabla:

SELECT c.name ColumnName
FROM sys.columns c INNER JOIN
     sys.tables t ON c.object_id = t.object_id 
WHERE t.name = 'something'

Y aquí hay un JOIN que podría usar para encontrar nombres comunes de columnas:

SELECT * 
FROM  (SELECT c.name ColumnName
        FROM sys.columns c INNER JOIN
             sys.tables t ON c.object_id = t.object_id 
        WHERE t.name = 'table1'
      )t1
JOIN (SELECT c.name ColumnName
        FROM sys.columns c INNER JOIN
             sys.tables t ON c.object_id = t.object_id 
        WHERE t.name = 'table2'
     )t2
ON t1.ColumnName = t2.ColumnName

0
2018-06-13 16:45



Saber si tienes columnas similares podría ser más complicado de lo que sugieren las otras soluciones. Podríamos pensar que dos columnas son iguales porque comparten el mismo nombre pero, en realidad, cuando trabajas en una gran base de datos con más de una persona creando, eliminando y / o cambiando la estructura de datos pueden ocurrir incoherencias.

Cuantos más parámetros verifiquemos para la semejanza, más seguros podremos ser de que nuestras columnas sean similares sin una inspección manual de los datos brutos.

1. Primero, sugiero que ejecute una consulta para comprender los parámetros de una columna determinada.

SELECT 
    *
FROM 
    DATABASENAME.INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_NAME = N'TABLE1'

Esto devolverá varias columnas de metadatos en las columnas de la tabla. Algunos de los metadatos que encontré interesantes para la singularidad incluidos ...

enter image description here 

2.   En mi caso, he identificado los atributos de columna de COLUMN_NAME, IS_NULLABLE, AND DATA_TYPE para determinar si mis columnas realmente coinciden.

SELECT 
    DISTINCT A.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS A
    LEFT join INFORMATION_SCHEMA.COLUMNS B 
        ON A.COLUMN_NAME = B.COLUMN_NAME 
        AND A.DATA_TYPE = B.DATA_TYPE
        AND A.IS_NULLABLE = B.IS_NULLABLE
WHERE 
    A.TABLE_NAME = N'TABLE1'
    AND B.TABLE_NAME = N'TABLE2'

3. Concepto de verificación ... Tal vez si cuando JOIN usando solo COLUMN_NAME hay 10 columnas coincidentes. Tal vez cuando JOIN utilizando COLUMN_NAME AND DATA_TYPE hay 7 columnas coincidentes. Tal vez cuando usemos las tres condiciones como en el ejemplo anterior, hay 4 columnas coincidentes. ¿Significa que solo puedes unirte a 4 columnas coincidentes ... absolutamente no? Lo que significa es que tendrá que considerar cómo crear el manejo de errores y la conversión, dependiendo de cómo intente UNIRSE a las tablas. El punto es ser cuidadoso de realizar JOIN en INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME ya que sus resultados pueden estar lejos de ser intencionales.


0
2017-12-23 19:13



Use la siguiente consulta (nombre usado para mostrar la lista de columnas de coman)

select name from syscolumns s1 where id = object_id('table1') and            exists(select 1 from syscolumns s2 where s2.name = s1.name and s2.id = object_id('table2'))

0
2017-10-28 07:15