这里对SQL Sever很新......我理解连接表等的概念,但是确定共享哪些列的最简单方法是什么?
比如说我们有表1和表2,假设表1和表2一样有100多列,但它们只有1列共同。
是否有一种简单的方法可以检查哪些列/是否共享而没有烦人地进入和检查?
非常简单的问题,但非常有用。谢谢
答案 0 :(得分:12)
您可以在INFORMATION_SCHEMA
表中找到这样的数据。从技术上讲,这些视图比sys
视图更标准化。 (见this question。)
以下是您可以使用的查询:
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'
等添加到where
子句中。
答案 1 :(得分: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
答案 2 :(得分:2)
这很好地表明了一个基本的设计问题,但要找到两个表共享的列名,可以选择几个选项
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')
答案 3 :(得分:2)
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table1'
intersect
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table2'
答案 4 :(得分: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
答案 5 :(得分: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_NAME
,则有10个匹配列。也许当我们JOIN
使用COLUMN_NAME AND DATA_TYPE
时,有7个匹配的列。也许当我们使用上面示例中的所有三个条件时,有4个匹配的列。这是否意味着你只能加入4个匹配的列......绝对不能。它的意思是你需要考虑如何制作错误处理和转换,具体取决于你打算如何加入表格。要点JOIN
INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME
,因为您的结果可能远非预期。
答案 6 :(得分:0)
使用以下查询(用于显示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'))
答案 7 :(得分: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