Подтвердить что ты не робот

Взятие второй последней строки только с одним выбором в SQL Server?

Я пытался выбрать второй последний ряд с SQL Server. Поэтому я написал такой запрос:

SELECT TOP 1 * From Cinema 
WHERE CinemaID!=(SELECT TOP 1 CinemaID 
                 FROM Cinema
                 ORDER BY CinemaID DESC)                      
ORDER BY CinemaID DESC 

и он сделал то, что мне нужно. Но я хочу сделать то же самое только с одним выбором.

Я читал, что предложение LIMIT в MySql делает это. Но я не мог найти никакого эквивалента этого. Поэтому я ценю любую помощь в поиске чего-то полезного.

4b9b3361

Ответ 1

Чтобы получить вторую последнюю строку в одном выборе:

SELECT TOP 1 * From
(select Top 2 * from Cinema ORDER BY CinemaID DESC) x                     
ORDER BY CinemaID

Это действительно только "один", потому что внешний выбор занимает всего 2 строки.

Ответ 2

Лучший способ сделать это (и совместимый со стандартом ANSI SQL) - использовать CTE (Common Table Expression) с функцией ROW_NUMBER:

;WITH OrderedCinemas AS
(
   SELECT 
       CinemaID, CinemaName, 
       ROW_NUMBER() OVER(ORDER BY CinemaID DESC) AS 'RowNum'
   FROM dbo.Cinema
)
SELECT 
   CinemaID, CinemaName
FROM OrderedCinemas
WHERE RowNum = 2

Используя эту конструкцию, вы можете получить второе наивысшее значение очень легко - или пятую высоту (WHERE RowNum = 5) или верхние 3 строки (WHERE RowNum <= 3) или все, что вам нужно - значения CinemaID просто упорядочены и последовательно пронумерованы для вашего использования.

Ответ 3

Следующие действия не работают, объясняя почему: Использование столбца производной функции ранжирования в разделе where (SQL Server 2008)

Я буду держать его здесь для полноты:


SELECT row_number() OVER (ORDER BY col) r, *
FROM tbl
WHERE r = 2

Дополнительная информация: http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile


Итак, я думаю, что наиболее читаемый способ сделать это:

SELECT * FROM (SELECT row_number() OVER (ORDER BY col) r, * FROM tbl) q
WHERE r = 2

Ответ 4

Поскольку этот (старый) вопрос не был помечен конкретной версией SQL-Server, и ни один из (очень хороших) ответов не использует только одно предложение SELECT - по уважительной причине, что это было невозможно в старых версиях - вот тот, который работает только в последних 2012+ версиях:

SELECT c.* 
FROM dbo.Cinema AS c                    
ORDER BY CinemaID DESC
OFFSET 1 ROW
FETCH FIRST 1 ROW ONLY ; 

Протестировано в SQLFiddle

Ответ 5

SELECT TOP 1 * FROM tbl_CompanyMaster 
where Companyid >= (SELECT MAX(Companyid) - 1 FROM tbl_CompanyMaster)

Ответ 6

Итак, в духе только использования одного предложения SELECT, как указано в OP, и тщательного злоупотребления T-SQL в целом, я предлагаю то, что я никогда бы никогда не рекомендовал использовать на производстве, но тем не менее удовлетворяет указанным критериям:

update Cinema
set Cinema.SomeField = Cinema.SomeField
output inserted.*
from Cinema
inner join 
(
    select top 2 CinemaID, ROW_NUMBER() over (order by CinemaID desc) as RowNum
    from Cinema
) rsRowNum on rsRowNum.CinemaID = Cinema.CinemaID
where RowNum = 2

Ответ 7

Этот запрос также будет работать для SQLITE

SELECT *  From
(select * from Cinema ORDER BY CinemaID  DESC LIMIT 2) AS name                    
ORDER BY CinemaID LIMIT 1

Ответ 8

Вы используете только один оператор SELECT. Оператор SELECT может включать произвольное (более или менее) количество подзапросов - коррелированные подзапросы, скалярные подзапросы и т.д., Каждый со своим предложением SELECT. Но это еще один оператор SELECT.

Если вы хотите избежать подзапроса, вы можете выбрать верхнюю часть 2 и пропустить тот, который вы не хотите. Тем не менее, такое программирование довольно хрупкое. Вы должны помнить, что пропустить каждый раз; рано или поздно вы забудете.

Ответ 9

Два выбора, но немного быстрее

select top 1 * from(
SELECT TOP 2 * From Cinema 
WHERE CinemaID
ORDER BY CinemaID DESC) top2
Order by CinemaID

Ответ 10

SELECT field_name FROM (SELECT TOP 2 field_name FROM table_name 
                        ORDER BY field_name DESC)
WHERE rownum = 2;

Ответ 11

select * from TABLE_NAME order by COLUMN_NAME desc limit 1,1 ;

Где COLUMN_NAME должен быть "первичный ключ" или "уникальный"

Ответ 12

select top 1* from(SELECT TOP 2 * From Cinema 
                   WHERE CinemaID
                   ORDER BY CinemaID DESC) XYZ
ORDER BY CinemaID

где XYZ не является ключевым словом. Это просто слово. И слово может быть любым.

Ответ 13

Если вам нужно это сделать, но:

  • столбец отличается от id
  • вам нужно заказать определенный столбец
  • не может использовать SELECT в FROM (если вы используете старые версии Hibernate, например).

Вы можете сделать:

select top 1 * from Cinema
where date < (select MAX(date) from Cinema)
order by date desc

Ответ 14

Самый простой способ получить вторую последнюю строку из таблицы sql - это пользователь ORDER BY CinemaID DESC и установить LIMIT 1,1

ПОПРОБУЙТЕ ЭТО

SELECT * from `Cinema` ORDER BY `CinemaID` DESC LIMIT 1,1

Ответ 15

Вот мой код:

SELECT *  From
(select * from table name ORDER BY column name  DESC LIMIT 2) AS xyz                   
ORDER BY column name LIMIT 1;