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) 
相關問題