[SQL] MySQL은 두 테이블 간의 비교의 차이
SQLMySQL은 두 테이블 간의 비교의 차이
오라클은 diff와 동일 : 어떻게 두 테이블을 비교? MySQL은 제외.
더 정확하게하려면, 나는 T1에서 한 행의 데이터가 T2에서 해당 행의 데이터와 다른 경우에 저를 알려주는 간단한의 SQL 쿼리를 알아 내려고 노력하고있어
내가이 교차도 마이너스를 사용할 수 없습니다 나타납니다. 언제 시도
SELECT * FROM robot intersect SELECT * FROM tbd_robot
나는 에러 코드를 얻을 :
나는 문법적으로 잘못된 일을하고 있습니까? 그렇지 않다면, 내가 사용할 수있는 또 다른 쿼리가?
편집 : 또한, 나는 무료 버전 DbVisualizer를 통해 쿼리하고있다. 그 요인이 될 수 있는지 확실하지 않습니다.
해결법
-
==============================
1.INTERSECT는 MySQL을 에뮬레이트 할 필요가 :
INTERSECT는 MySQL을 에뮬레이트 할 필요가 :
SELECT 'robot' AS `set`, r.* FROM robot r WHERE ROW(r.col1, r.col2, …) NOT IN ( SELECT col1, col2, ... FROM tbd_robot ) UNION ALL SELECT 'tbd_robot' AS `set`, t.* FROM tbd_robot t WHERE ROW(t.col1, t.col2, …) NOT IN ( SELECT col1, col2, ... FROM robot )
-
==============================
2.당신은 UNION을 사용하여 수동으로 교차을 구성 할 수 있습니다. 당신이 두 테이블에 몇 가지 고유 한 필드가있는 경우는, 예를 쉽게 신분증:
당신은 UNION을 사용하여 수동으로 교차을 구성 할 수 있습니다. 당신이 두 테이블에 몇 가지 고유 한 필드가있는 경우는, 예를 쉽게 신분증:
SELECT * FROM T1 WHERE ID NOT IN (SELECT ID FROM T2) UNION SELECT * FROM T2 WHERE ID NOT IN (SELECT ID FROM T1)
당신은 고유 한 값이없는 경우 (여전히 위의 코드가 모든 대신 상대 ID의 필드 및 사용을 확인하기 위해 확장 할 수와 그들 (예 : ID NOT IN (...)과 OTHER_FIELD NOT IN을 연결합니다. ..) 등)
-
==============================
3.나는이 링크의 다른 해결책을 발견
나는이 링크의 다른 해결책을 발견
SELECT MIN (tbl_name) AS tbl_name, PK, column_list FROM ( SELECT ' source_table ' as tbl_name, S.PK, S.column_list FROM source_table AS S UNION ALL SELECT 'destination_table' as tbl_name, D.PK, D.column_list FROM destination_table AS D ) AS alias_table GROUP BY PK, column_list HAVING COUNT(*) = 1 ORDER BY PK
-
==============================
4.
select t1.user_id,t2.user_id from t1 left join t2 ON t1.user_id = t2.user_id and t1.username=t2.username and t1.first_name=t2.first_name and t1.last_name=t2.last_name
이 시도. 불일치 반환 NULL이에 남아있는 경우에, 당신의 테이블을 비교하여 일치하는 모든 쌍을 찾을 수 있습니다.
-
==============================
5.하임의 답변에 따라 나는 시험에 PHP 코드를 생성하고 두 개의 데이터베이스 사이의 모든 차이를 표시합니다. 테이블이 소스 또는 테스트 데이터베이스에 존재하는 경우에도 표시됩니다. 당신은 당신의 세부 사항 <> 변수의 내용으로 변경해야합니다.
하임의 답변에 따라 나는 시험에 PHP 코드를 생성하고 두 개의 데이터베이스 사이의 모든 차이를 표시합니다. 테이블이 소스 또는 테스트 데이터베이스에 존재하는 경우에도 표시됩니다. 당신은 당신의 세부 사항 <> 변수의 내용으로 변경해야합니다.
<?php $User = "<DatabaseUser>"; $Pass = "<DatabasePassword>"; $SourceDB = "<SourceDatabase>"; $TestDB = "<DatabaseToTest>"; $link = new mysqli( "p:". "localhost", $User, $Pass, "" ); if ( mysqli_connect_error() ) { die('Connect Error ('. mysqli_connect_errno() .') '. mysqli_connect_error()); } mysqli_set_charset( $link, "utf8" ); mb_language( "uni" ); mb_internal_encoding( "UTF-8" ); $sQuery = 'SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="'. $SourceDB .'";'; $SourceDB_Content = query( $link, $sQuery ); if ( !is_array( $SourceDB_Content) ) { echo "Table $SourceDB cannot be accessed"; exit(0); } $sQuery = 'SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="'. $TestDB .'";'; $TestDB_Content = query( $link, $sQuery ); if ( !is_array( $TestDB_Content) ) { echo "Table $TestDB cannot be accessed"; exit(0); } $SourceDB_Tables = array(); foreach( $SourceDB_Content as $item ) { $SourceDB_Tables[] = $item["TABLE_NAME"]; } $TestDB_Tables = array(); foreach( $TestDB_Content as $item ) { $TestDB_Tables[] = $item["TABLE_NAME"]; } //var_dump( $SourceDB_Tables, $TestDB_Tables ); $LookupTables = array_merge( $SourceDB_Tables, $TestDB_Tables ); $NoOfDiscrepancies = 0; echo " <table border='1' width='100%'> <tr> <td>Table</td> <td>Found in $SourceDB (". count( $SourceDB_Tables ) .")</td> <td>Found in $TestDB (". count( $TestDB_Tables ) .")</td> <td>Test result</td> <tr> "; foreach( $LookupTables as $table ) { $FoundInSourceDB = in_array( $table, $SourceDB_Tables ) ? 1 : 0; $FoundInTestDB = in_array( $table, $TestDB_Tables ) ? 1 : 0; echo " <tr> <td>$table</td> <td><input type='checkbox' ". ($FoundInSourceDB == 1 ? "checked" : "") ."></td> <td><input type='checkbox' ". ($FoundInTestDB == 1 ? "checked" : "") ."></td> <td>". compareTables( $SourceDB, $TestDB, $table ) ."</td> </tr> "; } echo " </table> <br><br> No of discrepancies found: $NoOfDiscrepancies "; function query( $link, $q ) { $result = mysqli_query( $link, $q ); $errors = mysqli_error($link); if ( $errors > "" ) { echo $errors; exit(0); } if( $result == false ) return false; else if ( $result === true ) return true; else { $rset = array(); while ( $row = mysqli_fetch_assoc( $result ) ) { $rset[] = $row; } return $rset; } } function compareTables( $source, $test, $table ) { global $link; global $NoOfDiscrepancies; $sQuery = " SELECT column_name,ordinal_position,data_type,column_type FROM ( SELECT column_name,ordinal_position, data_type,column_type,COUNT(1) rowcount FROM information_schema.columns WHERE ( (table_schema='$source' AND table_name='$table') OR (table_schema='$test' AND table_name='$table') ) AND table_name IN ('$table') GROUP BY column_name,ordinal_position, data_type,column_type HAVING COUNT(1)=1 ) A; "; $result = query( $link, $sQuery ); $data = ""; if( is_array( $result ) && count( $result ) > 0 ) { $NoOfDiscrepancies++; $data = "<table><tr><td>column_name</td><td>ordinal_position</td><td>data_type</td><td>column_type</td></tr>"; foreach( $result as $item ) { $data .= "<tr><td>". $item["column_name"] ."</td><td>". $item["ordinal_position"] ."</td><td>". $item["data_type"] ."</td><td>". $item["column_type"] ."</td></tr>"; } $data .= "</table>"; return $data; } else { return "Checked but no discrepancies found!"; } } ?>
-
==============================
6.이 행이 한 테이블이다 그러나 다른되지는 또한 그것을 반환 할 경우 하임의 답변에 따라 여기에 .... 그렇지 않으면, 당신은 두 테이블에 존재하는 값을 비교 찾고 있다면 단순화 된 예입니다
이 행이 한 테이블이다 그러나 다른되지는 또한 그것을 반환 할 경우 하임의 답변에 따라 여기에 .... 그렇지 않으면, 당신은 두 테이블에 존재하는 값을 비교 찾고 있다면 단순화 된 예입니다
알아 내기 위해 나에게 몇 시간을했다. 여기에 "tbl_a"와 "tbl_b"를 비교하기위한 완벽하게 테스트 단순히 쿼리입니다
SELECT ID, col FROM ( SELECT tbl_a.ID, tbl_a.col FROM tbl_a UNION ALL SELECT tbl_b.ID, tbl_b.col FROM tbl_b ) t WHERE ID IN (select ID from tbl_a) AND ID IN (select ID from tbl_b) GROUP BY ID, col HAVING COUNT(*) = 1 ORDER BY ID
당신은 절 "여기서의"여분을 추가해야합니다 그래서 :
또한:
읽기 쉽게하기 위해 당신은 다음을 사용할 수있는 테이블 이름을 표시하려면 :
SELECT tbl, ID, col FROM ( SELECT tbl_a.ID, tbl_a.col, "name_to_display1" as "tbl" FROM tbl_a UNION ALL SELECT tbl_b.ID, tbl_b.col, "name_to_display2" as "tbl" FROM tbl_b ) t WHERE ID IN (select ID from tbl_a) AND ID IN (select ID from tbl_b) GROUP BY ID, col HAVING COUNT(*) = 1 ORDER BY ID
from https://stackoverflow.com/questions/950414/compare-differences-between-two-tables-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 테이블을 잠그지 않고 ALTER 표? (0) | 2020.05.18 |
---|---|
[SQL] SQL 및 MySQL의 차이가 무엇 [폐쇄] (0) | 2020.05.18 |
[SQL] 어떻게 오라클 SQL에서 스키마의 모든 테이블을 나열합니까? (0) | 2020.05.17 |
[SQL] 큰 테이블에 SQL 서버 쿼리 성능 향상 (0) | 2020.05.17 |
[SQL] 엑셀 워크 시트에서 SQL 삽입 스크립트를 생성 (0) | 2020.05.17 |