在SQL Server中使用Join获取一行中以逗号分隔的多个二进制图像

在SQL Server中使用Join获取一行中以逗号分隔的多个二进制图像,sql,sql-server,database,Sql,Sql Server,Database,UserTable ID | Name |Code ---+------+----- 1 | ABC |ZADD 2 | DGF |TRTR 3 | CDR |HJIU 4 | QMD |LOPR IID | UserID |BinaryImg ---+--------+----- --- 1 | 2 | 0X984597909 2 | 2 | 0X334593393 3 | 4 | 09845933543 4 | 4

UserTable

ID | Name |Code
---+------+-----
 1 | ABC  |ZADD
 2 | DGF  |TRTR
 3 | CDR  |HJIU   
 4 | QMD  |LOPR
IID | UserID |BinaryImg
---+--------+----- ---
 1 | 2      | 0X984597909
 2 | 2      | 0X334593393
 3 | 4      | 09845933543  
 4 | 4      | 0X379426937
 5 | 4      | 0X334589433
UserImagesTable

ID | Name |Code
---+------+-----
 1 | ABC  |ZADD
 2 | DGF  |TRTR
 3 | CDR  |HJIU   
 4 | QMD  |LOPR
IID | UserID |BinaryImg
---+--------+----- ---
 1 | 2      | 0X984597909
 2 | 2      | 0X334593393
 3 | 4      | 09845933543  
 4 | 4      | 0X379426937
 5 | 4      | 0X334589433
我正在尝试使用join从两个表中获取数据,join工作正常,但它复制了FK id。我只想返回用户一次,但该用户映像要多次返回,这与UserImages表中的UserId相反。我希望这是有道理的

我尝试过这样做,但此查询未返回预期结果:

SELECT User.ID, User.Name, UserImage.BinaryImg 
FROM User 
INNER JOIN UserImages ON User.ID = UserImages.UserID
我想要的预期结果是这样的。我希望您理解,我正在使用SQL Server 2017

UID | Name | BinaryImg
----+------+--------------------------------------
 2  | DGF  | 0X984597909,0X334593393
 4  | QMD  | 0X379426937,0X334589433,09845933543

以下任一项都将产生所需的结果

    IF OBJECT_ID('tempdb..#UserTable', 'U') IS NOT NULL 
     BEGIN DROP TABLE #UserTable; END;
     
     CREATE TABLE #UserTable (
        ID int NOT NULL,
        Name char(3) NOT NULL,
        Code char(4) NOT NULL 
        );
     INSERT #UserTable(ID, Name, Code) VALUES
     (1, 'ABC', 'ZADD'),
     (2, 'DGF', 'TRTR'),
     (3, 'CDR', 'HJIU'),   
     (4, 'QMD', 'LOPR');
    
     IF OBJECT_ID('tempdb..#UserImagesTable', 'U') IS NOT NULL 
     BEGIN DROP TABLE #UserImagesTable; END;
     
     CREATE TABLE #UserImagesTable (
        IID int NOT NULL,
        UserID int NOT NULL,
        BinaryImg binary(5) NOT NULL 
        );
     INSERT #UserImagesTable(IID, UserID, BinaryImg) VALUES
     (1, 2, 0x984597909),
     (2, 2, 0x334593393),
     (3, 4, 0x845933543),  
     (4, 4, 0x379426937),
     (5, 4, 0x334589433);
    
     ---------------------------------------------------------------------------------------
    
 -- Option 1...
 SELECT 
    ut.ID,
    ut.Name,
    img_array = STRING_AGG(CONVERT(varchar(10), uit.BinaryImg, 1), ', ') WITHIN GROUP (ORDER BY uit.IID ASC)
 FROM
    #UserTable ut
    JOIN #UserImagesTable uit
        ON ut.ID = uit.UserID
GROUP BY
    ut.ID,
    ut.Name;

-- Option 2...
SELECT 
    ut.ID,
    ut.Name,
    i.img_array
FROM
    #UserTable ut
    CROSS APPLY (
        SELECT 
            img_array = STRING_AGG(CONVERT(varchar(10), uit.BinaryImg, 1), ', ') WITHIN GROUP (ORDER BY uit.IID ASC)
        FROM
            #UserImagesTable uit
        WHERE 
            ut.ID = uit.UserID
        GROUP BY
            uit.UserID
        ) i;
结果

ID          Name img_array
----------- ---- ----------------------------------
2           DGF  0x09845979, 0x03345933
4           QMD  0x08459335, 0x03794269, 0x03345894


(1 row affected)
ID          Name img_array
----------- ---- ----------------------------------
2           DGF  0x09845979, 0x03345933
4           QMD  0x08459335, 0x03794269, 0x03345894

这似乎是一个XY问题。返回二进制值作为分隔列表(这意味着它们不再是二进制值,它们是
varchar
)是一个坏主意。您在这里实际想要实现什么?然后将它们作为多行返回,然后让应用程序遍历返回的数据集。不,也为特定用户返回多行。不要给它们划界,那只会让事情变得更难,而不是更容易。你的查询应该已经返回了你真正需要的数据集。除此之外,
USER
是一个保留字,因此来自USER的
将出错。我建议修复将您的表重命名为非保留关键字的问题。
User
。恐怕我没有更多要添加的内容,Shakir。
STRING\u AGG
不是内置的Function@AsifShakir... 您说过您使用的是SQL Server 2017任何解决方案,而不是
STRING\u AGG
?没有比STRING\u AGG()更直接、更简单的解决方案了。。。但是是的,对于XML路径(“”)也是有效的。您使用的是什么版本的SQL Server?我使用的是SQL Server 2015