1

我有以下比较 sql 代码。两个表都包含一个 IDCodeField 列。如何仅比较 IDCodeField,但如果匹配 IDCodeField,则返回所有字段?

目前我在下面使用,但是,它将比较所有字段而不是仅 IDCodeField。

ALTER PROCEDURE [dbo].[usp_comparetables](@table1 varchar(100), 
 @table2 Varchar(100), @columnlist Varchar(1000))

AS

DECLARE @sql VARCHAR(8000)
SET @sql = 
'SELECT ''' + @table1 + ''' AS DataState, * FROM
    (SELECT ' + @columnlist + ' FROM ' + @table1 + '
        EXCEPT
    SELECT ' + @columnlist + ' FROM ' + @table2 + ') x
UNION
SELECT ''' + @table2 + ''' AS DataState, * from
    (SELECT ' + @columnlist + ' FROM ' + @table2 + '
        INTERSECT
    SELECT ' + @columnlist + ' FROM ' + @table1 +') x'

EXEC(@sql)

使用答案:

DECLARE @sql VARCHAR(8000)
SET @sql = 
'SELECT ''' + @table1 + ''' AS DataState, '+@columnlist+' FROM ' + @table1 + ' where '+@compareparameter+' not in (select '+@compareparameter+' from '+@table2+') 
UNION ALL 
SELECT ''' + @table2 + ''' AS DataState, '+@columnlist+' FROM ' + @table2 + ' where '+@compareparameter+' not in (select '+@compareparameter+' from '+@table1+')' 
EXEC(@sql)
4

2 回答 2

3

认为Table1您想要and中的所有行Table2,以便每个IDCodeField值仅出现在一个表或另一个表中。您希望排除两个表中出现相同值的行。

暂时忽略如果相同的值出现在同一个表中该怎么办的问题,最简单的查询是:

SELECT * from Table1 T1 full outer join Table2
ON T1.IDCodeField = T2.IDCodeField
WHERE T1.IDCodeField is null or T2.IDCodeField is null

这将为您提供结果,但可能不是您正在寻找的格式 - 结果行将与两个表的组合一样宽,非匹配表中的列将为NULL.

或者,我们可以按照UNION您的问题的风格来做。

SELECT * from Table1 where IDCodeField not in (select IDCodeField from Table2)
UNION ALL
SELECT * from Table2 where IDCodeField not in (select IDCOdeField from Table1)

如果相同的值仅在单个表中重复,则上述两个查询都将返回行。IDCodeField如果您希望排除这种可能性,您可以先尝试查找唯一值:

;With UniqueIDs as (
    SELECT IDCodeField
    FROM (
        SELECT IDCodeField from Table1
        union all
        select IDCodeField from Table2) t
    GROUP BY IDCodeField
    HAVING COUNT(*) = 1
)
SELECT * from (
    SELECT * from Table1
    union all
    select * from Table2
) t
  INNER JOIN
UniqueIDs u
  ON
    t.IDCodeField = u.IDCodeField

(当然,SELECT *上面的所有使用都应该替换为适当的列列表)

于 2012-05-07T05:41:39.883 回答
0
select * from table1 t1
inner join table2 t2 on t1.IDCodeField = t2.IDCodeField
于 2012-05-07T05:23:39.997 回答