如何为SQL中的每个特定值选择一条记录?

时间:2018-03-22 13:45:01

标签: sql sql-server

我创建了两个包含以下列的表:

  • 表1:MediaID,CurrentIndex,isUsing
  • 表2:Table2ID,MediaID,NewIndex

我想创建一个检查以下内容的查询

  1. IsUsing在表1中为null或false

  2. 如果每个NewIndex currentIndex大于MediaID,则从表2返回前1名。喜欢这个

    SELECT TOP 1 * 
    FROM table2 
    ORDER BY NewIndex DESC 
    
  3. 是否可以将这两个陈述合并为一个?

    原因是,我正在使用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)

2 个答案:

答案 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()