根据表之间的比较获得列的名称

时间:2012-05-04 19:47:59

标签: sql sql-server-2008 excel

我的目标是根据表Product_A和Product_B中的类似列检索列名称的结果。

如果我从sql server获得excel,notepad或table中的结果并不重要。最重要的是检索结果。

我不知道如何根据手动工作使用率低的计算检索结果?

您需要考虑的一些标准:

  • 列必须具有相同的数据类型和名称
  • 我对从
  • 列中检索数据不感兴趣
  • 该表是在基本级别创建的。实际上,该表使用了200列。

该表位于SQL Server 2008 R2

TABLE Product_A
(
   ProductID INT,
   ProductName VARCHAR(100),
   Rate MONEY,
   Action INT,
   MapINT,
) 


TABLE Product_B
(
   ProductID INT,
   Count INT,
   ProductName VARCHAR(100),
   Rate MONEY
) 



Requested result

       ProductID INT,
       ProductName VARCHAR(100),
       Rate MONEY,

2 个答案:

答案 0 :(得分:1)

此查询将比较两个表并仅返回相同数据类型的同名列。如果您需要查找数据库中的所有匹配项,请注释掉t1.name =条件。

select 
      t1.name TableName, 
      c1.name ColumnName,
      types.name,
      c1.max_length,
      c1.precision,
      c1.scale
 from sys.columns c1
inner join sys.columns c2
   -- Condition to join columns - same name, type, length, precision and scale
   on c1.name = c2.name
  and c1.system_type_id = c2.system_type_id
  and c1.max_length = c2.max_length
  and c1.precision = c2.precision
  and c1.scale = c2.scale
   -- Exclude template table
  and c1.object_id <> c2.object_id
inner join sys.tables t1
   on c1.object_id = t1.object_id
inner join sys.types
   on c1.system_type_id = types.system_type_id
inner join sys.tables t2
   on c2.object_id = t2.object_id
where t2.name = 'Product_B'
   -- remove if you want to search for matches in all tables 
  and t1.name = 'Product_A'

查看sys.columnssys.tables上的文档。

答案 1 :(得分:0)

您的要求不是很清楚,但您可能指的是UNION,因此您可以从两个表中获取数据,这些数据将以不同的行为您提供每个表中的产品信息:

SELECT ProductId, ProductName, Rate
FROM Product_A
UNION 
SELECT ProductId, ProductName, Rate
FROM Product_B

如果您可以编辑OP并发布一些示例数据和预期结果,那么可以澄清查询。

如果您知道哪个表需要表A或B中的数据,那么您可以在ProductName上进行JOIN,但是您需要确定所需的速率和产品ID:

SELECT a.ProductId
    , a.ProductName
    , a.Rate
FROM Product_A a
JOIN Product_B b
    ON a.ProductName = b.ProductName