如果从左开始连接的行 table 为空,则使用另一行
If Row from left joined table is null use another row
我有两个 table 想加入(见下文)。每个都有我需要加入的相同的四列。第二个是完整列表,而第一个可能缺少一些记录。
缺少记录的地方我想使用与其他三个匹配的最低 ROWNUM
。我在这件事上看不到穿过树林的路。
DECLARE @TEMP AS TABLE
(
OCC_CODE VARCHAR(2),
ACCOUNTNO VARCHAR(36),
IMPNO NUMERIC(14,0),
TAX_YEAR NUMERIC(4,0),
ROWNUM NUMERIC(1,0)
)
INSERT INTO @TEMP
VALUES
('T1','A1',1,2018,1),
('T2','A1',1,2019,1),
('T3','A1',1,2020,1),
('T4','A1',1,2020,2),
('T5','A1',1,2021,1)
DECLARE @TEMP2 AS TABLE
(
SEG_ID NUMERIC(11,0),
ACCOUNTNO VARCHAR(36),
IMPNO NUMERIC(14,0),
TAX_YEAR NUMERIC(4,0),
ROWNUM NUMERIC(1,0)
)
INSERT INTO @TEMP2
VALUES
(1,'A1',1,2018,1),
(2,'A1',1,2019,1),
(3,'A1',1,2020,1),
(4,'A1',1,2021,1),
(5,'A1',1,2018,2),
(6,'A1',1,2019,2),
(7,'A1',1,2020,2),
(8,'A1',1,2021,2)
select TT.SEG_ID,TT.ACCOUNTNO,TT.IMPNO,TT.TAX_YEAR,oc.OCC_CODE
FROM @TEMP2 TT
left JOIN @TEMP OC
ON TT.ACCOUNTNO = OC.ACCOUNTNO
AND TT.IMPNO = OC.IMPNO
AND TT.TAX_YEAR = OC.TAX_YEAR
AND TT.ROWNUM = OC.ROWNUM
ORDER BY TAX_YEAR,SEG_ID
这个returns:
我试图在第 2 行中获取 T1
,在第 4 行中获取 T2
,在第 8 行中获取 T5
。
正如您在 TAX_YEAR
2020 中看到的那样,有时需要在 ROWNUM
上匹配不同的信息,因此我无法删除 AND TT.ROWNUM = OC.ROWNUM
如果我对你的理解正确,具有不等式条件的横向连接(或子查询)可以满足你的要求:
select
tt.seg_id,
tt.accountno,
tt.impno,
tt.tax_year,
oc.occ_code
from @temp2 tt
cross apply (
select top (1) oc.occ_code
from @temp oc
where
tt.accountno = oc.accountno
and tt.impno = oc.impno
and tt.tax_year = oc.tax_year
and tt.rownum >= oc.rownum
order by oc.rownum desc
) oc
order by tax_year,seg_id
基本上,横向连接搜索完全匹配,并返回到较小的 rownum
s 中的第一个匹配。
seg_id | accountno | impno | tax_year | occ_code
-----: | :-------- | ----: | -------: | :-------
1 | A1 | 1 | 2018 | T1
5 | A1 | 1 | 2018 | T1
2 | A1 | 1 | 2019 | T2
6 | A1 | 1 | 2019 | T2
3 | A1 | 1 | 2020 | T3
7 | A1 | 1 | 2020 | T4
4 | A1 | 1 | 2021 | T5
8 | A1 | 1 | 2021 | T5
我有两个 table 想加入(见下文)。每个都有我需要加入的相同的四列。第二个是完整列表,而第一个可能缺少一些记录。
缺少记录的地方我想使用与其他三个匹配的最低 ROWNUM
。我在这件事上看不到穿过树林的路。
DECLARE @TEMP AS TABLE
(
OCC_CODE VARCHAR(2),
ACCOUNTNO VARCHAR(36),
IMPNO NUMERIC(14,0),
TAX_YEAR NUMERIC(4,0),
ROWNUM NUMERIC(1,0)
)
INSERT INTO @TEMP
VALUES
('T1','A1',1,2018,1),
('T2','A1',1,2019,1),
('T3','A1',1,2020,1),
('T4','A1',1,2020,2),
('T5','A1',1,2021,1)
DECLARE @TEMP2 AS TABLE
(
SEG_ID NUMERIC(11,0),
ACCOUNTNO VARCHAR(36),
IMPNO NUMERIC(14,0),
TAX_YEAR NUMERIC(4,0),
ROWNUM NUMERIC(1,0)
)
INSERT INTO @TEMP2
VALUES
(1,'A1',1,2018,1),
(2,'A1',1,2019,1),
(3,'A1',1,2020,1),
(4,'A1',1,2021,1),
(5,'A1',1,2018,2),
(6,'A1',1,2019,2),
(7,'A1',1,2020,2),
(8,'A1',1,2021,2)
select TT.SEG_ID,TT.ACCOUNTNO,TT.IMPNO,TT.TAX_YEAR,oc.OCC_CODE
FROM @TEMP2 TT
left JOIN @TEMP OC
ON TT.ACCOUNTNO = OC.ACCOUNTNO
AND TT.IMPNO = OC.IMPNO
AND TT.TAX_YEAR = OC.TAX_YEAR
AND TT.ROWNUM = OC.ROWNUM
ORDER BY TAX_YEAR,SEG_ID
这个returns:
我试图在第 2 行中获取 T1
,在第 4 行中获取 T2
,在第 8 行中获取 T5
。
正如您在 TAX_YEAR
2020 中看到的那样,有时需要在 ROWNUM
上匹配不同的信息,因此我无法删除 AND TT.ROWNUM = OC.ROWNUM
如果我对你的理解正确,具有不等式条件的横向连接(或子查询)可以满足你的要求:
select
tt.seg_id,
tt.accountno,
tt.impno,
tt.tax_year,
oc.occ_code
from @temp2 tt
cross apply (
select top (1) oc.occ_code
from @temp oc
where
tt.accountno = oc.accountno
and tt.impno = oc.impno
and tt.tax_year = oc.tax_year
and tt.rownum >= oc.rownum
order by oc.rownum desc
) oc
order by tax_year,seg_id
基本上,横向连接搜索完全匹配,并返回到较小的 rownum
s 中的第一个匹配。
seg_id | accountno | impno | tax_year | occ_code -----: | :-------- | ----: | -------: | :------- 1 | A1 | 1 | 2018 | T1 5 | A1 | 1 | 2018 | T1 2 | A1 | 1 | 2019 | T2 6 | A1 | 1 | 2019 | T2 3 | A1 | 1 | 2020 | T3 7 | A1 | 1 | 2020 | T4 4 | A1 | 1 | 2021 | T5 8 | A1 | 1 | 2021 | T5