2017-12-06 8 views
0

どのようにして各テーブルをフィルタリングした後に2つのテーブルを結合し、フィルタ結果を得るには両方の結果を結合しますか?フィルタリング後に2つのテーブルを結合するにはどうすればいいですか?

しようとしましたが、コード

SELECT * 
FROM Table1 
WHERE flag1 = 0 
JOIN SELECT * 
    FROM TABLE2 
    where flag2 = 0 on Table1.email = TABLE2.email 
+2

'select ... from t1 join t2 on ... where ...'、つまりSELECTごとに1つだけです。 – jarlh

+0

@jarlh申し訳ありませんが、私はこれをしたくありません。私は、テーブル全体で結合を使用することによって、いくつかの時間の問題を抱えています。 –

+1

[JOINの2つのSELECT文の結果を結合する]の可能な複製(https://stackoverflow.com/questions/10538539/join-two-select-statement-results) – SharpKnight

答えて

1

は、サブクエリなどの2つの選択ステートメント、および2つの異なるテーブルとしてこれら二つのサブクエリの結果と参加してみてくださいを考えてみましょう。

SELECT * FROM 
(SELECT * FROM Table1 where flag1 = 0) Table1 
JOIN 
(SELECT * FROM TABLE2 where flag2 = 0) Table2 
on Table1.orderlist_email = TABLE2.email 
+0

ありがとうございました... –

0
SELECT * 
FROM Table1 as t1 
join Table2 as t2 on t1.orderlist_email = t2.email 
where flag1 = 0 
and flag2 = 0 

正しい構文エラーを示すが、このようになります参加します。

+0

flag2はどこですか? – Sami

+0

@Sam:主に答えはjoinとwhere句に関連していました。とにかく私は答えを更新しました –

0

私が何かが欠けていない限り、これはかなり簡単です。擬似コードがありますが、これにはいくつかの方法を解決することができます...

SELECT 
    * 
FROM 
    Table1 
    JOIN TABLE2 ON Table1.orderlist_email = TABLE2.email 
    Table1.flag1 = 0 
    AND TABLE2.flag2 = 0 

また、あなたがそうのようJOINWHERE条件を追加することができます。

SELECT 
    * 
FROM 
    Table1 
    JOIN TABLE2 ON Table1.orderlist_email = TABLE2.email 
    AND Table1.flag1 = 0 
    AND TABLE2.flag2 = 0 

私はあなたの懸念はかどうかだと思いますこれは、エンジンが結合しようとする「あらかじめフィルタリングされた」セットを使用するのではなく、両方のテーブルのフルスキャンを実行することを意味しません。現代のエンジンはこれを理解するのに十分なほど賢明でなければなりませんが、クエリの複雑さに基づいて、あなたの走行距離は様々です。

1

フィルタリングされた結果を保存し、それらを一緒に結合するのに十分な(RAM /キャッシュ)領域がない可能性があります。それはあなたの予想よりも遅くなる可能性があります。

*技術的には可能ですが、効率的ではありません。

SELECT * 
FROM (
    SELECT * FROM Table1 where flag1 = 0 
) A 
JOIN (
    SELECT * FROM TABLE2 where flag2 = 0 
) B 
ON A.orderlist_email = B.email; 

ただし、最初に参加することをお勧めします。 MySQL(または何であれsqlエンジン)は(通常)あなたのために最適化された細かい作業を行います。

SELECT * 
FROM Table1 
JOIN TABLE2 
ON A.orderlist_email = B.email 
WHERE Table1.flag1 = 0 
AND TABLE2.flag2 = 0; 
関連する問題