Chcę użyć składni Oracle, aby wybrać tylko 1 wiersz z tabeli DUAL
. Na przykład chcę wykonać to zapytanie:
SELECT user
FROM DUAL
... i miałoby około 40 płyt. Ale potrzebuję tylko jednej płyty. ... ORAZ chcę, aby stało się to bez WHERE
klauzuli.
Potrzebuję czegoś w polu nazwa_tabeli, na przykład:
SELECT FirstRow(user)
FROM DUAL
dual
?dual
to tabela systemowa w oracleDUAL
. To trochę jak#define TRUE 0
w C - jasne, może ci się udać, ale przyszli programiści cię nienawidzą.select user from dual
? Jeśli nie, spróbuj tego i zobacz, co otrzymasz. W standardowym systemie Oracle odzyskasz użytkownika, z którym wykonujesz polecenie.Odpowiedzi:
Używasz ROWNUM.
to znaczy.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
źródło
order by
.ORDER BY
jest stosowane poWHERE
.SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
Znalazłem to „rozwiązanie” ukryte w jednym z komentarzy. Ponieważ szukałem tego przez jakiś czas, chciałbym to trochę podkreślić (nie mogę jeszcze komentować ani robić takich rzeczy ...), więc użyłem:
Spowoduje to wydrukowanie żądanego wpisu [Kolumna] z najnowszego wpisu w tabeli, przy założeniu, że [Data] jest zawsze wstawiana za pośrednictwem SYSDATE.
źródło
ROWID
, o ile nigdy nie usuniesz żadnych rekordów i zawsze dbasz o ostatnią wstawioną / zmodyfikowaną.ROWID
jest losowo modyfikowane przez Oracle. Tak nie jest. Polega ona na faktycznym modyfikowaniu wierszy, tj. Usuwasz jeden, a następnie wstawiasz. Wstawiony otrzyma staryROWID
. Istnieją takie rzeczy, jak statyczne tabele, które nigdy nie są aktualizowane - dobrym przykładem są stany w USA - gdzie gdyby się zmieniły, i tak prawdopodobnie miałoby to inne reperkusje, kiedy jest to w porządku.ROWID
można by je zmienić, dobry DBA wyszukałby je i zrobił, co mógł, aby ich uniknąć, gdyby istniała możliwość, że wpływają na tak statyczną tabelę, jak to opisałem tylko aplikacja powinna działać.SELECT
Zamiast tego można dokonać eksportu tabeli za pomocą instrukcji. Import miałby nastąpić raz i nigdy więcej. Rozumiem, ostrożność jest zdecydowanie potrzebna, ale problemy nie są nieuniknione.Ta składnia jest dostępna w Oracle 12c:
^^ Chciałem tylko zademonstrować, że można użyć wiersza lub wierszy (liczba mnoga), niezależnie od liczby żądanej liczby wierszy).
źródło
mamy 3 możliwości uzyskania pierwszego wiersza w tabeli Oracle DB.
1)
select * from table_name where rownum= 1
jest najlepszym sposobem2)
select * from table_name where id = ( select min(id) from table_name)
3)
źródło
O ile wiem,
dual
tabela w Oracle to specjalna tabela z tylko jednym wierszem. Więc to wystarczyłoby:źródło
👌 Odpowiedź brzmi:
Zapytania zagnieżdżonego należy używać jako:
=> W PL / SQL „ROWNUM = 1” NIE jest równe „TOP 1” TSQL.
Nie możesz więc użyć takiego zapytania: "wybierz * z any_table_x, gdzie rownum = 1 zamówienie według any_column_x;" Ponieważ oracle otrzymuje pierwszy wiersz, a następnie stosuje kolejność po klauzuli.
źródło
rownum = 1
, ale nie powinniśmy już pozwalać starym błędom wpływać na nasz kod.W
limit 1
Oracle nie ma warunku (to jest MySQL / PostgresSQL), musisz to określićwhere rownum = 1
.źródło
„FirstRow” jest ograniczeniem i dlatego znajduje się w
where
klauzuli, a nie wselect
klauzuli. Nazywa się rownumźródło
ORDER BY
, ponieważ porządkowanie następuje tylko po klauzuli where. Innymi słowy, aby znaleźć się na szczycie pewnego posortowanego zapytania, rownum jest całkowicie bezużyteczne.Where
z zapytaniem View.SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1
? Cóż, to może działać, ale wygląda całkiem głupio, tbh.Jeśli jakikolwiek wiersz wystarczy, spróbuj:
Brak klauzuli gdzie.
źródło
źródło
select a.user from (select user from users order by user) a where rownum = 1
będzie działać najlepiej, inna opcja to:
w scenariuszach, w których chcesz różnych podzbiorów, ale myślę, że możesz również użyć
RANK()
Ale, podoba mi się też,row_number()
over(...)
ponieważ nie jest wymagane grupowanie.źródło
Jeśli chcesz odzyskać tylko pierwszy wiersz posortowanego wyniku z najmniejszą liczbą podzapytań, spróbuj tego:
źródło
Bardziej elastyczny niż
select max()
jest:źródło