выберите следующий порядок данных в таблице B, используя текущие данные в таблице A - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть две таблицы: таблица A и таблица B

таблица A

------------------------------
|      CD      |   stg_cd    |
------------------------------
|    APDN_82   |   CUSC      |
|    APDN_82   |   CUC       |
------------------------------

таблица B

------------------------------
|     stg_cd   |   srt_ordr  |
------------------------------
|    CUSC      |     1       |
|    KLD       |     3       |
|    CUC       |     2       |
------------------------------

Iя пытаюсь выбрать следующий порядок данных (например, CUC) в таблице B, используя текущие данные (например, CUSC) в таблице A

Мой ожидаемый результат должен быть похож на

------------------------------
|     CD       |   stg_cd    |
------------------------------
|    APDN_82   |     CUC     |
------------------------------

Это то, что я пытался

 (SELECT * FROM tableA AS A
            WHERE A.ID = 'APDN_82' AND A.stg_cd 
        IN (SELECT lead('CUSC') over (order by B.srt_ordr) from tableB AS B)

Но здесь я получил ошибку: 'lead' не является распознанным именем встроенной функции.Я пытался изменить уровень совместимости до 110, но у меня не было разрешения изменить его.Есть ли другой способ обойтись без использования свинца?

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Вы можете сделать как

SELECT CD,
       stg_cd2
FROM
    T1 JOIN
    (
      SELECT TB1.stg_cd stg_cd1,
             TB1.srt_ordr srt_ordr1,
             TB2.stg_cd stg_cd2,
             TB2.srt_ordr srt_ordr2
      FROM T2 TB1 JOIN T2 TB2
      ON TB1.srt_ordr + 1 = TB2.srt_ordr
    ) TT
ON T1.stg_cd = TT.stg_cd1
WHERE T1.stg_cd = 'CUSC'

Демо

0 голосов
/ 14 декабря 2018

Я бы написал так:

SELECT * 
      FROM TABLEA AS A
     WHERE A.ID = 'APDN_82' 
       AND A.STG_CD IN (SELECT STG_CD 
                          FROM TABLEB 
                         WHERE SRT_ORDR IN (SELECT B.SRT_ORDR + 1 
                                              FROM TABLEB AS B 
                                             WHERE B.STG_CD = 'CUSC'
                                            )
                        )
0 голосов
/ 14 декабря 2018

Возможно, вам нужно разделить на tablea.CD и найти следующую строку для каждого раздела.Для этого вы можете использовать ROW_NUMBER():

SELECT *
FROM (
    SELECT tablea.*, ROW_NUMBER() OVER (PARTITION BY tablea.CD ORDER BY tableb.srt_ordr) AS rn
    FROM tablea
    INNER JOIN tableb ON tablea.stg_cd = tableb.stg_cd
    WHERE tableb.srt_ordr > (SELECT srt_ordr FROM tableb WHERE stg_cd = 'CUSC')
)
AS x
WHERE rn = 1

Демонстрация на БД <> Fiddle

Или вы можете использовать коррелированный подзапрос:

SELECT *
FROM tablea
WHERE stg_cd = (
    SELECT TOP 1 stg_cd
    FROM tableb
    WHERE stg_cd IN (
        SELECT stg_cd
        FROM tablea AS x
        WHERE x.CD = tablea.CD
    )
    AND srt_ordr > (
        SELECT srt_ordr
        FROM tableb
        WHERE stg_cd = 'CUSC'
    )
)

Демонстрация на БД <> Fiddle

0 голосов
/ 14 декабря 2018

это будет работать:

select n.* from tableA n,(select * from tableB  where srt_ordr=(select srt_ordr from 
tableB where stg_cd='CUSC')+1)m  
where 
n.stg_cd=m.stg_cd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...