2011-01-17 29 views
2

私は(同じスキーマを持つ)二つのテーブルクエリで2つのSQLテーブルの結合

Table1 
id title D0 D1 D2 D3 
------------------------------------ 
1 Title1 0.12 3.23 4.90 -0.12 
1 Title1 0.22 0.32 -4.90 0.12 
1 Title1 0.13 1.24 3.50 -0.22 
... 
1 TitleN 1.22 2.33 3.90 -1.56 

Table2 
id title D0 D1 D2 D3 
------------------------------------ 
1 Title1 1.42 -0.93 -2.99 3.22 
1 Title1 0.52 3.32 -4.90 0.54 
1 Title1 2.13 1.14 3.50 -0.22 
... 
1 TitleN 3.42 4.37 3.90 -1.26 

私はこれを行うことができますようにクエリを実行する方法を把握しようとしていますがあります数学:

しかし、私は、クエリをTable1の行を繰り返し、全体に対してSELECTを実行したいと思います表2。基本的には、表1と表2のすべての行の組み合わせに対して計算の不等式が満たされている表2からタイトルを選択します。

これは可能ですか?

私はPostgreを使用しています。

答えて

1

あなたはCROSSは、基本的に、私は計算 不平等を表1と表2のすべての行 組み合わせに対して満たされている。表2からタイトル を選択したい

SELECT Table2.title 
FROM Table2 
CROSS JOIN Table1 
WHERE (Table1.D0*Table2.D0)+(Table1.D1*Table2.D1)+(Table1.D2*Table2.D2) < 0.5; 
+0

なぜ「INNER JOIN」ですか? – onedaywhen

+0

本当に良い質問です。 CROSS JOINの標準的な使い方は、「デカルト積」を生成することです。つまり、N行テーブルを持つM行テーブルをCROSSすると、M行N行が得られます。 CROSS JOINにJOIN条件はありません。 INNER JOINの標準的な使用方法は、2つのテーブル内の一致する1つ以上の列に基づいて一致するレコードを見つけることです。技術的には、CROSS JOINをINNER JOINとして列を一致させずに書くことができますが、人を混乱させるだけです。 – anon

+0

"Table1とTable2のすべての行の組み合わせに対して計算の不等式が満たされている" - これはカバーされていないようですか? t1で2行、t2で1行だけ取ります。行1はtrueを返し、条件2についてはrow2がfalseを返します。このクエリはまだtable2.titleを示しています....この回答は重複table2.titleを何度も表示することができます.. – RichardTheKiwi

0

ユニオンを使用する必要があります。唯一の注意点は、あなたの選択からあなたを返すフィールドが

(SELECT * FROM Table1 WHERE conditions) UNION (SELECT * FROM Table2 WHERE conditions) 

がいる限り、あなたはあまりにも多くのデータを引き上げないよう、スクリプト側にあなたのチェックを行い一致している必要があります。この共用体問合せの両側を制限するために、subselectをwhere条件に追加するオプションもあります。

2

に参加したいですよ

そのため、そのTable2行のTable1には等価性がない逆の条件が必要です。

SELECT distinct title 
FROM Table2 
WHERE NOT EXISTS (
    SELECT * 
    FROM Table1 
    WHERE (Table1.D0*Table2.D0)+(Table1.D1*Table2.D1) 
      +(Table1.D2*Table2.D2) >= 0.5 
) 
+0

正直なところ、この回答はAskerの質問(構文エラーと思われるものを除く)。一方、私の答えでは、両方のテーブルからタイトルを取得することができますので、もう少し柔軟性があります。 – anon

+0

@anon - 構文エラーはありません。 – RichardTheKiwi

+0

"Table1_Row1_D0":ピリオドではなくドットがありますか?私はpostgresql方言がわからないことを認めなければならないので、間違いかもしれません。しかし、そのサイトではドットを使用しています。http://www.postgresql.org/files/documentation/books/aw_pgsql/node59.html – anon

関連する問題