2

これを行うことで、テーブル自体をクロス結合することを推奨している人々を見てきました。

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

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

A と B の WHERE が常に同じであると仮定すると、これは無駄です。何かを一度クエリしてから、そのクエリの結果をそれ自体にクロス結合する方法はありますか? このすべてをRAMで実行するのではなく、ディスクへの書き込みが必要になる一時テーブルを避けたいと思います。

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

例:

tbl が次のようになっているとします。

COL1    COL2
1       A
1       B
1       C
2       D
2       E

col1 = 1 の where 句を実行すると、上記のテーブルの最初の 3 行が返されます。私が欲しいのは次のテーブルですが、2 つのテーブル A と B が同一であるため、where ステートメントの実行は 1 回だけです。

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
4

2 に答える 2

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による順序が必要です。

于 2012-03-08T02:46:08.147 に答える
0

その JOIN 構文を避けることを強くお勧めします... 読むのが非常に難しい場合があります。

あなたがやろうとしていることについてのあなたの説明は少し不可解です。書かれているクエリは、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
);

この場合、親も人です。ID が 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;

更新さらに説明を読むと、デカルト積が必要になります。

select a.*, b.*
from tbl as a
inner join tbl as b
on 1=1
where a.col1 = 1
and b.col1 = 1
于 2012-03-08T01:56:29.897 に答える