Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何确定两个表之间共享哪些列?_Sql_Sql Server_Join - Fatal编程技术网

Sql 如何确定两个表之间共享哪些列?

Sql 如何确定两个表之间共享哪些列?,sql,sql-server,join,Sql,Sql Server,Join,非常新的SQL服务器在这里。。。我理解连接表等的概念,但确定共享哪些列的最简单方法是什么 比如说,我们有表1和表2,假设表1和表2一样有100多列,但它们只有一个共同的列 有没有一种简单的方法可以检查共享了哪些列/如果有的话,而不用麻烦地进入并检查 这个问题很简单,但很有用。谢谢,这很可能说明了一个基本的设计问题,但是要找到两个表共享的列名,有两个选项 SELECT name FROM sys.columns WHERE object_id IN (object_id('dbo.Table1

非常新的SQL服务器在这里。。。我理解连接表等的概念,但确定共享哪些列的最简单方法是什么

比如说,我们有表1和表2,假设表1和表2一样有100多列,但它们只有一个共同的列

有没有一种简单的方法可以检查共享了哪些列/如果有的话,而不用麻烦地进入并检查


这个问题很简单,但很有用。谢谢,这很可能说明了一个基本的设计问题,但是要找到两个表共享的列名,有两个选项

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


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

SELECT c.name ColumnName
FROM sys.columns c INNER JOIN
     sys.tables t ON c.object_id = t.object_id 
WHERE t.name = 'something'
下面是一个用于查找常用列名的联接:

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

您可以在
INFORMATION\u 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\u schema='dbo'
等添加到
where
子句中。

使用信息\u 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'
--输出


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

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

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

SELECT 
    *
FROM 
    DATABASENAME.INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_NAME = N'TABLE1'
这将返回表中各列上的几列元数据。我发现一些有趣的唯一性元数据包括

2.在我的例子中,我已经确定了
column\u NAME、IS\u null和DATA\u 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.概念检查。。。如果我们只使用
COLUMN\u NAME
加入
JOIN
时,有10个匹配的列。也许当我们使用
列名称和数据类型
连接
时,会有7个匹配列。也许当我们使用上述示例中的所有三个条件时,有4个匹配列。这是否意味着您只能在4个匹配列上加入…绝对不能。它意味着你需要考虑如何处理错误处理和铸造,这取决于你打算如何加入表格。关键是要小心地在
信息\u架构.列.列\u名称上执行
联接
,因为您的结果可能与预期相差甚远。

使用以下查询(名称用于显示coman列列表)


我本来打算建议在INFORMATION_SCHEMA.COLUMNS(类似于Chad Henderson)上进行自连接,但这非常巧妙。欢迎使用堆栈溢出!虽然这个代码片段是受欢迎的,并可能提供一些帮助,但它将是如何以及为什么解决这个问题。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请在回答中添加解释,并说明适用的限制和假设。信息\u模式oracle中没有这样的内容??
SELECT 
    *
FROM 
    DATABASENAME.INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_NAME = N'TABLE1'
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'
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'))
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table1'

intersect

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table2'
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