2013-02-09 62 views
2

我有這個信息的視圖:T-SQL,如何通過查詢來完成這個組?

表A(IDTableA,IDTableB,IDTableC,活動,日期,...)

對於每一個註冊在TableAtableC每個寄存器,我想要tableB有最大日期和有效的註冊。

select IDTableA, IDtableC, IDTableB, Date, Active 
from myView 
where Active = 1 
group by IDTableA, IDTableC 
Having Max(Date) 
order by IDTableA; 

此查詢的工作與SQLite,但如果我嘗試在SQL Server此查詢我得到那個說IDTableBselect未包含在group子句中的錯誤。

我知道理論上SQLite中的第一個查詢不應該工作,但是要這樣做。

如何在SQL Server中執行此查詢?

謝謝。

+0

包括它的'GROUP BY'子句。什麼'HAVING MAX(日期)'等於什麼,到底是什麼? – 2013-02-09 09:41:14

+0

這是用於SQL Server還是用於SQLite? – 2013-02-09 10:47:50

回答

1

試試這個,

select * from table1 b 
where active = 1 
and date = (select max(date) from table1 
      where idtablea = b.idtablea 
      and idtablec = b.idtablec 
      and active = 1); 

SQLFIDDLE DEMO

+0

沒有必要放置一個「GROUP BY」條件來獲得所需的結果。 – Orangecrush 2013-02-09 10:28:49

+0

這是僅使用視圖還是我必須使用三個表? – 2013-02-09 10:44:56

+0

@ÁlvaroGarcía這只是使用視圖。將'table1'替換爲'TableA'(我假設它是你的視圖的名字)。 – Orangecrush 2013-02-09 10:46:53

2

根據SQL 92,如果你使用GROUP BY條款,然後在SELECT輸出表達式列表中,您只能使用GROUP BY列表中提及的列,或任何其他欄目,但它們必須包裝在聚合函數中,如count()sum(),avg(),max(),min()so on

一些像MSSQL,Postgres這樣的服務器嚴格遵守這個規則,但是例如MySQL和SQLite都非常輕鬆和寬容 - 這就是爲什麼它讓你感到驚訝。

長話短說 - 如果你想在MSSQL中工作,堅持SQL92的要求。

2

該查詢SQLServer中

select IDTableA, IDtableC, IDTableB, Date, Active 
from myView v1 
where Active = 1 
    AND EXISTS (
       SELECT 1 
       FROM myView v2 
       group by v2.IDTableA, v2.IDTableC 
       Having Max(v2.Date) = v1.Date 
      ) 
order by v1.IDTableA; 

OR

此外,在SQLServer2005的+,你可以使用CTE與ROW_NUMBER

;WITH cte AS 
(    
    select IDTableA, IDtableC, IDTableB, [Date], Active, 
     ROW_NUMBER() OVER(PARTITION BY IDTableA, IDTableC ORDER BY [Date] DESC) AS rn 
    from myView v1 
    where Active = 1 
) 
    SELECT * 
    FROM cte 
    WHERE rn = 1 
    ORDER BY IDTableA