我试图第一次获得第一条记录,然后第二条查询第二条记录。我正在使用这两个查询,但它们返回相同的内容:
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。我不知道为什么......
答案 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)