我需要帮助在SQL中查找匹配的记录。 我的下表缓解了很多问题,其中GridToPageID是主键,并且可能存在具有不同PageID的单个GridID的许多实例。
在我的应用程序中,参数将与特定的PageID列表一起传递,我需要查询并查找仅与传递的PageID的确切数量匹配的记录。 当我使用下面的查询查询SQL时,它返回所有具有2个或更多匹配的记录,其中我只想获得一个恰好具有2个记录的记录。
SELECT [GridID]
FROM [AgencySalesAgreementU01].[dbo].[GridToPage]
where PageID in('11aida','30aida') --or any number
group by gridid
having COUNT (GridToPageID) = 2 --match the number of PageID's passed
这与在LinqPad中测试的linq-to-sql查询相同
string[] allpages ={"11aida","30aida"};//,"32aida"};
var result = from gtp in GridToPage
where allpages.Contains(gtp.PageID)
group gtp by gtp.GridID into grp
where grp.Count() == allpages.Count()
select grp.Key;
result.Dump();
上面的查询结果返回GridID为261,263和266,我希望它只返回261。 如果我传递三个PageID,我需要它返回263和266。 同样地,仅对于PageID'11aida',它将返回268。
答案 0 :(得分:0)
这一个简单的改变应该可以解决您的问题。将DISTINCT添加到您的HUNT COUNT()并将您想要的内容更改为PageID。
编辑:所以你想要一个返回的ID确切地返回你想要的数字,并且返回的数字与你要检查的数字相同?您需要比较两个聚合来做到这一点。
SELECT [GridID]
FROM
[AgencySalesAgreementU01]
.[dbo].[GridToPage]
GROUP BY gridid
HAVING SUM(CASE WHEN PageID
IN (
'11aida',
'30aida'
) THEN 1 ELSE 0 END)
= 2
-- This checks that both were found.
AND COUNT(DISTINCT PageID
) = 2
--this checks that the total found is only 2
这样,您正在查找每个GridID显示该列表中有多少个不同的PageID,然后保留那些与您要查找的计数匹配的GridID。如果有效,请告诉我。
答案 1 :(得分:0)
您应首先对这些数字进行分组,然后在该组中确定所有PageID
是否在allpages
列表中:
string[] allpages ={"11aida","30aida"};//,"32aida"};
var count = allpages.Count();
var result = from gtp in GridToPage
group gtp by gtp.GridID into grp
where grp.Count() == count
&& grp.All(x => allpages.Contains( x.PageID))
select grp.Key;