识别2个不同表中相同的行

时间:2012-03-26 11:09:08

标签: sql sql-server sql-server-2008 sql-server-2005

我有2个具有相同模式的表(一个是临时表)

临时表和主表都有几行相同。

我需要更新主表,其中temptable上存在相同的条目。

最好的方法是什么。

这些表有100多列。那么有可能在没有列出查询中的所有列的情况下这样做吗?

非常感谢

4 个答案:

答案 0 :(得分:3)

您需要使用MERGE语句。一个很好的指南是http://technet.microsoft.com/en-us/library/bb522522.aspx

现在,就列出列而言,只需使用唯一键来确定行是否通用。

答案 1 :(得分:2)

您可以动态构建查询。我不认为这是一个特别优雅的解决方案,但它可以做到这一点:

DECLARE @TableName VARCHAR(100),
        @FlagColumn VARCHAR(100)

SET @TableName = 'TestTable'
SET @FlagColumn = 'FlagColumn'
-- BUILD THE TEMPORARY TABLE
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT * INTO ##' + @TableName + ' FROM ' + @TableName
EXEC(@SQL)

-- DO STUFF

-- BUILD SQL FOR MERGE STATEMENT
SET @SQL = ''
SELECT  @SQL = @SQL + ' AND main.' + COLUMN_NAME + ' = temp.' + COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME = @TableName
AND     COLUMN_NAME != @FlagColumn

SET @SQL = 'MERGE INTO ' + @TableName + ' main USING ##' + @TableName + ' temp ON ' + STUFF(@SQL, 1, 5, '') + 
            ' WHEN MATCHED THEN UPDATE SET ' + @FlagColumn + ' = 1;'
-- EXECUTE MERGE STATEMENT
EXEC (@SQL)

-- DROP TEMP TABLE
SET @SQL = 'DROP TABLE ##' + @TableName
EXEC (@SQL)

这比必要的更动态,并且可以简化,因为没有一个临时表的东西需要动态完成,我刚刚完成了这个,因为我不知道你的表名或你的临时表名。

我通过创建下表对此进行了测试:

CREATE TABLE TestTable (FlagColumn BIT)
DECLARE @i INT = 1
DECLARE @SQL VARCHAR(MAX)
WHILE @i < 100
    BEGIN
        SET @SQL = 'ALTER TABLE TestTable ADD COLUMN' + CONVERT(VARCHAR, @i) + ' INT'
        EXEC (@SQL)
        SET @i = @i + 1
    END

答案 2 :(得分:1)

update MyTable set
  ColumnX = ?? /* Update the columns your require to the new values */
  , ColumnY = ??
from MyTable, MyTempTable T
where MyTable.ColumnA = T.ColumnA
and MyTable.ColumnB = T.ColumnB
/* Add as many conditions as necessary to be a match */

如果列可以为null,则必须将其处理为:

where ((MyTable.ColumnA is null and T.ColumnA isn null) or MyTable.ColumnA = T.ColumnA)

或者如果您知道某个特定值无效,因为您可以在标识列中执行0

where isnull(MyTable.ColumnA,0) = isnull(T.ColumnA,0)

答案 3 :(得分:1)

也许您正在寻找Intersect。查询:

select *
from TableA
intersect
select * 
from TableB

检索两个集合中找到的行。

至于百列问题,打开Sql Server Management Studio,在表中找到你的表,右键单击并选择“Script table as”,然后“Insert to”,然后“New query window”得到逗号分隔列表列。

相关问题