试图从表SQL Server中获取前两个记录

时间:2017-06-01 16:10:42

标签: sql-server-2008

我试图第一次获得第一条记录,然后第二条查询第二条记录。我正在使用这两个查询,但它们返回相同的内容:

SELECT M.CODE,
ISNULL((SELECT TOP 1 *
FROM (
SELECT TOP 1 PRICE AS PRICE FROM MTRLINES ML WHERE ML.MTRL=M.MTRL AND FINDOC IN (SELECT FINDOC FROM FINDOC WHERE SOSOURCE=1251 AND FPRMS IN (1,2)) ORDER BY FINDOC DESC ) T
ORDER BY PRICE),0) AS B
FROM MTRL M
WHERE M.SODTYPE=51 AND M.COMPANY=1 AND M.CODE=:kod_an
ORDER BY M.CODE

这会获得第一条记录,然后尝试执行此查询以获取第二条记录:

SELECT M.CODE,
ISNULL((SELECT TOP 1 *
FROM (
SELECT TOP 2 PRICE AS PRICE FROM MTRLINES ML WHERE ML.MTRL=M.MTRL AND FINDOC IN (SELECT FINDOC FROM FINDOC WHERE SOSOURCE=1251 AND FPRMS IN (1,2)) ORDER BY FINDOC DESC ) T
ORDER BY PRICE),0) AS B
FROM MTRL M
WHERE M.SODTYPE=51 AND M.COMPANY=1 AND M.CODE=:kod_an
ORDER BY M.CODE

但它返回相同的结果。我还在学习谢谢!

编辑:

只是为了得到这个想法的简单说明:用户传递变量:kod_an

我有两张桌子,例如:

|MTRL|  CODE  |
---------------
| 1  | 080109 |
| 2  | 085145 |
| 3  | 084141 |


|MTRL|  PRICE  | FINDOC |
-------------------------
| 1  |  4.95   | 12345  |
| 1  |  4.50   | 23421  |
| 1  |  3.90   | 23499  |

因此用户正在搜索代码(:kod_an)最后两个价格(在我们的示例中为:kod_an=080109)。我的输出应该是第一个查询中的3.90和第二个查询中的4.50。 Findoc应该有降序,以便第一次选择最后一次,第二次选择第二次从顶部开始!

总结我的查询在两种情况下都显示3.90。我不知道为什么......

2 个答案:

答案 0 :(得分:1)

使用row_number()

select 
    sub.code
  , sub.price
from (
    select 
        m.code
      , ml.price
      , rn = row_number() over (partition by m.code, order by price)
    from mtrl m
      inner join mtrlines ml
        on m.mtrl = ml.mtrl
    where m.code=:kod_an
  ) sub
where rn in (1,2)

rextester演示:http://rextester.com/VQIGT77173

返回:

+---+-------+-------+
|   | code  | price |
+---+-------+-------+
| 1 | 80109 |     4 |
| 2 | 80109 |     5 |
+---+-------+-------+

如果由于某种原因需要两个结果集,则可以对rn = 1重复上述一次,对rn = 2重复一次。

答案 1 :(得分:0)

在SqlZim的帮助下,我已经实现了我的目标:

SELECT 
        SUB.CODE
      , SUB.PRICE
FROM (
        SELECT 
              M.CODE
              , ML.PRICE
              , rn = row_number() over (PARTITION BY M.CODE ORDER BY FINDOC DESC)
        FROM  MTRLINES ML
              INNER JOIN MTRL M
                    ON M.MTRL = ML.MTRL  AND FINDOC IN (SELECT FINDOC FROM FINDOC WHERE SOSOURCE=1251 AND FPRMS IN (1,2)) 
              WHERE  M.SODTYPE=51 AND M.COMPANY=1 AND M.CODE=:kod_an
      ) sub
WHERE rn IN (1,2)