복붙노트

[SQL] (WHERE) 조건으로 선택된 행에서 이전 및 다음 행을 가져옵니다

SQL

(WHERE) 조건으로 선택된 행에서 이전 및 다음 행을 가져옵니다

예를 들어 나는이 문이 :

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

이 문은이 테이블처럼 말씀으로 갈라진다 :

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

나는 각 단어의 이전 및 다음 단어를 얻으려면

예를 들어 내가 "이름"의 이전 및 다음 단어를 얻으려면 :

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

어떻게 이런 결과를 얻을 수 있을까?

해결법

  1. ==============================

    1.다음은 ANSI SQL 그래서 당신은 당신의 DBMS를 지정하지 않은 :

    다음은 ANSI SQL 그래서 당신은 당신의 DBMS를 지정하지 않은 :

    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

  2. ==============================

    2.왜 몸은 간단한 대답을하지 않았다?

    왜 몸은 간단한 대답을하지 않았다?

    SELECT LAG(word) OVER ( ORDER BY ID ) AS PreviousWord ,
           word ,
           LEAD(word) OVER ( ORDER BY ID ) AS NextWord
    FROM   words;
    
  3. ==============================

    3.서브 쿼리없이 :

    서브 쿼리없이 :

    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
    
  4. ==============================

    4.사용은 SQL Server 2005의 플러스에 대한 예상 결과를 얻을에 가입하세요.

    사용은 SQL Server 2005의 플러스에 대한 예상 결과를 얻을에 가입하세요.

        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'
    

    결과:

    피들러 데모

  5. ==============================

    5.이 시도

    이 시도

    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`
    
  6. ==============================

    6.당신은 선택이 빨리 되길 원한다면 여기에 다른 접근 방식이다. 그것은 준비 작업을 조금 걸립니다.

    당신은 선택이 빨리 되길 원한다면 여기에 다른 접근 방식이다. 그것은 준비 작업을 조금 걸립니다.

    그럼 그냥 문구를 선택합니다. 당신은 더 나은 속도를 얻을 수 있지만, 추가 저장 속도가 느린 삽입 어려워 유지 보수의 비용. 물론 기존 레코드에 대한 문구 열을 업데이트해야합니다,하지만 당신은 다른 답변에서 그렇게 할 수있는 SQL 있습니다.

  7. ==============================

    7.나는 내 말을 컬럼에 인덱스를 생성하고 신속하게 결과를 얻을이 코드를 설정합니다

    나는 내 말을 컬럼에 인덱스를 생성하고 신속하게 결과를 얻을이 코드를 설정합니다

    WITH CTE AS 
    (SELECT * FROM WordsTable WHERE word=N'Name')
    SELECT          
        t2.word AS previousWord,
        t1.word,
        t3.word AS nextWord
    FROM
        WordsTable AS t2,
        CTE AS t1,
        WordsTable AS t3
    WHERE
        (t2.ID + 1)= t1.ID AND
        (t3.ID - 1) = t1.ID
    
  8. from https://stackoverflow.com/questions/27086377/get-previous-and-next-row-from-rows-selected-with-where-conditions by cc-by-sa and MIT license