select表中的下一个数据顺序使用tableAU中的当前数据
select the next order of data in tableB using current data in tableA
我有两个表:tableA 和 tableB
表A
------------------------------
| CD | stg_cd |
------------------------------
| APDN_82 | CUSC |
| APDN_82 | CUC |
------------------------------
表B
------------------------------
| stg_cd | srt_ordr |
------------------------------
| CUSC | 1 |
| KLD | 3 |
| CUC | 2 |
------------------------------
我正在尝试 select 使用表 A 中的当前数据(即 CUSC)select 表 B 中的下一个数据顺序(即 CUC)
我的预期结果应该是这样的
------------------------------
| 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,但我没有更改它的权限。
有没有其他不用铅的方法?
这会起作用:
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
我会这样写:
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'
)
)
您可能需要按 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
或者您可以使用相关子查询:
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'
)
)
你可以这样做
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'
我有两个表:tableA 和 tableB
表A
------------------------------
| CD | stg_cd |
------------------------------
| APDN_82 | CUSC |
| APDN_82 | CUC |
------------------------------
表B
------------------------------
| stg_cd | srt_ordr |
------------------------------
| CUSC | 1 |
| KLD | 3 |
| CUC | 2 |
------------------------------
我正在尝试 select 使用表 A 中的当前数据(即 CUSC)select 表 B 中的下一个数据顺序(即 CUC)
我的预期结果应该是这样的
------------------------------
| 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,但我没有更改它的权限。 有没有其他不用铅的方法?
这会起作用:
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
我会这样写:
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'
)
)
您可能需要按 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
或者您可以使用相关子查询:
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'
)
)
你可以这样做
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'