2017-02-02 5 views
-1

I mehrere Spalte aus einer Tabelle am auswählt und eine der Spalten i erfordern Datensatz von der zweiten Zeile zu holen. Wie soll ich in meiner Abfrage angeben, dass nur diese 1 Spalte aus Zeile 2 abgerufen werden muss? Die SELECT-Anweisung gibt 2 Zeilen zurück, aber Segment 4 muss nur den Wert der zweiten Zeile zurückgeben, den Rückgabewert der anderen Spalte der Zeile 1. Wie soll ich das schreiben?wie nur 1 Spalte 2. Zeile Datensatz zurück

select substrb(segment2,1,30) invtime 
, substrb(segment3,1,30) invoice 
, substrb(segment4,1,10) invdate 
from error_process_log; 
+2

Sie müssen in der Lage sein, eindeutig zu bestimmen, was mit 2. Zeile gemeint ist. Die Reihenfolge, in der Daten zurückgegeben werden, wird nur durch Angabe von ORDER BY gewährleistet. Sobald Sie das haben, ist das Abrufen der zweiten Zeile trivial und die Verwendung der analytischen Funktion ROW_NUMBER() ist eine gute Lösung. – BobC

+0

Wenn Sie Oracle 12c verwenden, können Sie sogar die Offset-Klausel verwenden. SELECT * FROM Tabelle ORDER BY 1 OFFSET 1 REIHEN FETCH NEXT 1 NUR ROWS. Dadurch erhalten Sie die zweite Reihe. Aber wie @BobC gesagt hat, musst du etwas bestellen. –

Antwort

0

In diesem Szenario können Sie Anlaytical-Funktionen wie Lead() Lag() verwenden. Hoffnung unten Illustration hilft.

SELECT SUBSTR(a.nm,1,10), 
    SUBSTR(lead(a.sn) over(order by a.sn),1,5) 
FROM 
    (SELECT 1 AS seq,'avrajit' nm,'Roy1' sn FROM dual 
    UNION ALL 
    SELECT 2 AS seq,'shubho' nm,'Roy2' sn FROM dual 
    UNION ALL 
    SELECT 3 AS seq,'papa' nm,'Roy3' sn FROM dual 
    UNION ALL 
    SELECT 3 AS seq,'romi' nm,'Roy4' sn FROM dual 
)a; 
+0

Die Illustration ist in Ordnung, aber das OP muss verstehen, dass ohne etwas zu bestellen, gibt es nicht wirklich ein gültiges Konzept der "2. Reihe". – BobC