问题
can anyone please help: I tried to join with duplicate values but it is not coming as I wanted.
CREATE TABLE #TestTable1 ([No] varchar(50),[Value1] float,[Desc] varchar(50))
insert into #TestTable1 ([No],[Value1],[Desc])
Values
(N'123953',427.2,N'Basic Hours')
,(N'123953',106.8,N'Basic Hours')
,(N'123953',213.6,N'Basic Hours')
,(N'123953',213.6,N'Basic Hours')
,(N'123953',213.6,N'Basic Hours')
,(N'123953',213.6,N'Basic Hours')
,(N'123953',105.6,N'Basic Hours')
CREATE TABLE #TestTable2 ([No] varchar(50),[Value2] float,[Desc] varchar(50))
insert into #TestTable2 ([No],[Value2],[Desc])
Values
(N'123953',553.02,N'Basic Hours')
,(N'123953',446.67,N'Basic Hours')
,(N'123953',427.2,N'Basic Hours')
,(N'123953',106.8,N'Basic Hours')
,(N'123953',213.6,N'Basic Hours')
,(N'123953',213.6,N'Basic Hours')
,(N'123953',213.6,N'Basic Hours')
,(N'123953',105.6,N'Basic Hours')
Desired Output:
[No],[Desc],[Value1],[Value2]
(N'123953',N'Basic Hours',427.2,427.2)
,(N'123953',N'Basic Hours',106.8,106.8)
,(N'123953',N'Basic Hours',213.6,213.6)
,(N'123953',N'Basic Hours',213.6,213.6)
,(N'123953',N'Basic Hours',213.6,213.6)
,(N'123953',N'Basic Hours',213.6,NULL)
,(N'123953',N'Basic Hours',105.6,105.6)
Note: I can't join on Value field for other reasons.
I tried to use row_number() but still not coming as my desired output.
Thanks in advance.
回答1:
How does this look?
WITH Table1
AS
(
SELECT T1.No,
T1.[Desc],
T1.Value1,
CAST(T1.Value1 AS VARCHAR) + '~' + CAST(ROW_NUMBER() OVER (PARTITION BY T1.No, T1.Value1 ORDER BY T1.Value1 ASC) AS VARCHAR(2)) AS RN
FROM @TestTable1 AS T1
),
Table2
AS
(
SELECT T2.No,
T2.[Desc],
T2.Value2,
CAST(T2.Value2 AS VARCHAR) + '~' + CAST(ROW_NUMBER() OVER (PARTITION BY T2.No, T2.Value2 ORDER BY T2.Value2 ASC) AS VARCHAR(2)) AS RN
FROM @TestTable2 AS T2
)
SELECT T.No,
T.[Desc],
T.Value1,
T2.Value2
FROM Table1 AS T
LEFT
JOIN Table2 AS T2
ON T.No = T2.No
AND T.RN = T2.RN;
回答2:
Here is one way to get your desired output:
;WITH CTE1 AS
(
SELECT [No],
[Value1],
[Desc],
ROW_NUMBER() OVER(PARTITION BY [No], [Value1] ORDER BY @@SPID) As rn
FROM #TestTable1
), CTE2 AS
(
SELECT [No],
[Value2],
[Desc],
ROW_NUMBER() OVER(PARTITION BY [No], [Value2] ORDER BY @@SPID) As rn
FROM #TestTable2
)
SELECT C1.[No],
C1.[Desc],
C1.[Value1],
C2.[Value2]
FROM CTE1 AS C1
LEFT JOIN CTE2 AS C2
ON C1.[No] = C2.[No]
AND C1.rn = C2.rn
AND C1.[Value1] = C2.[Value2]
来源:https://stackoverflow.com/questions/53411502/sql-server-duplicate-joins-issue