Diskuze: SQL - výpis druhého řádku splňujícího podmínku
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
V mysql se pouziva LIMIT. Jinak, radky si muzes ocislovat. Netusim, jak v jinych db
SELECT sloupce FROM tabulka WHERE podminky ORDER BY sloupce ASC/DESC LIMIT od_radku,pocet -- LIMIT 2 je od radku 2
Pokud bys chtel sude, liche radky, pak bys to musel pridat jako dalsi podminku. V zavorce je pak tabulka z jineho dotazu. Mozna ji bude treba dat alias "...FROM (SELECT... ) tab1 WHERE..."
SELECT ... FROM (SELECT ..., COUNT(*) AS cislo_radku... ORDER BY ...) WHERE cislo_radku>2
SELECT ... FROM (SELECT ..., COUNT(*)%2 AS sude... ORDER BY ...) WHERE sude==0
(ale mozna, ze na to existuje v pozadovanem sql jiny jednodussi prikaz)
Tak jsem to zkoušel a bohužel na moji databázi to nefunguje. Dotazuji se
do access databáze a ta (jak jsem se krkolomně přes googlování ´LIMIT´u
dozvěděl) má obdobu v ´SELECT TOP´, jenže tento příkaz vybere všechny
řádky od prvního nalezeného (až do zadaného), nikoliv AŽ určitý
n-řádek
Jdu hledat alternativu.
SELECT
ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
name
FROM table
WHERE row > 1;
zkus tohle
Omlouvám se tohle je správná varianta, protože do WHERE funkcni ani alias nedáš.
SELECT t.*
FROM
(SELECT ROW_NUMBER() OVER(id) as row, id, nazev
FROM tabulka) t
WHERE t.row => 2
google = ms sql limit
ms sql 2005
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 10 AND 20;
ms sql 2012
USE AdventureWorks; -- mozna staci bez tohoto
GO -- a tohoto
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
ORDER BY SalesOrderID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
GO -- a tohoto
ms sql 2000
SELECT t1.*
FROM (
SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @offset+@count;
ms sql 2012
SELECT *
FROM table1
ORDER BY columnName
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
---
SELECT * FROM table LIMIT OFFSET, ROW_COUNT
This can be translated into Microsoft SQL Server like
SELECT * FROM
(
SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum
FROM table
) a
WHERE rnum > OFFSET
---
CREATE VIEW v_table AS
SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table
SELECT * FROM v_table WHERE row BETWEEN 10 AND 20
V mysql je to LIMIT 20 let, minimalne, stale
zkus se mrknout tady, třeba ti to pomůže
https://devask.cz/…uery-results
Tak po dlouhém snažení a postupným zkoušením navržených možností,
kdy v dotazech nefungoval (databáze (MS 2007) stále házela chybu) pro LIMIT i
OFFSET i GO ... jsem nakonec ve chvíli náhlého impozantního myšlení
vymyslel jak můj problém vyřešit...
prakticky jde jen o využití základních ORDER BY a TOP, kdy jednou seřadím
výběr od konce (DESC) a udělám TOP o jeden řádek méně, abych následně
vše seřadil ASC a vybral první řádek (tedy prakticky druhý ve
výběru)...
lépěji v kódu kde x=počet řádků (což lze samozřejmě zjistit
jednoduchým dotazem) ...
SELECT TOP 1 DatumKontroly
FROM (
SELECT TOP (x-1) DatumKontroly
FROM Kontroly
WHERE IDzaznamKontroly = 420
ORDER BY DatumKontroly DESC)
ORDER BY DatumKontroly ASC;
No akorátže jsem nakonec zjistil, že mi tuto možnost prakticky nabídl
Michal Štěpánek pod svým odkazem, takže si nejsem jist, jestli jsem řešení zvládl
v rámci svého osvícení, nebo prvotním nepochopením odkazovaného Michalova
kódu
samozřejmě
(x-1)
ošetřím v kódu programu, nikoliv v kódu dotazu.
Zobrazeno 9 zpráv z 9.