[英]How do i query this complex query in T-SQL / Linq?
目前我有2張桌子
[Category] -> PK| CAT_ID -> CAT_PARENT (link to itself | if it's a top parent category then it's 0)
[Posts] -> PK | POST_ID -> FK | CAT_ID | CREATE_DATE
如何在每個CAT_PARENT中選擇具有多個子類別的前15個帖子行。 因此,CAT_PARENT及其所有孩子的總帖子數僅為15.我們這里有多個CAT_PARENT。 所以我們可以為每個CAT_PARENT及其子類別返回多個帖子,其中包含15個帖子
這里的問題是讓它在一次查詢SQL服務器中,因為一個查詢最多可能需要200個帖子,所以如果你可以在1個T-sQL查詢/ linq查詢中編寫它,它可能是最好的。
如果你能用LINQ寫它,我更喜歡。 但是在T-SQL中編寫它也是可以的。
非常感謝你 :)
感謝Alexander的解決方案在這里,我修改了一些部分,它可以很好地使用186查詢和一些延遲加載的列不到2秒(遠程)到我的SQL服務器
ALTER procedure [dbo].[get_topParentPost] (
@quantity int
)
as
WITH t AS (
SELECT ROW_NUMBER() OVER (PARTITION BY top_level.CAT_ID ORDER BY p.CREATE_DATE DESC) AS row_num,
top_level.CAT_ID AS top_level_cat_id, child_category.CAT_ID AS category_id, p.POST_ID, p.CREATE_DATE, p.VALIDATE,
p.CAT_ID, p.DESCRIPTION, p.DRAF_OF, p.END_DATE, p.MOD_DATE, p.ON_HOMEPAGE, p.PUBLISH_DATE, p.[STATE], p.THUMB_ID, p.TITLE, p.[TYPE],
p.[VIEW]
FROM
(SELECT cat_id, 0 as cat_parent FROM Categories c WHERE CAT_PARRENT = 0) AS top_level
INNER JOIN Categories AS child_category
ON child_category.CAT_PARRENT = top_level.CAT_ID OR child_category.CAT_ID = top_level.CAT_ID
INNER JOIN Posts p
ON child_category.CAT_ID = p.CAT_ID AND p.VALIDATE = 1
)
SELECT * FROM t WHERE row_num <= @quantity
我修改了一些部分,幫助查詢根據降序日期而不是ID升序選擇前15名
我不確定是否有任何方法可以使用linq執行此操作而不會提取超出必要的信息,但這里有一個T-SQL腳本可以完成任務。 為了確保我理解了這個要求,這里是我對腳本的描述:
此腳本從“類別”具有多於1個子類別的“帖子”表中選擇前15個條目:
declare @cat_id int
declare MULTIPLE_CHILDREN_CATEGORIES cursor for
(
select cat_id
from categories
group by cat_parent
having count(*) > 1
)
open MULTIPLE_CHILDREN_CATEGORIES
fetch next from MULTIPLE_CHILDREN_CATEGORIES into @cat_id
while @@fetch_status = 0
begin
select top 15 *
from posts
where cat_id = @cat_id
order by create_date desc
fetch next from MULTIPLE_CHILDREN_CATEGORIES into @cat_id
end
close MULTIPLE_CHILDREN_CATEGORIES
deallocate MULTIPLE_CHILDREN_CATEGORIES
如果是SQL Server 2005或更高版本,您可以執行以下操作:
SELECT t.top_level_cat_id, t.category_id, t.post_id, t.post_date
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY top_level.cat_id ORDER BY p.post_id) AS row_num,
top_level.cat_id AS top_level_cat_id,
child_category.cat_id AS category_id,
p.post_id,
p.post_date
FROM
Post p
INNER JOIN Category AS child_category
ON child_category.cat_id = p.cat_id
INNER JOIN Category AS top_level
ON top_level.cat_id = child_category.cat_parent
) AS t
WHERE t.row_num <= 15
這是我用於創建測試表的T-SQL:
CREATE TABLE Category (cat_id INT, cat_parent INT);
--top level
INSERT INTO Category VALUES(1, 0);
INSERT INTO Category VALUES(2, 0);
-- child categories
INSERT INTO Category VALUES(3, 1);
INSERT INTO Category VALUES(4, 1);
INSERT INTO Category VALUES(5, 2);
CREATE TABLE Post(post_id INT, cat_id INT, post_date DATETIME);
INSERT INTO Post VALUES(1, 3, GETDATE());
INSERT INTO Post VALUES(2, 3, GETDATE());
INSERT INTO Post VALUES(3, 3, GETDATE());
INSERT INTO Post VALUES(4, 3, GETDATE());
INSERT INTO Post VALUES(5, 3, GETDATE());
INSERT INTO Post VALUES(6, 3, GETDATE());
INSERT INTO Post VALUES(7, 3, GETDATE());
INSERT INTO Post VALUES(8, 3, GETDATE());
INSERT INTO Post VALUES(9, 3, GETDATE());
INSERT INTO Post VALUES(10, 3, GETDATE());
INSERT INTO Post VALUES(11, 3, GETDATE());
INSERT INTO Post VALUES(12, 3, GETDATE());
INSERT INTO Post VALUES(13, 3, GETDATE());
INSERT INTO Post VALUES(14, 3, GETDATE());
INSERT INTO Post VALUES(15, 3, GETDATE());
-- these records won't appear
INSERT INTO Post VALUES(16, 3, GETDATE());
INSERT INTO Post VALUES(17, 4, GETDATE());
INSERT INTO Post VALUES(18, 4, GETDATE());
INSERT INTO Post VALUES(19, 5, GETDATE());
INSERT INTO Post VALUES(20, 5, GETDATE());
我想像linq2sql這樣的東西:
IEnumerable<IEnumerable<Post>> posts = db.Categorys
.Where(p=>p.CAT_PARENT == 0)
.Select(p=>p.Categorys
.SelectMany(q=>q.Posts)
.OrderByDescending(q=>q.CREATE_DATE)
.Take(15))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.