搜索该表的整列中的关键字

时间:2014-09-17 08:34:57

标签: sql sql-server

我有两张桌子。

  

用户表

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 ..

2 个答案:

答案 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表中唯一缺少的数据。

Sample SQL Fiddle

我根据KM调整了this answer的答案。相信应得的人。