2017-12-28 15 views
0

テーブルAとテーブルBの2つのテーブルがあります。テーブルAには2つのカラム「ID」と「年齢」があります。表Bには、「ID」と「グレード」の2つの列があります。年齢が25歳以上で、グレードが<のBの行をまとめて結果を結合するAの行を選択したいとします。 Rで2つのテーブルの選択を行い、それをmySQLで結合する方法

、これはコードによって達成することができます。

library(dplyr) 
A = data.frame("ID"=1:10, 
       "age"=21:30) 

B = data.frame("ID"=1:20, 
       "Grade"=81:100) 

sub_A = filter(A, age > 25) 
sub_B = filter(B,Grade<90) 

result = inner_join(sub_A,sub_B,by="ID") 

MySQLで同じことを行うには?具体的には、my_SQLにクエリ結果をsub_Aとsub_Bのような新しい変数に格納し、sub_Aとsub_Bを一緒に結合する方法がありますか?

私は「CREATE TEMPORARY TABLE」を使用しようとしましたが、データベースに一時テーブルを作成する権限がありません。

答えて

2

2つのサブクエリに参加することが可能である:

select * 
from (
    select * 
    from table_a 
    where age > 25 
) sub_a 
inner join (
    select * 
    from table_b 
    where grade < 90 
) sub_b using(ID) 

をしかし、そのための必要はありません。あなただけ(IDに)2つのテーブルを結合し、WHERE句同じでデータをフィルタリングすることができます

select * 
from table_a a 
join table_b b using(ID) 
where a.age > 25 
    and b.grade < 90 
+0

その後の参加ではなく、参加中。しかし、 'WHERE'は暗黙的な結合であるため、' INNER JOIN'と同じ実行計画を持つ可能性があります。 – Parfait

+0

@ Parfaitエンジンは私たちの助けなしにその最適化を行うことができます。できるだけ早くどんな状態も調べます。 –

0

OPは、彼がmySQLを使用して達成したいと考え、予想される結果を実証するdplyrを使用しています。

完全のとdata.tableの構文はsimilar to SQLあるのでために、私はOPの要件は、次の2つの方法でdata.tableを使用して実装する方法を示したいと思います:

library(data.table) 

# filter/select before merge 
merge(setDT(A)[age > 25], setDT(B)[Grade < 90]) 

# filter/select after merge 
merge(setDT(A), setDT(B))[age > 25 & Grade < 90] 

どちらのステートメントは同じ結果を返します。さらに別の変異体がフィルタに `on`の節に` WHERE`式を移動している

ID age Grade 
1: 6 26 86 
2: 7 27 87 
3: 8 28 88 
4: 9 29 89 
関連する問題