mysql - এসকিউএল ইনজেকশন




একটি এসকিউএল ডাটাবেস টেবিলের মধ্যে nth সারি নির্বাচন করুন কিভাবে? (20)

SQL সার্ভার

শীর্ষ থেকে এন 'রেকর্ড নির্বাচন করুন

SELECT * FROM (
SELECT 
ID, NAME, ROW_NUMBER() OVER(ORDER BY ID) AS ROW
FROM TABLE 
) AS TMP 
WHERE ROW = n

নীচের থেকে রেকর্ড এন 'নির্বাচন করুন

SELECT * FROM (
SELECT 
ID, NAME, ROW_NUMBER() OVER(ORDER BY ID DESC) AS ROW
FROM TABLE 
) AS TMP 
WHERE ROW = n

আমি কিছু ডাটাবেস টেবিলের থেকে n তম সারি নির্বাচন করার (কিছুক্ষন) ডাটাবেস অগ্নিকুণ্ড পদ্ধতিগুলি শিখতে আগ্রহী। নিম্নলিখিত ডেটাবেসের স্থানীয় কার্যকারিতা ব্যবহার করে এটি কীভাবে অর্জন করা যায় তা দেখতে আকর্ষণীয় হবে:

  • SQL সার্ভার
  • মাইএসকিউএল
  • পোস্টগ্রি
  • SQLite
  • আকাশবাণী

আমি বর্তমানে এসকিউএল সার্ভার 2005-এ নিম্নলিখিত মত কিছু করছি, তবে আমি অন্যের আরও অগোছালো পন্থাগুলি দেখতে আগ্রহী হব:

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

উপরের এসকিউএল এর জন্য ক্রেডিট: ফিরোজ আনসারির ওয়েব্লগ

আপডেট: এসকিউএল মান সম্পর্কিত ট্রোজেল আর্মিনের উত্তর দেখুন। ট্রোজেল, আপনি কি কোন লিঙ্ক আমরা উদ্ধৃত করতে পারেন আছে?


1 ছোট পরিবর্তন: n পরিবর্তে n-1।

select *
from thetable
limit n-1, 1

Sybase এসকিউএল কোথাও:

SELECT TOP 1 START AT n * from table ORDER BY whatever

ORDER দ্বারা বা এটি অর্থহীন ভুলবেন না।


অবিশ্বাস্য যে আপনি এটি একটি এক্সিকিউটিভ একটি এসকিউএল ইঞ্জিন খুঁজে পেতে পারেন ...

WITH sentence AS
(SELECT 
    stuff,
    row = ROW_NUMBER() OVER (ORDER BY Id)
FROM 
    SentenceType
    )
SELECT
    sen.stuff
FROM sentence sen
WHERE sen.row = (ABS(CHECKSUM(NEWID())) % 100) + 1

আমি এই বন্যভাবে অদক্ষ সন্দেহ কিন্তু বেশ সহজ পদ্ধতি, যা আমি এটি চেষ্টা করে একটি ছোট ডেটাসেট উপর কাজ।

select top 1 field
from table
where field in (select top 5 field from table order by field asc)
order by field desc

এটি 5 ম আইটেমটি পাবে, একটি ভিন্ন এনথ আইটেম পেতে দ্বিতীয় শীর্ষ নম্বরটি পরিবর্তন করুন

কেবলমাত্র SQL সার্ভার (আমি মনে করি) তবে পুরানো সংস্করণগুলিতে কাজ করতে হবে যা ROW_NUMBER () সমর্থন করে না।


আমি বিশ্রাম সম্পর্কে নিশ্চিত নই, কিন্তু আমি জানি SQLite এবং MySQL এর কোনও "ডিফল্ট" সারি ক্রম নেই। সেই দুটি উপভাষায়, অন্তত, নীচের স্নিপেটটি _table থেকে 15 তম এন্ট্রি ধারণ করে, এটি যুক্ত হওয়ার তারিখ / সময় অনুসারে সাজানো:

SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15

(অবশ্যই, আপনার একটি অতিরিক্ত DATETIME ক্ষেত্র থাকা দরকার এবং এন্ট্রি যোগ করা তারিখ / সময়তে সেট করুন ...)


উদাহরণস্বরূপ, যদি আপনি MSSQL- এ প্রতিটি 10 ​​ম সারি নির্বাচন করতে চান তবে আপনি এটি ব্যবহার করতে পারেন;

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY ColumnName1 ASC) AS rownumber, ColumnName1, ColumnName2
  FROM TableName
) AS foo
WHERE rownumber % 10 = 0

শুধু এমওডি নিন এবং নম্বরটি 10 ​​এখানে পরিবর্তন করুন যা আপনি চান।


