[SQL] SQL은 두 개의 테이블에서 데이터를 비교
SQLSQL은 두 개의 테이블에서 데이터를 비교
I는 예컨대 테이블 TableA의 모두 열의 동일한 포맷을 가지고 TableB의 컬럼이 두 테이블과 TableA의 TableB의이
A B C D E F
여기서, A와 B는 기본 키이다.
어떻게 동일한 기본 키가 TableA의와 TableB의 정확히 모든 열에서 같은 값을 포함하는 경우 그것을 확인하기 위해 SQL을 작성합니다.
그것은이 두 테이블은 정확히 같은 데이터를 가지고 있다는 것을 의미한다.
해결법
-
==============================
1.당신은 "마이너스"을 수행 할 수 또는 SQL이 DBMS에 의해 사용의 맛에 따라 "EXCEPT"한다.
당신은 "마이너스"을 수행 할 수 또는 SQL이 DBMS에 의해 사용의 맛에 따라 "EXCEPT"한다.
select * from tableA minus select * from tableB
쿼리에 행을 반환하지 않는 경우 다음 데이터가 정확히 동일합니다.
-
==============================
2.관계 연산자를 사용 :
관계 연산자를 사용 :
SELECT * FROM TableA UNION SELECT * FROM TableB EXCEPT SELECT * FROM TableA INTERSECT SELECT * FROM TableB;
변경 Oracle 용 MINUS는 예외로합니다.
약간 까다로운 점 : 위는 SQL 표준에 따라 YMMV 있도록 구현 의존 연산자 우선 순위에 의존합니다. 그것은 우선 순위가있는 SQL 서버, 작동 :
-
==============================
3.dietbuddha 좋은 답을 가지고있다. 당신이 MINUS이 있거나 EXCEPT하지 않는 경우, 하나의 옵션은 모든 열에서, 모든 테이블 사이에 그룹을 노동 조합을하고 있는지 모든 것을이 존재하는 것입니다 :
dietbuddha 좋은 답을 가지고있다. 당신이 MINUS이 있거나 EXCEPT하지 않는 경우, 하나의 옵션은 모든 열에서, 모든 테이블 사이에 그룹을 노동 조합을하고 있는지 모든 것을이 존재하는 것입니다 :
SELECT col1, col2, col3 FROM (SELECT * FROM tableA UNION ALL SELECT * FROM tableB) data GROUP BY col1, col2, col3 HAVING count(*)!=2
-
==============================
4.
SELECT c.ID FROM clients c WHERE EXISTS(SELECT c2.ID FROM clients2 c2 WHERE c2.ID = c.ID);
두 테이블에서 같은 모든 ID 년대를 반환합니다. NOT 존재에 차이 변화가 존재 얻으려면.
-
==============================
5.onedaywhen에서 스크립트를 가지고 가서, 나는 그것이 또한 각 항목에서 제공하는 테이블 보여주기 위해 수정했습니다.
onedaywhen에서 스크립트를 가지고 가서, 나는 그것이 또한 각 항목에서 제공하는 테이블 보여주기 위해 수정했습니다.
DECLARE @table1 NVARCHAR(80)= 'table 1 name' DECLARE @table2 NVARCHAR(80)= 'table 2 name' DECLARE @sql NVARCHAR (1000) SET @sql = ' SELECT ''' + @table1 + ''' AS table_name,* FROM ( SELECT * FROM ' + @table1 + ' EXCEPT SELECT * FROM ' + @table2 + ' ) x UNION SELECT ''' + @table2 + ''' AS table_name,* FROM ( SELECT * FROM ' + @table2 + ' EXCEPT SELECT * FROM ' + @table1 + ' ) y ' EXEC sp_executesql @stmt = @sql
-
==============================
6.다만 COMPLET로 발동 2 테이블과 비교하고 오류 상태 3, ADD, DEL, GAP와 같은 테이블에서 결과를 제공하는 방법을 제외하여 저장 테이블이 같은 PK가 있어야합니다, 당신은 하나 개 또는 두 테이블의 비교 2 개 테이블과 필드를 선언
다만 COMPLET로 발동 2 테이블과 비교하고 오류 상태 3, ADD, DEL, GAP와 같은 테이블에서 결과를 제공하는 방법을 제외하여 저장 테이블이 같은 PK가 있어야합니다, 당신은 하나 개 또는 두 테이블의 비교 2 개 테이블과 필드를 선언
이 같은 그냥 사용 ps_TableGap 'TBL1', 'TBL2', 'FLD1, FLD2, fld3', 'fld4'fld5'fld6'(선택 사항)
/****** Object: StoredProcedure [dbo].[ps_TableGap] Script Date: 10/03/2013 16:03:44 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Arnaud ALLAVENA -- Create date: 03.10.2013 -- Description: Compare tables -- ============================================= create PROCEDURE [dbo].[ps_TableGap] -- Add the parameters for the stored procedure here @Tbl1 as varchar(100),@Tbl2 as varchar(100),@Fld1 as varchar(1000), @Fld2 as varchar(1000)= '' AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; --Variables --@Tbl1 = table 1 --@Tbl2 = table 2 --@Fld1 = Fields to compare from table 1 --@Fld2 Fields to compare from table 2 Declare @SQL varchar(8000)= '' --SQL statements Declare @nLoop int = 1 --loop counter Declare @Pk varchar(1000)= '' --primary key(s) Declare @Pk1 varchar(1000)= '' --first field of primary key declare @strTmp varchar(50) = '' --returns value in Pk determination declare @FldTmp varchar (1000) = '' --temporarily fields for alias calculation --If @Fld2 empty we take @Fld1 --fields rules: fields to be compare must be in same order and type - always returns Gap If @Fld2 = '' Set @Fld2 = @Fld1 --Change @Fld2 with Alias prefix xxx become _xxx while charindex(',',@Fld2)>0 begin Set @FldTmp = @FldTmp + (select substring(@Fld2,1,charindex(',',@Fld2)-1) + ' as _' + substring(@Fld2,1,charindex(',',@Fld2)-1) + ',') Set @Fld2 = (select ltrim(right(@Fld2,len(@Fld2)-charindex(',',@Fld2)))) end Set @FldTmp = @FldTmp + @Fld2 + ' as _' + @Fld2 Set @Fld2 = @FldTmp --Determinate primary key jointure --rule: same pk in both tables Set @nLoop = 1 Set @SQL = 'Declare crsr cursor for select COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = ''' + @Tbl1 + ''' or TABLE_SCHEMA + ''.'' + TABLE_NAME = ''' + @Tbl1 + ''' or TABLE_CATALOG + ''.'' + TABLE_SCHEMA + ''.'' + TABLE_NAME = ''' + @Tbl1 + ''' order by ORDINAL_POSITION' exec(@SQL) open crsr fetch next from crsr into @strTmp while @@fetch_status = 0 begin if @nLoop = 1 begin Set @Pk = 's.' + @strTmp + ' = b._' + @strTmp Set @Pk1 = @strTmp set @nLoop = @nLoop + 1 end Else Set @Pk = @Pk + ' and s.' + @strTmp + ' = b._' + @strTmp fetch next from crsr into @strTmp end close crsr deallocate crsr --SQL statement build set @SQL = 'select case when s.' + @Pk1 + ' is null then ''Del'' when b._' + @Pk1 + ' is null then ''Add'' else ''Gap'' end as TypErr, ''' set @SQL = @SQL + @Tbl1 +''' as Tbl1, s.*, ''' + @Tbl2 +''' as Tbl2 ,b.* from (Select ' + @Fld1 + ' from ' + @Tbl1 set @SQL = @SQL + ' EXCEPT SELECT ' + @Fld2 + ' from ' + @Tbl2 + ')s full join (Select ' + @Fld2 + ' from ' + @Tbl2 set @SQL = @SQL + ' EXCEPT SELECT ' + @Fld1 + ' from ' + @Tbl1 +')b on '+ @Pk --Run SQL statement Exec(@SQL) END
-
==============================
7.dietbuddha의 대답을 향상 ...
dietbuddha의 대답을 향상 ...
select * from ( select * from tableA minus select * from tableB ) union all select * from ( select * from tableB minus select * from tableA )
-
==============================
8.당신은 모든 전체 외부 오라클에 참여 삽입의 조합을 사용하여 두 테이블의 차이를 찾을 수 있습니다. SQL에서는 완전 외부를 통해 차이 가입 추출 할 수 있지만 것으로 보인다 SQL의 모든 / 첫번째 나던 존재 삽입! 따라서, 대신 다음 쿼리를 사용해야합니다 :
당신은 모든 전체 외부 오라클에 참여 삽입의 조합을 사용하여 두 테이블의 차이를 찾을 수 있습니다. SQL에서는 완전 외부를 통해 차이 가입 추출 할 수 있지만 것으로 보인다 SQL의 모든 / 첫번째 나던 존재 삽입! 따라서, 대신 다음 쿼리를 사용해야합니다 :
select * from A full outer join B on A.pk=B.pk where A.field1!=B.field1 or A.field2!=B.field2 or A.field3!=B.field3 or A.field4!=B.field4 --and A.Date==Date1
사용하지만 'OR'절은 권장되지 않으며 그것은 일반적으로 낮은 성능을 산출 곳 테이블이 대규모하지 않은 경우, 당신은 여전히 쿼리 이상 사용할 수있다. 위의 질의에 대한 결과가 있다면, 정확히 필드 1,2,3,4의 비교를 기반으로 두 테이블의 차이입니다. 잘가 (주석 부분을 확인)으로 쿼리 성능을 향상 들어, 날짜를 필터링 할 수 있습니다
-
==============================
9.
SELECT unnest(ARRAY[1,2,2,3,3]) EXCEPT SELECT unnest(ARRAY[1,1,2,3,3]) UNION SELECT unnest(ARRAY[1,1,2,3,3]) EXCEPT SELECT unnest(ARRAY[1,2,2,3,3])
결과는 널 (null)이지만, 소스는 다르다!
그러나:
( SELECT unnest(ARRAY[1,2,2,3]) EXCEPT ALL SELECT unnest(ARRAY[2,1,2,3]) ) UNION ( SELECT unnest(ARRAY[2,1,2,3]) EXCEPT ALL SELECT unnest(ARRAY[1,2,2,3]) )
공장.
-
==============================
10.나는 SQL 서버에서이 같은 문제를 가지고 프로세스를 자동화하는이 T-SQL 스크립트를 (실제로는 물을 다운 버전이, 내 모든 쉽게보고를위한 하나의 테이블은 diff 쓴) 썼습니다.
나는 SQL 서버에서이 같은 문제를 가지고 프로세스를 자동화하는이 T-SQL 스크립트를 (실제로는 물을 다운 버전이, 내 모든 쉽게보고를위한 하나의 테이블은 diff 쓴) 썼습니다.
업데이트 '을 MyTable'과 비교하고자하는 테이블의 이름에 'MyOtherTable'.
DECLARE @ColName varchar(100) DECLARE @Table1 varchar(100) = 'MyTable' DECLARE @Table2 varchar(100) = 'MyOtherTable' IF (OBJECT_ID('tempdb..#col') IS NOT NULL) DROP TABLE #col SELECT IDENTITY(INT, 1, 1) RowNum , c.name INTO #col FROM SYS.Objects o JOIN SYS.columns c on o.object_id = c.object_id WHERE o.name = @Table1 AND NOT c.Name IN ('List','Columns','YouWantToIgnore') DECLARE @Counter INT = (SELECT MAX(RowNum) FROM #col) WHILE @Counter > 0 BEGIN SET @ColName = (SELECT name FROM #Col WHERE RowNum= @Counter) EXEC ('SELECT t1.Identifier ,t1.'+@ColName+' AS '+@Table1+@ColName+' ,t2.'+@ColName+' AS '+@Table2+@ColName+' FROM '+@Table1+' t1 LEFT JOIN '+@Table2+' t2 ON t1.Identifier = t2.Identifier WHERE t1.'+@ColName+' <> t2.'+@ColName) SET @Counter = @Counter - 1 END
-
==============================
11.나는 SQL 서버에 오라클에서 이식 꽤 불쾌한 뷰의 결과를 비교하기 위해 썼다. 이 표에 (당신이 그것을 짐작) 데이터의 차이와 테이블 자체의 스키마, 임시 테이블, #DataVariances 및 #SchemaVariances 한 쌍을 만듭니다.
나는 SQL 서버에 오라클에서 이식 꽤 불쾌한 뷰의 결과를 비교하기 위해 썼다. 이 표에 (당신이 그것을 짐작) 데이터의 차이와 테이블 자체의 스키마, 임시 테이블, #DataVariances 및 #SchemaVariances 한 쌍을 만듭니다.
이 두 테이블에 기본 키가 필요하지만, 소스 테이블이없는 경우 당신은 ID 열 tempdb에에 드롭 할 수있다.
declare @TableA_ThreePartName nvarchar(max) = '' declare @TableB_ThreePartName nvarchar(max) = '' declare @KeyName nvarchar(max) = '' /*********************************************************************************************** Script to compare two tables and return differneces in schema and data. Author: Devin Lamothe 2017-08-11 ***********************************************************************************************/ set nocount on -- Split three part name into database/schema/table declare @Database_A nvarchar(max) = ( select left(@TableA_ThreePartName,charindex('.',@TableA_ThreePartName) - 1)) declare @Table_A nvarchar(max) = ( select right(@TableA_ThreePartName,len(@TableA_ThreePartName) - charindex('.',@TableA_ThreePartName,len(@Database_A) + 2))) declare @Schema_A nvarchar(max) = ( select replace(replace(@TableA_ThreePartName,@Database_A + '.',''),'.' + @Table_A,'')) declare @Database_B nvarchar(max) = ( select left(@TableB_ThreePartName,charindex('.',@TableB_ThreePartName) - 1)) declare @Table_B nvarchar(max) = ( select right(@TableB_ThreePartName,len(@TableB_ThreePartName) - charindex('.',@TableB_ThreePartName,len(@Database_B) + 2))) declare @Schema_B nvarchar(max) = ( select replace(replace(@TableB_ThreePartName,@Database_B + '.',''),'.' + @Table_B,'')) -- Get schema for both tables declare @GetTableADetails nvarchar(max) = ' use [' + @Database_A +'] select COLUMN_NAME , DATA_TYPE from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = ''' + @Table_A + ''' and TABLE_SCHEMA = ''' + @Schema_A + ''' ' create table #Table_A_Details ( ColumnName nvarchar(max) , DataType nvarchar(max) ) insert into #Table_A_Details exec (@GetTableADetails) declare @GetTableBDetails nvarchar(max) = ' use [' + @Database_B +'] select COLUMN_NAME , DATA_TYPE from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = ''' + @Table_B + ''' and TABLE_SCHEMA = ''' + @Schema_B + ''' ' create table #Table_B_Details ( ColumnName nvarchar(max) , DataType nvarchar(max) ) insert into #Table_B_Details exec (@GetTableBDetails) -- Get differences in table schema select ROW_NUMBER() over (order by a.ColumnName , b.ColumnName) as RowKey , a.ColumnName as A_ColumnName , a.DataType as A_DataType , b.ColumnName as B_ColumnName , b.DataType as B_DataType into #FieldList from #Table_A_Details a full outer join #Table_B_Details b on a.ColumnName = b.ColumnName where a.ColumnName is null or b.ColumnName is null or a.DataType <> b.DataType drop table #Table_A_Details drop table #Table_B_Details select coalesce(A_ColumnName,B_ColumnName) as ColumnName , A_DataType , B_DataType into #SchemaVariances from #FieldList -- Get differences in table data declare @LastColumn int = (select max(RowKey) from #FieldList) declare @RowNumber int = 1 declare @ThisField nvarchar(max) declare @TestSql nvarchar(max) create table #DataVariances ( TableKey nvarchar(max) , FieldName nvarchar(max) , TableA_Value nvarchar(max) , TableB_Value nvarchar(max) ) delete from #FieldList where A_DataType in ('varbinary','image') or B_DataType in ('varbinary','image') while @RowNumber <= @LastColumn begin set @TestSql = ' select coalesce(a.[' + @KeyName + '],b.[' + @KeyName + ']) as TableKey , ''' + @ThisField + ''' as FieldName , a.[' + @ThisField + '] as [TableA_Value] , b.[' + @ThisField + '] as [TableB_Value] from [' + @Database_A + '].[' + @Schema_A + '].[' + @Table_A + '] a inner join [' + @Database_B + '].[' + @Schema_B + '].[' + @Table_B + '] b on a.[' + @KeyName + '] = b.[' + @KeyName + '] where ltrim(rtrim(a.[' + @ThisField + '])) <> ltrim(rtrim(b.[' + @ThisField + '])) or (a.[' + @ThisField + '] is null and b.[' + @ThisField + '] is not null) or (a.[' + @ThisField + '] is not null and b.[' + @ThisField + '] is null) ' insert into #DataVariances exec (@TestSql) set @RowNumber = @RowNumber + 1 set @ThisField = (select coalesce(A_ColumnName,B_ColumnName) from #FieldList a where RowKey = @RowNumber) end drop table #FieldList print 'Query complete. Select from #DataVariances to verify data integrity or #SchemaVariances to verify schemas match. Data types varbinary and image are not checked.'
-
==============================
12.응답의 대부분은 카밀에 의해 제기 된 문제를 무시하는 것 같다. (테이블이 동일한 행을 포함하지만, 다른 사람이 각 테이블에서 반복되는 곳이다.) 불행하게도, 내가 오라클이기 때문에, 자신의 솔루션을 사용할 수 없습니다입니다. I가 가지고 올 수 있었던 가장 :
응답의 대부분은 카밀에 의해 제기 된 문제를 무시하는 것 같다. (테이블이 동일한 행을 포함하지만, 다른 사람이 각 테이블에서 반복되는 곳이다.) 불행하게도, 내가 오라클이기 때문에, 자신의 솔루션을 사용할 수 없습니다입니다. I가 가지고 올 수 있었던 가장 :
SELECT * FROM ( SELECT column1, column2, ..., COUNT(*) AS the_count FROM tableA GROUP BY column1, column2, ... MINUS SELECT column1, column2, ..., COUNT(*) AS the_count FROM tableB GROUP BY column1, column2, ... ) UNION ALL ( SELECT column1, column2, ..., COUNT(*) AS the_count FROM tableB GROUP BY column1, column2, ... MINUS SELECT column1, column2, ..., COUNT(*) AS the_count FROM tableA GROUP BY column1, column2, ... )
-
==============================
13.우리는 간단한 쿼리 아래 사용하여 DB2 테이블의 두 테이블에서 데이터를 비교할 수 있습니다
우리는 간단한 쿼리 아래 사용하여 DB2 테이블의 두 테이블에서 데이터를 비교할 수 있습니다
1 단계 : - 우리는 테이블 스키마 (T1)에서 비교하기 위해 필요한 모든 열 선택 (S)
SELECT T1.col1,T1.col3,T1.col5 from S.T1
2 단계 : - 두 테이블을 비교하기위한 사용 '마이너스'키워드.
3 단계 : - 우리는 테이블 스키마 (T2)에서 비교하기 위해 필요한 모든 열 선택 (S)
SELECT T2.col1,T2.col3,T2.col5 from S.T1
최종 결과 - SELECT T1.col1, T1.col3, S.T1에서 T1.col5 마이너스 SELECT T2.col1, T2.col3, S.T1에서 T2.col5;
쿼리에 행을 반환하지 않는 경우 다음 데이터가 정확히 동일합니다.
-
==============================
14.T1 (PK, A, B) 및 T2 (PK, A, B)을 비교한다.
T1 (PK, A, B) 및 T2 (PK, A, B)을 비교한다.
먼저 양쪽에 키 값을 누락 찾기 위해 기본 키 세트를 비교 :
SELECT T1.*, T2.* FROM T1 FULL OUTER JOIN T2 ON T1.PK=T2.PK WHERE T1.PK IS NULL OR T2.PK IS NULL;
그런 다음 모든 값이 일치 목록 :
SELECT T1.PK, 'A' AS columnName, T1.A AS leftValue, T2.A AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.A,0) != COALESCE(T2.A,0) UNION ALL SELECT T1.PK, 'B' AS columnName, T1.B AS leftValue, T2.B AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.B,0) != COALESCE(T2.B,0)
A와 B는 같은 유형이어야합니다. 당신은 SELECT를 생성하는 정보 스키마를 사용할 수 있습니다. 또한 NULL 결과입니다 포함하도록 COALESCE을 잊지 마십시오. 또한 FULL OUTER JOIN을 사용 할 수 COALESCE (T1.PK, 0) = COALESCE (T2.PK, 0).
varchar 형의 열의 예를 들면 :
SELECT concat('SELECT T1.PK, ''', COLUMN_NAME, ''' AS columnName, T1.', COLUMN_NAME, ' AS leftValue, T2.', COLUMN_NAME, ' AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.',COLUMN_NAME, ',0)!=COALESCE(T2.', COLUMN_NAME, ',0)') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='T1' AND DATA_TYPE IN ('nvarchar','varchar');
-
==============================
15."마이너스"지원 및 계정으로 성능을 복용하지 않는 MySQL의에서이 빠른입니다
"마이너스"지원 및 계정으로 성능을 복용하지 않는 MySQL의에서이 빠른입니다
query: SELECT t1.id, t1.id FROM t1 inner join t2 using (id) where concat(t1.C, t1.D, ...)<>concat(t2.C, t2.D, ...)
-
==============================
16.dietbuddha & IanMc에 의해 답변에 따라 대안, 향상된 쿼리. 행이 존재 누락되는 경우 유용하게이 쇼에 쿼리에 대한 설명이 포함되어 있습니다. (NB : SQL Server에 대한)
dietbuddha & IanMc에 의해 답변에 따라 대안, 향상된 쿼리. 행이 존재 누락되는 경우 유용하게이 쇼에 쿼리에 대한 설명이 포함되어 있습니다. (NB : SQL Server에 대한)
( select 'InTableA_NoMatchInTableB' as Msg, * from tableA except select 'InTableA_NoMatchInTableB' , * from tableB ) union all ( select 'InTableB_NoMatchInTableA' as Msg, * from tableB except select 'InTableB_NNoMatchInTableA' ,* from tableA )
-
==============================
17.
SELECT * FROM TABLE A WHERE NOT EXISTS (SELECT 'X' FROM TABLE B WHERE B.KEYFIELD1 = A.KEYFIELD1 AND B.KEYFIELD2 = A.KEYFIELD2 AND B.KEYFIELD3 = A.KEYFIELD3) ;
'X'는 임의의 값이다.
서로 다른 차이를 볼 수있는 테이블을 전환합니다.
당신의 테이블에 키 필드에 가입해야합니다.
아니면 그냥 2 select 문으로 MINUS 연산자를 사용하지만, MINUS는 오라클에서 작업 할 수 있습니다.
from https://stackoverflow.com/questions/4602083/sql-compare-data-from-two-tables by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL 서버에서 동시에 두 테이블에 데이터를 삽입 할 수 있습니까? (0) | 2020.04.13 |
---|---|
[SQL] MySQL의 SQL은 : 특정 항목을 먼저하고 그 다음 나머지 항목을 정렬 (0) | 2020.04.13 |
[SQL] 교리 2 사용하여 원시 SQL을 실행 (0) | 2020.04.13 |
[SQL] SQL 서버에서 지난 달의 레코드를 가져 오기 (0) | 2020.04.13 |
[SQL] 테이블의 열 수를 찾기 (0) | 2020.04.13 |