2016-09-16 26 views
0

私のモデルはA as many Bです。これらのテーブルはA.idB.item_idで関連付けられています。 Bにはcreated_atという列があります。 Aからすべての行を選択して、B.created_atが2016-09-1`より大きいようにする必要があります。私はそれが可能これと同じクエリを使用して、その質問を解決するかどうかを知りたい:Sql複数の行が他のテーブルの値よりも大きい

SELECT * FROM A 
WHERE (
    (SELECT B.created_at 
    FROM B 
    WHERE B.item_id = A.id) 
    >= '2016-09-1') 

答えて

0

あなたがJOINAからのみ選択でこれを行うことができます。

Select A.* 
From A 
Join B On A.id = B.item_id 
Where B.created_at > '2016-09-01' 
+0

参加しないでください –

+0

なぜ参加しないのですか?必要なものだけを提供するフィルタとして機能します。 – Siyual

0
select A.* 
from A 
left join B 
    on B.item_id=A.id 
where B.created_at >= '2016-09-1' 
0

は、B.created_atが '2016-09-1'より大きいようなすべての行から選択する必要があります。

select * from A where exists(SELECT 1 
    FROM B 
    WHERE B.item_id = A.id) 
    b.created_at>= '2016-09-1') 
0

一般に、これは、日付フィルター基準を含むINNER JOINを使用して行うことができます。次のようなものがあります。

SELECT A.* 
FROM A 
INNER JOIN B 
    ON A.id = B.Iditem_id 
    AND B.created_at > '2016-09-01' 

これはこれを行うためのT-SQLメソッドです。

ます。また、単純なWHERE句適用することができます - あなたはサブセットを使用する場合は、これらのオプションのどちらかが本当の違いを作るかどうかを確認するために実行計画を確認したいと思います...

SELECT A.* 
FROM A 
INNER JOIN B 
    ON A.id = B.Iditem_id 
WHERE B.created_at > '2016-09-01' 

を最初にテーブルBから行うことができます...

SELECT A.* 
FROM A 
INNER JOIN (
      SELECT B.* 
      FROM B 
      WHERE B.created_at > '2016-09-01') 
      )Bsub 
    ON A.id = Bsub.Iditem_id 

これらはすべてT-SQLで動作し、他のSQLライクな言語とは話せません。

+0

内部結合なし? –

+0

私もそれを追加することができます - テーブルBにないテーブルAのすべてのレコードが必要ですか?そうでない場合は、内部結合が最も理にかなっています。もし私が聞くことができたら、あなたは何を質問していますか?このSQL Server、Oracle、mysqlなどですか? -edit:または、where句を使用して結合を行うことについて質問していますか? – Sevyns

関連する問題