首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Simple.Data中模拟子查询?

在Simple.Data中模拟子查询?
EN

Stack Overflow用户
提问于 2015-03-18 18:20:53
回答 1查看 219关注 0票数 0

经过广泛的研究后,我的理解是,您不能在Simple.Data中进行子查询。然而,有了足够的加入和排序,我偶尔会看到一个CTE弹出,这将为我的目的服务。我创建了一个小提琴来演示我想用Simple.Data实现什么(在ADO.NET之上),我只是不知道如何在simple.data查询(或一组查询)中构建这个查询。

如果我有两张桌子:

代码语言:javascript
复制
CREATE TABLE Request
    (id int, 
     payload varchar(50))
;

CREATE TABLE Response
    (id int,
     requestId int,
     payload varchar(50),
     sortableValue int,
     filterField bit)
;

如何获得子表的筛选结果?例如:

代码语言:javascript
复制
SELECT *
FROM Request ereq
JOIN
    Response eres 
    ON eres.id = (SELECT TOP 1 id from Response 
                  WHERE requestId = ereq.id AND filterField = 1
                  ORDER BY sortableValue DESC)

或者用CTE

代码语言:javascript
复制
WITH sorted_content AS 
(
  SELECT ROW_NUMBER() OVER (PARTITION BY requestId ORDER BY sortableValue DESC) as rowId,
  *
  FROM Response
  WHERE filterField = 1
)

SELECT * 
FROM Request ereq
JOIN sorted_content sorted_eres 
     ON sorted_eres.requestId = ereq.id 
        AND sorted_eres.rowId = 1

http://sqlfiddle.com/#!6/33ac5/17

目标是能够在Simple.Data表达式中执行类似于上述表达式的操作,这样我就可以利用分页。如果我在事后进行筛选,分页就会变得可疑/昂贵。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-25 17:04:20

我希望有人能想出一个更好的解决方案,但我们最终想出的解决方案是使用View:

代码语言:javascript
复制
CREATE VIEW FilteredResponse
AS 
  SELECT Response1.* 
  FROM   (SELECT (SELECT TOP (1) id 
                  FROM   Response AS ri 
                  WHERE  ( requestId = ro.requestId ) 
                         AND ( filterField = 1 ) 
                  ORDER  BY sortableValue DESC) AS rid 
          FROM   (SELECT DISTINCT requestId 
                  FROM   Response) AS ro) AS sortedResponse 
         INNER JOIN Response AS Response1 
                 ON sortedResponse.rid = Response1.id 

现在,下面的SQL生成适当的结果:

代码语言:javascript
复制
SELECT * FROM Request ereq
JOIN FilteredResponse eres ON eres.requestId = ereq.id

这是一个非常简单的Simple.Data查询:

_db.Request.FindAll().Join(_db.FilteredResponse).On(_db.FilteredResponse.RequestId == _db.Request.Id)

全小提琴:http://sqlfiddle.com/#!6/fe341/3/0

我们可以避免这种情况,因为我们的filterField值在所有情况下都是已知的。这对于动态filterField不起作用。

我仍然希望社区里的人能找到一种更干净的方法来实现这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29129789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档