2012-05-07 87 views
1

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

目前我正在使用下面,但是,它将仅比较所有字段而不是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, '[email protected]+' FROM ' + @table1 + ' where '[email protected]+' not in (select '[email protected]+' from '[email protected]+') 
UNION ALL 
SELECT ''' + @table2 + ''' AS DataState, '[email protected]+' FROM ' + @table2 + ' where '[email protected]+' not in (select '[email protected]+' from '[email protected]+')' 
EXEC(@sql) 
+1

你的答案对SQL注入非常开放。 'EXEC [usp_comparetables] @ table1 ='myTable',@ table2 ='myTable2',@columnList ='''; DROP TABLE myTable;走; ''''''''只是一个简单的例子。 SQL注入似乎从来没有,直到你被它咬了一次。 – Seph

回答

3

认为你想从Table1Table2,使得每个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 *所有使用应符合相应的列清单替换)

+0

谢谢......我用你的第二种方法......很好用...... – kyusan93

0
select * from table1 t1 
inner join table2 t2 on t1.IDCodeField = t2.IDCodeField 
相关问题