-----------tblDListTest---------
id listid trackingcode
1 125 trc1
2 125 trc1
3 125 trc1
4 126 trc4
5 126 trc5
---------------------------------
---------tblTrcWeightTest----------
id weight trackingcode
1 20 trc1
2 30 trc1
3 40 trc1
4 50 trc4
5 70 trc5
需要显示跟踪代码及其权重。 在tblDListTest中,针对listid 125有3条记录。 我只想显示3条重量记录。
我正在使用查询:
set transaction isolation level read uncommitted
select DL.id, DL.listid, DL.trackingcode, tw.weight
from tblDListTest DL
inner join tblTrcWeightTest tw on DL.trackingcode = tw.trackingcode
where DL.listid = 125
我的查询结果:
id listid trackingcode weight
1 125 trc1 20
1 125 trc1 30
1 125 trc1 40
2 125 trc1 20
2 125 trc1 30
2 125 trc1 40
3 125 trc1 20
3 125 trc1 30
3 125 trc1 40
但是我要跟踪结果。
id listid trackingcode weight
1 125 trc1 20
2 125 trc1 30
3 125 trc1 40
答案 0 :(得分:0)
您需要在其中一张表中使用唯一键(任何产生唯一值的字段组合)。
在您的示例中,trc1
在每个表中出现3次。
SQL不知道要联接这些数据,因此,它将产生可能组合的笛卡尔积。
如果在联接中不能使用唯一值,则可以使用SELECT DISTINCT DL.id, DL.listid, DL.trackingcode, tw.weight ....
答案 1 :(得分:0)
您的表之间有重复项。您可能希望看到这样的内容:
;WITH DL (id, listid, trackingcode) AS (
SELECT CONVERT(int, id), listid, trackingcode FROM (
VALUES
('1','125','trc1'),
('2','125','trc1'),
('3','125','trc1'),
('4','126','trc4'),
('5','126','trc5')
) AS A (id, listid, trackingcode)
),
tw (id, weight, trackingcode) AS (
SELECT CONVERT(int, id), weight, trackingcode FROM (
VALUES
('1','20','trc1'),
('2','30','trc1'),
('3','40','trc1'),
('4','50','trc4'),
('5','70','trc5')
) AS A (id, weight, trackingcode)
)
SELECT DISTINCT DL.listid,
DL.trackingcode,
tw.weight
FROM DL
INNER JOIN tw ON DL.trackingcode = tw.trackingcode
WHERE DL.listid = 125
答案 2 :(得分:0)
您可以使用row_number()
枚举值,然后将其用于join
:
select dl.id, dl.listid, dl.trackingcode, tw.weight
from (select dl.*, row_number() over (partition by trackingcode order by id) as seqnum
from tblDListTest dl
) dl inner join
(select tw.*, row_number() over (partition by trackingcode order by id) as seqnum
from tblTrcWeightTest tw
) tw
on dl.trackingcode = tw.trackingcode and dl.seqnum = tw.seqnum
where dl.listid = 125;
答案 3 :(得分:0)
您可以只使用类似这样的东西。
DECLARE @tblDListTest table (
ID INT,
listid INT,
trackingcode VARCHAR(20)
)
DECLARE @tblTrcWeightTest table (
ID INT,
weight INT,
trackingcode VARCHAR(20)
)
INSERT INTO @tblDListTest (ID,listid,trackingcode)
VALUES (1, 125, 'trc1'),
(2, 125, 'trc1'),
(3, 125, 'trc1'),
(4, 126, 'trc4'),
(5, 126, 'trc5')
INSERT INTO @tblTrcWeightTest (ID,weight,trackingcode)
VALUES (1, 20, 'trc1'),
(2, 30, 'trc1'),
(3, 40, 'trc1'),
(4, 50, 'trc4'),
(5, 70, 'trc5')
SELECT A.ID, A.listid, A.trackingcode, B.weight
FROM @tblDListTest A
JOIN @tblTrcWeightTest B ON B.ID = A.ID
WHERE A.listid = 125
答案 4 :(得分:0)
您可以使用subquery
:
select twt.id, tt.listid, twt.trackingcode, twt.weight
from tblTrcWeightTest twt cross apply (
select top 1 tdt.listid
from tblDListTest tdt
where tdt.trackingcode = twt.trackingcode
) tt
where twt.trackingcode = 'trc1';