2012-02-17 3 views
2

2つの表があると仮定して、各表にはN列があります。 table1SQL問合せ(T-SQL、SQL Server)が短くても

table2(重複を含む)のどのデータセットもtable1に含まれていることを知りたいと思います。

私は

select * from table1 
intersect 
select * from table2 

を試してみました。しかし、これは私だけ両方のテーブルにあるユニークな行を示します。しかし、私はユニークな行を望まないので、table1にあるtable2のすべての行を見たいと思っています...

注意してください!私は実行できません

select * 
from table1 a, table b 
where a.table1col = b.table2col 

...実行時にテーブルの列の数がわからないためです。

..私は、動的SQLで何かをして列番号を反復処理するが、それはもののようなもののためにあまりにも単純なクエリを思わので、私は正確にこれを求めている可能性が確かに

例:

create table table1 (table1col int) 
create table table2 (table2col int) 

insert into table1 values (8) 
insert into table1 values (7) 

insert into table2 values (1) 
insert into table2 values (8) 
insert into table2 values (7) 
insert into table2 values (7) 
insert into table2 values (2) 
insert into table2 values (9) 

私はその後、私のクエリは返すようにしたい:

8 
7 
7 
+1

あなたの例では、 'table2'に** 2 **' 7'行があることを知って何を得ていますか?あなたは1つに影響するいくつかの操作を行うつもりですが、他の操作には影響しませんか? – AakashM

+0

実際、私は非常に野心的なプロジェクトをやっています。私はForeignKey関係のないhuuugeデータベースを持っており、データベースの各列とデータベースの各列を比較することで、私のプログラムは関係を文書化/作成しようとします。そのプロセスのどこかで、私がここに求めているこのようなものが必要です – cdbeelala89

答えて

1

を解決することができますEXCEPTたぶん

このような機能の1つは、CHECKSUMです。

テーブルの行、または の式のリストに対して計算されたチェックサム値を返します。 CHECKSUMは、ハッシュ インデックスを構築する際に使用するためのものです。 CHECKSUMが衝突を紹介するかもしれないという

SQLステートメント

SELECT tm.* 
FROM (
      SELECT CS = CHECKSUM(*) 
      FROM Table2 
     ) tm   
     INNER JOIN (   
      SELECT CS = CHECKSUM(*) 
      FROM Table2   
      INTERSECT 
      SELECT CHECKSUM(*)   
      FROM Table1 
     ) ti ON ti.CS = tm.CS 

注意。データの操作を行う前に、そのことをテストする必要があります。

編集

あなたがSQL Server 2005を使用している場合、あなたはHASH_BYTESでスローすることによって、このビットより堅牢になるかもしれません。

HASH_BYTESの欠点は、操作したい列を指定する必要があることです。しかし、あなたが知っているすべての列については、これを使用して衝突を防ぐことができます。

+0

私は非常にエレガントでintuitivもコードを理解する必要がある。私はちょうどあなたのクエリの結果を数える必要があるので、私はあなたが衝突とは何を意味するのか正確には分かりませんし、私が推測することを知る必要はありませんが、多分あなたはそれについて詳しく説明することができます。私は実際には初心者としてSQL Server 2008 R2を使用しています。 – cdbeelala89

+0

@ cdbeelala89 - **同じ**チェックサムを計算するために2つの異なる行が**可能です**。それが正しいかどうかを確認し、そうであれば新しい戦略を立てる必要があります。 –

0

INTERSECT、EXCEPT VS - link

EXCEPTは、左のクエリから、正しいクエリにも見つからない任意の値を返します。

INTERSECTは、INTERSECTオペランドの左右の両方のクエリによって返される任意の異なる値を返します。列の量がわかっているされていない場合は、試合を作るために行にわたって計算された値に頼らなければならないでしょう、あなたの問題

+0

申し訳ありません - あなたは行を複製する必要があります。 – Aklopper

+0

Hm、BTW、私は今までEXCEPTを実行すると、あるクエリ結果を別のクエリ結果から差し引くことになりました。明確な部分については読んでいない... EXCEPTが私のコードにあるので、あまりにも別個の例外が必要なようだが、あまりにも厳しいテストのため、今まで気づいていなかった。 – cdbeelala89