在SQL Server中使用Join获取一行中以逗号分隔的多个二进制图像
UserTable在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
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