首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左连接表A和表B

问左连接表A和表B
EN

Stack Overflow用户
提问于 2018-08-01 23:12:04
回答 1查看 499关注 0票数 3

我有两张桌子。

Table_A:

代码语言:javascript
复制
  Doc_No |  BUCKET  |DPD
  ---------------
  21     |M1        |11 
  22     |M1        |11
  23     |M1        |15
  24     |M1        |19
  25     |M1        |13
  26     |M1        |18
  27     |M1        |12

Table_B:

代码语言:javascript
复制
  BUCKET    |USER1
  -----------------
  M1        |David
  M1        |Tom
  M1        |Kirby

我想要得到下面表格形式的结果(DPD是按a-z排序的)

代码语言:javascript
复制
 Doc_No  |BUCKET    |DPD     |USER1
  --------------------------
 21      |M1        |11      |David
 22      |M1        |11      |Tom
 27      |M1        |12      |Kirby
 25      |M1        |13      |David
 23      |M1        |15      |Tom
 26      |M1        |18      |Kirby
 24      |M1        |19      |David

我不知道如何通过使用"normal“左连接来消除冗余行,如下所示

代码语言:javascript
复制
    with a1 as
    (
        select *
            ,row_number() OVER (ORDER BY dpd) AS RowNum
        from TABLE_A
    )

SELECT * 
FROM a1 left join TABLE_B b on a1.BUCKET = b.BUCKET

我用过"Google“,但我没有找到任何这样的例子。

任何帮助都将不胜感激。(对不起,我的英语不好)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-01 23:24:04

它没有得到您想要的逻辑,因为您的表Table_B除了User1之外没有任何东西可供排序,因此Kirby和Tom的顺序颠倒了。如果顺序必须是David、Tom、Kirby,则需要引入另一个列来提供排序。(可能是IDENTITY或FIFO列)

无论如何,这应该会让你(大部分)达到这个目标:

代码语言:javascript
复制
USE Sandbox;
GO

CREATE TABLE dbo.TableA (Bucket char(2), DPD tinyint);
CREATE TABLE dbo.TableB (Bucket char(2), User1 varchar(5));
INSERT INTO dbo.TableA (Bucket,
                        DPD)
VALUES ('M1',11), 
       ('M1',11),
       ('M1',15),
       ('M1',19),
       ('M1',13),
       ('M1',18),
       ('M1',12);

INSERT INTO dbo.TableB (Bucket,
                        User1)
VALUES ('M1','David'),
       ('M1','Tom'),
       ('M1','Kirby');
GO
WITH Sizes AS(
    SELECT Bucket, COUNT(*) AS Users
    FROM dbo.TableB
    GROUP BY Bucket),
FIFO AS (
    SELECT A.*,
           --ROW_NUMBER() OVER (PARTITION BY A.Bucket ORDER BY DPD) AS RN, --Not actually needed
           ((ROW_NUMBER() OVER (PARTITION BY A.Bucket ORDER BY DPD) -1) % S.Users)+1 AS UserRN
    FROM dbo.TableA A
         JOIN Sizes S ON A.Bucket = S.Bucket),
Users AS(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY B.Bucket ORDER BY B.User1) AS RN
    FROM dbo.TableB B)
SELECT F.Bucket, F.DPD, U.User1
FROM FIFO F
     JOIN Users U ON F.UserRN = U.RN;

GO

DROP TABLE dbo.TableA;
DROP TABLE dbo.TableB;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51636809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档