16

在这里对 SQL Sever 非常陌生...我了解连接表等的概念,但是确定共享哪些列的最简单方法是什么?

假设我们有表 1 和表 2,假设表 1 和表 2 一样有 100 多列,但它们只有 1 列共有。

有没有一种简单的方法可以检查哪些列/如果有共享而无需烦人地进入和检查?

非常琐碎的问题,但非常有用。谢谢

4

8 回答 8

16

您可以在INFORMATION_SCHEMA表格中找到类似的数据。从技术上讲,这些比sys视图更标准化。(见这个问题。)

这是您可以使用的查询:

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'

如果您需要指定架构以避免名称冲突,请将A.TABLE_SCHEMA = 'dbo'etc 添加到where子句中。

于 2013-06-13T16:47:59.473 回答
4

这很可能表明一个基本的设计问题,但要找到两个表共享的列名,有几个选项是

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

或者

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')
于 2013-06-13T16:45:40.743 回答
3

像这样使用 INFORMATION_SCHEMA.COLUMNS:

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'

- 输出

COLUMN_NAME
c
d
e
f
于 2013-06-13T16:49:57.290 回答
2
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table1'

intersect

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table2'
于 2017-02-10T07:17:46.657 回答
0

这是一个方便的查询,可用于列出表中的列:

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

这是一个 JOIN,您可以使用它来查找常见的列名:

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
于 2013-06-13T16:45:46.690 回答
0

要知道您是否有类似的列可能比其他解决方案建议的更棘手。我们可能会认为两列是相同的,因为它们共享相同的名称,但实际上,当您在一个大型数据库中工作时,有多个人创建、删除和/或更改数据结构,可能会发生不一致。

我们检查相似性的参数越多,我们就越有信心在不手动检查原始数据的情况下我们的列是相似的。

1.首先,我建议您运行查询以了解给定列的参数。

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

这将在表中的列上返回几列元数据。我发现一些有趣的独特性元数据包括......

在此处输入图像描述

2. 就我而言,我已经确定了列属性COLUMN_NAME, IS_NULLABLE, AND DATA_TYPE以确定我的列是否真正匹配。

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.概念检查...如果我们JOIN只使用COLUMN_NAME10 个匹配列。也许当我们JOIN使用时COLUMN_NAME AND DATA_TYPE有 7 个匹配列。也许当我们使用上面示例中的所有三个条件时,有 4 个匹配列。这是否意味着您只能在 4 个匹配的列上加入……绝对不是。这意味着您将需要考虑如何根据您打算如何加入表来制作错误处理和强制转换。重点是要小心执行JOININFORMATION_SCHEMA.COLUMNS.COLUMN_NAME因为您的结果可能与预期相去甚远。

于 2015-12-23T19:13:54.870 回答
0

使用以下查询(用于显示科曼列列表的名称)

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'))
于 2016-10-28T07:15:38.603 回答
0
IF OBJECT_ID('tempdb..#Table1') IS NOT NULL DROP TABLE #Table1
IF OBJECT_ID('tempdb..#Table2') IS NOT NULL DROP TABLE #Table2


SELECT      COLUMN_NAME AS 'ColumnName'
            ,TABLE_NAME AS  'TableName'
INTO        #Table1
FROM        INFORMATION_SCHEMA.COLUMNS
WHERE       TABLE_NAME = 'TABLE_NAME1'
ORDER BY    TableName
            ,ColumnName;

SELECT      COLUMN_NAME AS 'ColumnName'
            ,TABLE_NAME AS  'TableName'
INTO        #Table2
FROM        INFORMATION_SCHEMA.COLUMNS
WHERE       TABLE_NAME = 'TABLE_NAME2'
ORDER BY    TableName
            ,ColumnName;

SELECT #Table1.ColumnName
FROM #Table1
JOIN #Table2 ON #Table1.ColumnName = #Table2.ColumnName
于 2019-02-12T16:39:25.523 回答