0
SELECT COUNT(1) FROM own.no_preselection_1_a;
SELECT COUNT(1) FROM own.no_preselection_1;

COUNT(1) を選択
  (SELECT DISTINCT * FROM own.no_preselection_1_a
  );

COUNT(1) を選択
  (SELECT DISTINCT * FROM own.no_preselection_1
  );

カウントを選択(1)
FROM OWN.no_preselection_1 t1
INNER JOIN OWN.no_preselection_1_a t2
ON t1.number = t2.number
AND t1.location_number = t2.location_number;

これは以下を返します:

カウント(1)               
----------------------
398                    

カウント(1)               
----------------------
398                    

カウント(1)               
----------------------
308                    

カウント(1)               
----------------------
308                    

カウント(1)               
----------------------
578                    

ここで結合の視覚的な説明を見ると: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

問題はその最後のクエリにあります。セットが同じである場合 (つまり、完全にオーバーラップしている場合)、内部結合は元のセットのサイズのセットを返すと考えていました。

重複のそれぞれが互いのエントリを作成しているという問題はあります? (たとえば、各テーブルに同じ値の重複が 3 つある場合、3x3 = 9 エントリが作成されますか?) ここでの解決策は何ですか? (内部結合を行うために個別を選択するだけですか?) これは、2 つのテーブルに同じデータが含まれているかどうかを確認するための適切なテストですか?

4

1 に答える 1

1

リストの 1 番目と 3 番目、および 2 番目と 4 番目のカウントから明らかなように、テーブルには重複があります。

結合は正常に機能しているため、「問題」はありません。何を達成しようとしていますか?あなたの目標は、結合によって満たされていません。

実際のデータと必要な結果で質問に注釈を付けることをお勧めします。

2 つのテーブルが同じ値であることを示したい場合は、和集合を試すことができます。すべての列が両方のテーブルで同じであり、行の列が各行を一意に識別すると仮定します。

select t.*
from ((select '1' as which, t.*
       from OWN.no_preselection_1 t
      ) union all
      (select '1-a' as which, t.*
       from OWN.no_preselection_1_a
      )
     ) t
group by < all the columns in the tables >
having count(*) <> 1

2 つの列に制限されていて、対応するエントリ (重複あり) があるかどうかを確認したい場合は、次のようにします。

select t.*
from ((select '1' as which, number, location_number,
              row_number() over (partition by number, location_number order by number) as seqnum
       from OWN.no_preselection_1 t
      ) union all
      (select '1-a' as which, number, location_number,
              row_number() over (partition by number, location_number order by number) as seqnum
       from OWN.no_preselection_1_a
      )
     ) t
group by number, location_number, seqnum
having count(*) <> 1
于 2013-02-20T01:58:18.477 に答える