복붙노트

[SQL] MySQL은 두 테이블 간의 비교의 차이

SQL

MySQL은 두 테이블 간의 비교의 차이

오라클은 diff와 동일 : 어떻게 두 테이블을 비교? MySQL은 제외.

더 정확하게하려면, 나는 T1에서 한 행의 데이터가 T2에서 해당 행의 데이터와 다른 경우에 저를 알려주는 간단한의 SQL 쿼리를 알아 내려고 노력하고있어

내가이 교차도 마이너스를 사용할 수 없습니다 나타납니다. 언제 시도

SELECT * FROM robot intersect SELECT * FROM tbd_robot

나는 에러 코드를 얻을 :

나는 문법적으로 잘못된 일을하고 있습니까? 그렇지 않다면, 내가 사용할 수있는 또 다른 쿼리가?

편집 : 또한, 나는 무료 버전 DbVisualizer를 통해 쿼리하고있다. 그 요인이 될 수 있는지 확실하지 않습니다.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    
  7. from https://stackoverflow.com/questions/950414/compare-differences-between-two-tables-in-mysql by cc-by-sa and MIT license