2012-03-08 12 views
2

なし自体にテーブルを結合:が、私はこれを行うことによって自分自身にテーブルを結合し、クロスを推薦人見てきた2つのクエリ

SELECT * 
FROM tbl AS A, tbl AS B 
WHERE A.col1 = 1 AND B.col1 = 1 

しかし、ここでは、エンジンは二回にTBL内のすべての行を反復処理する必要がありますクエリー(したがって結果)が同じであるにもかかわらず、2つのクエリーをAとBの結果に一致させます。

WHERE on AとBが常に2つで同一であると仮定すると、これは無駄です。一度何かを照会する方法はありますか?私はRAMでこの全体を実行する代わりにディスク書き込みを必要とする一時テーブルを避けたいと思います。

私はMySQLを使用していますが、SQLの回答が多大に役立ちます。

例:

次のようにTBLが見えることとします

私は実行
COL1 COL2 
1  A 
1  B 
1  C 
2  D 
2  E 

私COL1 = 1の句は、それが上記の表から最初の3行を返します。

A.COL1 A.COL2 B.COL1 B.COL2 
1   A   1   A 
1   A   1   B 
1   A   1   C 
1   B   1   A 
1   B   1   B 
1   B   1   C 
1   C   1   A 
1   C   1   B 
1   C   1   C 
+0

クエリから結果セットを構成する方法の例を挙げることはできますか? – northpole

+0

私の例を参照してください – carlbenson

+0

一時テーブルの代わりにテーブル変数を使用することができます:http://www.sql-server-performance.com/2007/temp-tables-vs-variables/ – diaho

答えて

0

私は本当にそれがJOIN構文を避けることをお勧めします...それは非常に難しいことができます:二つのテーブルAとBが同一であるので、私が欲しいのは、次の表ですが、どこのステートメントの唯一の実行と読む。

あなたがしようとしていることについてのあなたの説明は少しわかりにくいです。書かれたクエリは、JOIN操作の値を提供しません。一般的に、あなたが自分自身に、テーブルに参加したいとき、それは異なる列上にある、話す:

select * 
from tbl as a 
inner join 
table as b 
on a.col1 = b.col2 
where 
a.col1 = 1; 

これは、あなたがテーブルに対してクエリを実行することができ、また、同じテーブルに階層的に組織化関連情報を収集します。例:

create table tbl (
person_id int, 
parent_id int 
); 

この場合、親も人です。あなたは1のIDを持つ人物に関する両親のリストを取得したい場合は、あなたが書くことができる:

select a.*, b.* 
from tbl as a 
inner join tbl as b 
on 1=1 
where a.col1 = 1 
and b.col1 = 1 

select 
person.person_id as OriginalPerson, 
parent.person_id as Parent 
from 
tbl as person 
inner join 
tbl as parent 
on parent.person_id = person.person_id 
where 
person.person_id = 1; 

UPDATEをあなたの更なる説明を読めば、あなたはデカルト積をしたいですあなたは基本的に参加する意図的なデカルトを求めている

+0

私はあなたの編集を理解していません。クエリはどこですか? – carlbenson

+0

** UPDATE ** –

+0

の直下にあるのは、他のすべてに対してtbl内のすべてのものの結合を返します。条件はありません。 – carlbenson

2

select 
     a.col1, 
     a.col2, 
     b.col1, 
     b.col2 
    from 
     tbl a 
     join tbl b 
      on a.col1 = b.col1 
    where 
     a.col1 = 1 
    order by 
     a.col2, 
     b.col2 

正確にご出力順序シーケンスをヒットするには、によってによって順序が必要"a"列2、 "b"列2