簡體   English   中英

SQL 選擇內連接 2 列

[英]SQL Select inner join 2 columns

我有一些表,我們稱它們為表UserManagement

ID  Username Position
1   Bryan    Client
2   Frey     Client
3   Will     Vendor
4   Anne     Vendor
5   Belle    Vendor

這是表Mailbox

ID  FromUser ToUser           Message
1   Bryan    Will,Anne,Belle  Hai
2   Anne     Bryan,Frey       Hello

我一直在嘗試這個:

select * from Mailbox t
inner join (select Username from UserManagement where Position = 'Client' group by Username)um
on t.ToUser = um.Username

但它的工作時,列ToUser只包含用戶名Bryan或者Frey不與Bryan,Frey如何解決,當列ToUser包含用戶名像Bryan,Frey

這是一個查詢,它從“mb_split_cte”CTE 的郵箱表中拆分 ToUser 列。 然后它連接到用戶名上的 UserManagement 表。 然后它從郵箱表中返回 ToUsers 的管理職位。

數據

DECLARE @Mailbox TABLE(ID int identity(1,1),
                       FromUser varchar(150),
                       ToUser varchar(150),
                       [Message] varchar(250));

INSERT INTO @Mailbox(FromUser, ToUser, [Message])
VALUES('Bryan', 'Will,Anne,Belle', 'Hai'),
('Anne', 'Bryan,Frey', 'Hello');

DECLARE @UserManagement TABLE(ID int identity(1,1),
                       Username varchar(150),
                       Position varchar(150));

INSERT INTO @UserManagement(Username, Position) VALUES
('Bryan', 'Client'),
('Frey', 'Client'),
('Will', 'Vendor'),
('Anne', 'Vendor'),
('Belle', 'Vendor');

詢問

;with mb_split_cte(ID, FromUser, ToUser, [Message]) as (
    select ID, FromUser, sp.[value], [Message]
    from @Mailbox m
         cross apply string_split(m.ToUser, ',') sp)
select msc.*, um.Position as ToUserPosition
from mb_split_cte msc
     join @UserManagement um on msc.ToUser=um.Username;

輸出

ID  FromUser    ToUser  Message ToUserPosition
1   Bryan       Will    Hai     Vendor
1   Bryan       Anne    Hai     Vendor
1   Bryan       Belle   Hai     Vendor
2   Anne        Bryan   Hello   Client
2   Anne        Frey    Hello   Client

首先,請閱讀 Dan 對您的問題的 Guzman 評論。 他推薦使用STRING_SPLIT 函數,非常好,但該函數在 MS SQL Server 2014 及更早版本中不可用。 請參閱: 兼容級別

要按每個ToUserMailbox數據按逗號拆分為行,您可以使用CTE 看:

DECLARE @Mailbox TABLE(ID int identity(1,1),  FromUser varchar(150),  ToUser varchar(150), [Message] varchar(250))
INSERT INTO @Mailbox(FromUser, ToUser, [Message])
VALUES('Bryan', 'Will,Anne,Belle', 'Hai'),
('Anne', 'Bryan,Frey', 'Hello')

;WITH CTE AS 
(
    --initial query
    SELECT ID, FromUser, LEFT(ToUser, CHARINDEX(',', ToUser)-1) ToUser, RIGHT(ToUser, LEN(ToUser) - CHARINDEX(',', ToUser)) remainder,  [Message]
    FROM @Mailbox
    WHERE CHARINDEX(',', ToUser)>0
    --recursive part
    UNION ALL
    SELECT ID, FromUser, LEFT(remainder, CHARINDEX(',', remainder)-1) ToUser, RIGHT(remainder, LEN(remainder) - CHARINDEX(',', remainder)) remainder,  [Message]
    FROM CTE
    WHERE CHARINDEX(',', remainder)>0
    UNION ALL
    SELECT ID, FromUser, remainder ToUser, NULL remainder,  [Message]
    FROM CTE
    WHERE CHARINDEX(',', remainder)=0
)
SELECT ID, FromUser, ToUser, [Message]
FROM CTE 
ORDER BY ID 

上面的查詢產生:

ID  FromUser    ToUser  Message
1   Bryan   Will    Hai
1   Bryan   Anne    Hai
1   Bryan   Belle   Hai
2   Anne    Bryan   Hello
2   Anne    Frey    Hello

我已經使用了你的 SQL 代碼並稍微修改了它。 你為什么不試試呢?

select * from Mailbox t
inner join (select Username from UserManagement where Position = 'Vendor' group by Username)um
on t.ToUser like '%'+um.Username

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM