我有我無法使用NHibernate標準創建SQL查詢:NHibernate的 「SELECT ... FROM(SELECT ...」 標準
SELECT ID, COLA, COLB, COLC
FROM table
WHERE COLC='something' AND ID IN (SELECT ID FROM (SELECT MAX(ID) as ID, COLA FROM table WHERE COLB='something' GROUP BY COLA) subquery)
ORDER BY ID DESC
我本來這個稍微簡單查詢:
SELECT ID, COLA, COLB, COLC
FROM table
WHERE COLC='something' AND ID IN (SELECT MAX(ID) FROM table WHERE COLB='something' GROUP BY COLA)
ORDER BY ID DESC
然而,NHibernate的,如果我用一個「GROUP BY」,它會自動將字段添加到SELECT語句,我沒有阻止它的方式(只要我能找到)。
基本上,我需要找到最新的記錄按任意列分組(在本例中爲「COLA」)。我選擇最大ID來嘗試獲取最新記錄(儘管這可能是其他內容,如「MAX(UPDATED)」)。獲取最新記錄集後,我會進一步過濾它們(「WHERE COLC ='something'」),然後在結果中選擇我需要的列。
如果有更好的方法來獲得相同的結果,我很樂意聽到它。充其量,我的SQL技能是平庸的。
在NHibernate中,我可以得到兩個查詢的權利,但中間的一塊 - 「選擇ID從」,將無法正常工作。
主查詢:
DetachedCriteria.For<table>()
.Add<table>(x => x.COLC == "something")
.Add(LambdaSubquery.Property<table>(x => x.ID).In(subquery));
而且子查詢:
DetachedCriteria.For<table>()
.Add<table>(x => x.COLB == "something")
.SetProjection(Projections.ProjectionList()
.Add(LambdaProjection.Max<table>(x => x.ID))
.Add(LambdaProjection.GroupProperty<table>(x => x.COLA)));
子查詢標準把「可樂」在選擇列表中(因爲GroupProperty的),所以它自身不可用,這就是爲什麼我需要弄清楚如何在條件中執行「SELECT ID FROM(SELECT ...)」。合併後,它們會生成以下無效SQL(因爲子查詢返回多個列):
SELECT ID, COLA, COLB, COLC
FROM table
WHERE COLC='something' AND ID IN (SELECT MAX(ID), COLA FROM table WHERE COLB='something' GROUP BY COLA)
ORDER BY ID DESC
編輯:這也可能有助於看到我想要的那種數據和結果:
ID COLA COLB COLC
1 1 someone someother
2 1 something someone (Matches subquery, but not the max. ID)
3 1 something something (Matches subquery and main query)
4 2 someone something
5 2 something someother (Only matches subquery)
6 3 someone someother
我想這裏有最大的ID爲一組給定的「COLA」 S結果, 「COLB」匹配「something」,所以我希望子查詢返回{3,5}。最後,查詢只會返回ID 3的記錄(由於COLC錯誤,外部WHERE子句除去了5)。 COLB和COLC中的實際數據是無關的 - 我只是用它來進一步過濾結果。
我想,在它的核心,我想對每一套COLA
SELECT ID, COLA, COLB
FROM table
WHERE ID IN (SELECT MAX(ID) FROM table GROUP BY COLA)
ORDER BY ID DESC
你可以顯示你的NHibernate代碼嗎?你想要的查詢究竟是什麼,第二個呢?您幾乎可以使用HQL將其複製並粘貼到NHibernate中。 – rebelliard 2010-09-09 13:09:21
我會很有興趣看到使用LINQ完成這項工作 – Gage 2010-09-09 13:14:02
@Rafael - 我添加了我能夠在NHibernate中工作的內容。理想情況下,我想要第二個查詢,但第一個是可接受的,併產生相同的結果。第一個查詢是一種解決方法,因爲NHibernate總是將組屬性放入SELECT列表中。我避免使用HQL,因爲我不喜歡使用「魔術字符串」。如果我絕對肯定不能以標準來做,那麼我想我沒有太多的選擇。 – Shawn 2010-09-09 13:24:21