এইভাবে আমি এটি DB2 SQL- এর মধ্যে করব, আমি বিশ্বাস করি RRN (আপেক্ষিক রেকর্ড নম্বর) ও / এস দ্বারা টেবিলের মধ্যে সংরক্ষণ করা হয়;

SELECT * FROM (                        
   SELECT RRN(FOO) AS RRN, FOO.*
   FROM FOO                         
   ORDER BY RRN(FOO)) BAR             
 WHERE BAR.RRN = recordnumber

এখানে একটি স্প্রোকের জেনেরিক সংস্করণ যা আমি সম্প্রতি ওরাকলের জন্য লিখেছি যা গতিশীল পৃষ্ঠা / সাজানোর জন্য অনুমতি দেয় - এইচটিইউ

-- p_LowerBound = first row # in the returned set; if second page of 10 rows,
--                this would be 11 (-1 for unbounded/not set)
-- p_UpperBound = last row # in the returned set; if second page of 10 rows,
--                this would be 20 (-1 for unbounded/not set)

OPEN o_Cursor FOR
SELECT * FROM (
SELECT
    Column1,
    Column2
    rownum AS rn
FROM
(
    SELECT
        tbl.Column1,
        tbl.column2
    FROM MyTable tbl
    WHERE
        tbl.Column1 = p_PKParam OR
        tbl.Column1 = -1
    ORDER BY
        DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 1, Column1, 'X'),'X'),
        DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 1, Column1, 'X'),'X') DESC,
        DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate),
        DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate) DESC
))
WHERE
    (rn >= p_lowerBound OR p_lowerBound = -1) AND
    (rn <= p_upperBound OR p_upperBound = -1);

এসকিউএল 2005 এবং উপরে নির্মিত এই বৈশিষ্ট্য আছে। ROW_NUMBER () ফাংশন ব্যবহার করুন। এটি ওয়েব পৃষ্ঠাগুলির জন্য একটি << পূর্ববর্তী এবং পরবর্তী >> শৈলী ব্রাউজিংয়ের জন্য চমৎকার:

বাক্য গঠন:

SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
            *
        FROM
            Table_1
    ) sub
WHERE
    RowNum = 23

এসকিউএল সার্ভারের জন্য, নিম্নলিখিত টেবিল প্রদান থেকে প্রথম সারি ফিরে আসবে।

declare @rowNumber int = 1;
    select TOP(@rowNumber) * from [dbo].[someTable];
EXCEPT
    select TOP(@rowNumber - 1) * from [dbo].[someTable];

আপনি এই মত কিছু দিয়ে মান মাধ্যমে লুপ করতে পারেন:

WHILE @constVar > 0
BEGIN
    declare @rowNumber int = @consVar;
       select TOP(@rowNumber) * from [dbo].[someTable];
    EXCEPT
       select TOP(@rowNumber - 1) * from [dbo].[someTable];  

       SET @constVar = @constVar - 1;    
END;

এসকিউএল সার্ভারের জন্য, সারি নম্বরের মাধ্যমে যাওয়ার একটি সাধারণ উপায় হল: SET ROWCOUNT @row - @ row = আপনি যে সারি নম্বরটি কাজ করতে চান সেটি।

উদাহরণ স্বরূপ:

rowcount 20 সেট - 20 সারি সারি সারি

মাংস নির্বাচন করুন, dbo.sandwich থেকে পনির - 20 তম সারিতে টেবিল থেকে কলাম নির্বাচন করুন

rowcount 0 সেট করুন - সারি সারি সারি সারি সারি

এই 20th সারির তথ্য ফিরে আসবে। পরে rowcount 0 রাখা নিশ্চিত করুন।

আমি অদৃশ্য জানি, কিন্তু আমি একটি এসকিউএল নোব এবং আমি এটা ব্যবহার করেছি তাই আমি কি বলতে পারি?


ওরাকল:

select * from (select foo from bar order by foo) where ROWNUM = x

কিছুই না অভিনব, কোন বিশেষ ফাংশন, যদি আপনি Cache মত আমি ব্যবহার করি ...

SELECT TOP 1 * FROM (
  SELECT TOP n * FROM <table>
  ORDER BY ID Desc
)
ORDER BY ID ASC

আপনি একটি আইডি কলাম বা একটি datestamp কলাম আছে বিশ্বাস করে যে আপনি বিশ্বাস করতে পারেন।


টি-এসকিউএল - একটি টেবিল থেকে N'th RecordNumber নির্বাচন

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from TableName) T where T.Rno = RecordNumber

