2009-04-15 12 views
2

結合が使用されていない場合、このクエリがどのように書き込まれるかを知りたいと思います。私は、結合が実行可能でないか、または使用できない(利用できない)場合にそれを理解しようとしていました。結合を使用せずにクエリを書き直す方法

SELECT 
    * 
FROM 
(
    table1 
INNER JOIN 
    table2 
ON 
    table1.id = table2.id 
) 
INNER JOIN 
    table3 
ON 
(
    table1.id2 = table3.id2 
) 
AND 
(
    table1.id3 = table3.id3 
) 
WHERE 
    table1.id = 1 

なぜなら、アプリケーションが標準SQLとは対照的にHQLを使用し、HQLが結合を信じられないほど困難にするためです。

+0

どのようなシナリオでは、結合は利用できないか、実行可能ではありませんか? – BradC

+0

私はBradに同意します、なぜあなたはその参加が利用可能でないか、または実行可能ではないと思いますか? –

+0

HQLでは、クロス結合以外の結合は実装するのが難しくなります。そのように、私はそれらを避けることを望んでいた。 –

答えて

11

2つの異なるテーブルからデータを抽出することはできません。あなたはJOINステートメント使用されますが、たとえばwhere句に置くことで、同じことを達成することができます:あなたが選択を分離して、アプリケーション内で合流すればいいことができます

SELECT * FROM table1, table2 WHERE table1.id = table2.id AND ... 
+0

それは不可能ではない、私は信じているデカルト製品であると思う。デカルトのようなものです。つまり、select * from table1、table2 –

+0

これはまだ結合です。 「結合」という言葉がないからといって、それが一つではないというわけではありません。 –

+0

@Darren、これはまだ結合と見なされます(クロス結合) –

2

。しかし、あなたを助けに行くのではありません参加...

SELECT * FROM table1 
SELECT * FROM table2 
SELECT * FROM table3 

なし

-2

SQL。

あなたの希望する出力は何ですか?また、参加を望んでいない理由は何ですか?

複数のテーブルのデータをリレーショナルデータベースに入れたい場合は、データを結合します。ジェームズ・ブラックが提案したように、これはアプリケーションで行う必要があるかもしれません。

私たちがさらに助けてくれるかもしれないが、あなたが状況に少しでも光を当てることができるならば。唯一pureistしかし、リレーショナルデータベースの中核概念とデータの正規化をしてはならない

SELECT e.Name, e.HireDate, (select SUM(CheckAmount) from EmployeeCheck where EmployeeID = e.ID) 
FROM Employee e 
0

しばしばサブクエリが参加するよりも簡単かもしれません。リレーショナルデータベースを使用してデータを保存する理由はほとんどありません。インデックスは、これを迅速かつ効率的に実行します。

古い方法では、マスターとトランザクションテーブルを使用しました。暗黒時代に戻る

ただし、カーソルを使用して、参加が行うフィルタリングを行うことができます。カーソルは、結合ベースのフィルタを実行するのではなく、テーブルに対する配列のように機能し、同じ結果を得ます。

0

1つの値を選択すると、参加している場合

0

必要に応じて相関サブクエリを使用できますが、結合が優れています。

0

結合が制限されていない場合は、SQLデータベースから離れてください。

関連する問題