将查询结果合并到重复的行中

时间:2018-06-20 15:08:35

标签: sql sql-server

-----------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

5 个答案:

答案 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';