Where  RecordNumber --> Record Number to Select
       TableName --> To be Replaced with your Table Name

উদাহরণস্বরূপ, একটি টেবিলের কর্মচারী থেকে 5 ম রেকর্ড নির্বাচন করতে, আপনার প্রশ্নটি হওয়া উচিত

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5

যখন আমরা MSSQL 2000 তে কাজ করতাম, তখন আমরা "ট্রিপল-ফ্লিপ" নামক কাজটি করি।

সম্পাদিত

DECLARE @InnerPageSize int
DECLARE @OuterPageSize int
DECLARE @Count int

SELECT @Count = COUNT(<column>) FROM <TABLE>
SET @InnerPageSize = @PageNum * @PageSize
SET @OuterPageSize = @Count - ((@PageNum - 1) * @PageSize)

IF (@OuterPageSize < 0)
    SET @OuterPageSize = 0
ELSE IF (@OuterPageSize > @PageSize)
    SET @OuterPageSize = @PageSize

DECLARE @sql NVARCHAR(8000)

SET @sql = 'SELECT * FROM
(
    SELECT TOP ' + CAST(@OuterPageSize AS nvarchar(5)) + ' * FROM
    (
        SELECT TOP ' + CAST(@InnerPageSize AS nvarchar(5)) + ' * FROM <TABLE> ORDER BY <column> ASC
    ) AS t1 ORDER BY <column> DESC
) AS t2 ORDER BY <column> ASC'

PRINT @sql
EXECUTE sp_executesql @sql

এটি মার্জিত ছিল না, এবং এটি দ্রুত ছিল না, কিন্তু এটি কাজ করে।


স্ট্যান্ডার্ডের ঐচ্ছিক অংশগুলিতে এটি করার উপায় রয়েছে, তবে অনেকগুলি ডাটাবেস এটি করার নিজস্ব উপায় সমর্থন করে।

এই এবং অন্যান্য বিষয় সম্পর্কে কথা বলা একটি সত্যিই ভাল সাইট http://troels.arvin.dk/db/rdbms/#select-limit

মূলত, PostgreSQL এবং MySQL অ-মানক সমর্থন করে:

SELECT...
LIMIT y OFFSET x 

ওরাকল, ডিবি 2 এবং এমএসকিউএল স্ট্যান্ডার্ড উইন্ডোং ফাংশনগুলিকে সমর্থন করে:

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
) AS foo
WHERE rownumber <= n

(যা আমি উপরের লিঙ্কযুক্ত সাইট থেকে কপি করেছি, যেহেতু আমি সেই ডিবি ব্যবহার করি না)

আপডেট: পোস্টগ্রেএসকিউএল 8.4 হিসাবে স্ট্যান্ডার্ড উইন্ডোং ফাংশন সমর্থিত, তাই দ্বিতীয় উদাহরণটি PostgreSQL এর জন্য কাজ করার আশা রাখুন।

আপডেট: 2018-09-15 সংস্করণে 3.25.0 সংস্করণে SQLite যুক্ত উইন্ডো ফাংশন সমর্থন তাই উভয় ফর্ম SQLite এও কাজ করে।


PostgreSQLLIMIT / OFFSET সিনট্যাক্স হল:

SELECT
    *
FROM
    mytable
ORDER BY
    somefield
LIMIT 1 OFFSET 20;

এই উদাহরণটি 21 তম সারি নির্বাচন করে। OFFSET 20 পোস্টগ্রেসকে প্রথম ২0 টি রেকর্ড বাদ দিতে বলছে। যদি আপনি ধারা অনুসারে কোন ORDER BY নির্দিষ্ট না করেন তবে কোন গ্যারান্টি নেই যা আপনি ফিরে পাবেন, যা খুব কমই দরকারী।

স্পষ্টত এসকিউএল মান পাগল উইন্ডিং ফাংশন বাইরে সীমা সমস্যা নীরব হয়, যার ফলে সবাই এটি ভিন্নভাবে প্রয়োগ করে।


SELECT * FROM emp a
WHERE  n = (SELECT COUNT( _rowid)
              FROM emp b
             WHERE a. _rowid >= b. _rowid);

select * from 
(select * from ordered order by order_id limit 100) x order by 
x.order_id desc limit 1;

প্রথমে শীর্ষস্থানে 100 সারি নির্বাচন করুন এবং তারপরে নিম্নমানের ক্রম অনুসারে ক্রমটি নির্বাচন করুন এবং 1 পর্যন্ত সীমাবদ্ধ করুন। তবে এটি একটি অত্যন্ত ব্যয়বহুল বিবৃতি যা দুইবার ডেটা অ্যাক্সেস করে।






postgresql