webentwicklung-frage-antwort-db.com.de

Vorherige und nächste Zeile aus Zeilen auswählen, die mit (WHERE) -Bedingungen ausgewählt wurden

Zum Beispiel habe ich diese Aussage:

my name is Joseph and my father's name is Brian

Diese Anweisung wird von Word wie dieser Tabelle aufgeteilt:

------------------------------
|      ID      |   Word      |
------------------------------
|       1      |   my        |
|       2      |   name      |
|       3      |   is        |
|       4      |   Joseph    |
|       5      |   and       |
|       6      |   my        |
|       7      |   father's  |
|       8      |   name      |
|       9      |   is        |
|       10     |   Brian     |
------------------------------

Ich möchte das vorige und das nächste Wort jedes Wortes erhalten

Zum Beispiel möchte ich vorheriges und nächstes Wort von "Name" erhalten:

--------------------------
|    my    |  name  |  is |
--------------------------
| father's |  name  |  is |
--------------------------

Wie kann ich dieses Ergebnis erzielen?

16
mahdi yousefi

sie haben Ihr DBMS nicht angegeben, also ANSI SQL:

select prev_Word, Word, next_Word
from (
    select id, 
           lag(Word) over (order by id) as prev_Word,
           Word,
           lead(Word) over (order by id) as next_Word
    from words
) as t
where Word = 'name';

SQLFiddle: http://sqlfiddle.com/#!12/7639e/1

30

Ohne Unterabfragen:

SELECT a.Word 
FROM my_table AS a
JOIN my_table AS b 
ON b.Word = 'name' AND abs(a.id - b.id) <= 1
ORDER BY a.id
6
Will

Warum hat niemand die einfache Antwort gegeben?

SELECT LAG(Word) OVER ( ORDER BY ID ) AS PreviousWord ,
       Word ,
       LEAD(Word) OVER ( ORDER BY ID ) AS NextWord
FROM   words;
6
Nick P

Verwenden Sie Join, um das erwartete Ergebnis für SQL Server 2005 plus zu erhalten.

    create table words (id integer, Word varchar(20));

    insert into words
    values
    (1 ,'my'),
    (2 ,'name'),
    (3 ,'is'),
    (4 ,'joseph'),
    (5 ,'and'),
    (6 ,'my'),
    (7 ,'father'),
    (8 ,'name'),
    (9 ,'is'),
    (10,'brian');

SELECT A.Id ,  C.Word AS PrevName , 
               A.Word AS CurName , 
               B.Word AS NxtName 
FROM words AS A
LEFT JOIN words AS B ON A.Id = B.Id - 1
LEFT JOIN words AS C ON A.Id = C.Id + 1
WHERE A.Word = 'name'

Ergebnis:

enter image description here

Fiddler Demo

3
Saravana Kumar

Versuche dies 

SELECT *
FROM   tablename a
WHERE  ID IN(SELECT ID - 1
             FROM   tablename 
             WHERE  Word = 'name') -- will fetch previous rows of Word `name` 
        OR ID IN(SELECT ID + 1
                 FROM   tablename 
                 WHERE  Word = 'name') -- will fetch next rows of Word `name`
        OR Word = 'name' -- to fetch the rows where Word = `name`
1

Hier ist ein anderer Ansatz, wenn Sie möchten, dass die Auswahl schnell ist. Es erfordert etwas Vorarbeit.

  • Erstellen Sie in der Datenbank eine neue Spalte (z. B. "Phrase"), die die gewünschten Wörter enthält. (d. h. der vorherige, der aktuelle und der nächste).

  • Schreiben Sie einen Auslöser, der beim Einfügen das neue Word an die vorherige Zeile der Zeile Anhängt und das Word der vorherigen Zeile an das Word der neuen Zeile anfügt und die Phrase Füllt.

  • Wenn sich die einzelnen Wörter ändern können, benötigen Sie beim Update einen Auslöser, um die Phrase synchron zu halten.

Dann wählen Sie einfach die Phrase aus. Sie erhalten eine viel höhere Geschwindigkeit, jedoch auf Kosten zusätzlicher Lagerung, langsamerer Einfügung und härterer Wartbarkeit. Offensichtlich müssen Sie die Phrasenspalte für die vorhandenen Datensätze aktualisieren, aber Sie haben die SQL, um dies in den anderen Antworten zu tun.

1
mlinth