2017-06-01 57 views
0

我想第一次获取第一条记录,然后第二条查询获得第二条记录。我使用这两个查询,但他们回到同一件事:试图从表SQL Server中获得前两条记录

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。我不知道为什么......

+1

样本数据和预期产出将是真正有用的,但我99%肯定查询是过于复杂。你得到一条记录是因为ISNULL(这两个查询中的(SELECT TOP 1 *',这将限制为1条记录。 – scsimon

+0

)而不是将这些查询转储给我们,您可以编辑您的问题并向我们显示示例表数据以及你想要的输出? –

+0

调查连接。我很确定这是你正在努力完成的一个关于方式。 – scsimon

回答

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

+0

您是否检查修改后的问题? –

+0

@ F.Mysir修改我的回答 – SqlZim

+0

您的错误是我给出的时间,正如我所说的,我希望FINDOC按降序排列。但总体感谢你的方向;) –

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) 
相关问题