我有两张桌子。
用户表
UserId Username
1 User1
2 User2
3 User3
4 User4
17 User17
18 User18
20 User20
还有一个
客户支持表
CSid Userslist
1 1,3
2 2
3 20,17,18
如何才能在客户支持表中显示用户表的用户ID ..
答案 0 :(得分:3)
这个问题与目前的数据模型有关,但这是一项繁重的工作,很复杂,而且浪费时间。
然而,使用合理的数据模型,这是一个非常简单的问题,所以我将用这样的模型来回答它。
我们从您的客户支持表中删除 UsersList
字段。 永远不应该永远不会在那里。不,真的,从不。
现在,假设您的示例数据显示每个用户都可以拥有一个CSid ,我们会将<{strong>>字段CSid
添加到您的用户表中。这称为外键。因为,正如您所提到的,并非所有用户都链接到CS表,因此您需要确保该字段允许NULL
值。
现在我们填写数据:
用户表
UserId Username CSid
1 User1 1
2 User2 2
3 User3 1
4 User4 NULL
17 User17 3
18 User18 3
20 User20 3
现在,回答你的问题:
SELECT * FROM UserTable WHERE CSid IS NULL;
您的问题是一个非常好的例子,为什么在弄乱它之前考虑一下您的数据模型是值得的。您的查询非常简单,如果您的数据模型有意义。
答案 1 :(得分:3)
使用递归公用表表达式来拆分值应该这样做:
;WITH Split AS
(
SELECT
LEFT(Userslist,CHARINDEX(',',Userslist)-1) AS Userslist
,RIGHT(Userslist,LEN(Userslist)-CHARINDEX(',',Userslist)) AS Remainder
FROM CustomerSupport
WHERE Userslist IS NOT NULL AND CHARINDEX(',',Userslist)>0
UNION ALL
SELECT
Userslist AS Userslist, NULL AS Remainder
FROM CustomerSupport
WHERE Userslist IS NOT NULL AND CHARINDEX(',',Userslist)=0
UNION ALL
SELECT
LEFT(Remainder,CHARINDEX(',',Remainder)-1)
,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(',',Remainder))
FROM Split
WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)>0
UNION ALL
SELECT
Remainder,null
FROM Split
WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)=0
)
SELECT * FROM Users
WHERE UserId NOT IN (
SELECT Userslist FROM Split)
查询将为您的示例数据返回User4
,因为它是CustomerSupport表中唯一缺少的数据。
我根据KM调整了this answer的答案。相信应得的人。