我创建了两个包含以下列的表:
我想创建一个检查以下内容的查询
IsUsing
在表1中为null或false
如果每个NewIndex
currentIndex
大于MediaID
,则从表2返回前1名。喜欢这个
SELECT TOP 1 *
FROM table2
ORDER BY NewIndex DESC
是否可以将这两个陈述合并为一个?
原因是,我正在使用C#进行此查询,并且第一个查询返回超过200条记录。我不希望每次都发送200多个数据库请求。
像这样输入
+-----------+--+----------+--------------+--+
| MediaID | | IsUsing | CurrentIndex | |
+-----------+--+----------+--------------+--+
| 123123123 | | false | 2 | |
| 123321 | | | 0 | |
| 123123 | | false | 5 | |
+-----------+--+----------+--------------+--+
+-----------+-----------+----------+--+--+--+
| Table2ID | MediaID | NewIndex | | | |
+-----------+-----------+----------+--+--+--+
| 1 | 123123123 | 3 | | | |
| 2 | 123321 | 2 | | | |
| 3 | 123123 | 0 | | | |
+-----------+-----------+----------+--+--+--+
所以输出就像
MediaID,Table2ID,Index(来自table2)
答案 0 :(得分:1)
您可以使用以下查询:
;WITH CTE AS (
SELECT t2.MediaID, t2.Table2ID, t2.NewIndex,
ROW_NUMBER() OVER (PARTITION BY t2.MediaID
ORDER BY t2.NewIndex DESC) AS rn
FROM table2 AS t2
JOIN table1 AS t1
ON t2.MediaID = t1.MediaID AND t2.NewIndex > t1.CurrentIndex
WHERE (t1.IsUsing IS NULL) OR (t1.IsUsing = 0)
)
SELECT MediaID, Table2ID, NewIndex
FROM CTE
WHERE rn = 1
CTE
的查询:
table1
设置为IsUsing
的{{1}}条记录(这是bit
的{{1}}值)true
table2
小于或等于NewIndex
CurrentIndex
的{{1}}条记录。最后,使用table1
我们可以获得最大的每媒体ID记录。
答案 1 :(得分:0)
您可能会发现apply
对于此类查询更为简单:
select . . .
from table1 t1 cross apply
(select top 1 t2.*
from table2 t2
where t2.mediaid = t1.mediaid and t2.NewIndex > t1.currentIndex
order by t2.NewIndex desc
) t2
where t1.isUsing is null or t1.isUsing = 'false';
您会注意到此查询非常符合您描述问题的逻辑。此外,apply
倾向于更好地利用索引(在这种情况下,在table2(mediaid, newindex)
上)而不是row_number()
。