2015-05-16 124 views
0

enter image description hereSql返回所有兄弟結果

我需要一些幫助來做一些查詢。我會給出2個參數(@dateFrom,@dateTo)。基本上,tblRequesttblLog的關係是一對多的關係。我試圖基於LogDate進行查詢。假設我需要從2015/02/01 - 2015/02/28查詢日期,我當前的查詢將返回tblLog的一行結果。但是提到這個場景,取而代之的是返回1結果,我需要返回它的所有兄弟(同一個RequestId,這3行)。

select * from tblRequest 
inner join tblLog on tblLog.RequestId = tblRequest.Id 
where Logdate >= @dateFrom and Logdate < @dateto 

有人知道我該怎麼做到這一點?我正在使用MS Sql。

+0

您正在使用哪個dbms? (看起來不像ANSI SQL,並且日期/時間功能通常是特定於產品的...) – jarlh

+0

由於您的日期範圍,它只會返回一個結果,因爲您在tbllog中只有1行具有此日期範圍 – BrianAtkins

+0

是的,我意識到這一點。但我希望它返回所有的兄弟姐妹(即使條件不符合)。 – dausdashsan

回答

3

假設您的邏輯是正確的,那麼您需要額外的join或條件來引入所有類似的請求ID。下面是使用in一個例子:

select r.name, l.* 
from tblRequest r inner join 
    tblLog l 
    on l.RequestId = r.Id 
where r.id in (select l2.RequestId 
       from tblLog l2 
       where l2.Logdate >= @dateFrom and l2.Logdate < @dateto 
      ); 

作爲一個說明,你也可以用窗函數處理這個:

select rl.* 
from (select r.name, l.*, 
      sum(case when l.LogDate >= @dateFrom and l.Logdate < @dateto 
         then 1 else 0 
       end) over (partition by r.id) as cnt 
     from tblRequest r inner join 
      tblLog l 
      on l.RequestId = r.Id 
    ) rl 
where cnt > 0; 

兩種不同的方式來完成同樣的事情。

0

鑑於SQL的作品,你的上述方案將只返回1行,因爲它是在該日期範圍內唯一的一個,方式也許只是嘗試:

select * from tblRequest 
inner join tblLog on tblLog.RequestId = tblRequest.Id 
where Logdate < @dateto 

這將返回所有結果爲請求