2016-09-16 54 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

你可以用一個JOIN做到這一點,只有從A選擇:

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

需要從A中選擇所有行,使得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

我也可以添加 - 你是否希望表A中所有不在表B中的記錄?如果沒有,那麼內連接最有意義。如果我可以問,你在詢問什麼?這是SQL Server,甲骨文,MySQL等? -edit:或者你在問使用where子句進行連接嗎? – Sevyns