有谁知道如何将此SQL查询重现为SubSonic查询?
SELECT PollID, AddedDate, AddedBy, QuestionText, IsCurrent, IsArchived, ArchivedDate,
(SELECT SUM(Votes) FROM sqsc_PollOptions WHERE PollID = P.PollID) AS Votes
FROM sqsc_Polls P
WHERE IsArchived = @IsArchived1 OR IsArchived = @IsArchived2
ORDER BY AddedDate DESC
我尝试使用View和聚合查询,但是当sqsc_PollOptions表中没有记录时,它会返回没有行,这将是创建新Poll记录时的情况。
这就是我查询视图的方式:
return new Select(Aggregate.GroupBy(VwSdPollOption.Columns.PollID, "PollID"), Aggregate.GroupBy(VwSdPollOption.Columns.QuestionText, "QuestionText"), Aggregate.GroupBy(VwSdPollOption.Columns.IsCurrent, "IsCurrent"), Aggregate.Sum(VwSdPollOption.Columns.Votes, "Votes")).From(Views.VwSdPollOption).Where(VwSdPollOption.Columns.CentreName).IsEqualTo(centreName).ExecuteDataSet();
非常感谢任何帮助!
答案 0 :(得分:2)
将您的观点更改为:
SELECT P.PollID, P.AddedDate, P.AddedBy, P.QuestionText,
P.IsCurrent, P.IsArchived, P.ArchivedDate,
v.Votes
FROM sqsc_Polls P left outer join
( SELECT SUM(Votes) as Votes, PollID
FROM sqsc_PollOptions group by PollID ) V
on P.PollID = V.PollID
ORDER BY P.AddedDate DESC
您需要对投票表执行外部联接,以便您的基本投票表字段仍然存在。请注意,投票将是可以为空的。您可以通过在视图中放置一个case语句来返回0而不是null,或者只是在代码中围绕它进行编码来解决这个问题。
另外,请注意我没有测试这个并且SQL来自内存,因此可能存在拼写错误。你应该能够从这里想出来。