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

各値がいずれかのテーブルにのみ表示されるように、とからのすべての行が必要だと思います。両方のテーブルに同じ値が表示される行を除外したいとします。Table1Table2IDCodeField

今のところ、同じ値が同じテーブルに表示された場合の対処方法を無視すると、最も単純なクエリは次のようになります。

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 に答える