2014-09-17 2 views
1

У меня есть две таблицы.Поиск ключевого слова во всем столбце этой таблицы

стол пользователя

UserId Username 
1   User1 
2   User2 
3   User3 
4   User4 
17   User17 
18   User18 
20   User20 

И еще один

таблицы Customer Support-

CSid Userslist 
1  1,3 
2  2 
3  20,17,18 

Как я могу получить UserIds на вкладке User le нет в таблице поддержки клиентов.

+0

Почему вы храните несколько значений в одном столбце? – jpw

+1

Я бы предложил начать с нормализации базы данных и избавления от значений, разделенных запятыми, в любом поле. Тогда ваш вопрос будет очень легко ответить. – oerkelens

+0

@ jpw: Спасибо за ответ. Это старший db .. У этого уже есть миллионы записей в этой таблице. Поэтому я не могу изменить структуры таблиц сейчас. :( –

ответ

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

Я приспособил свой ответ от this answer по КМ. Благодарите того, кто этого заслуживает.

+0

спасибо, тонна .. !! –

+0

Интересно, как ваш ответ очень четко показывает, как самая большая и сложная часть связана с укрощением модели данных, а затем небольшой, простой и быстрый запрос в конце концов - это то, что на самом деле получает желаемый ответ из выясненного mess :) – oerkelens

+0

@oerkelens Я согласен, что проблема с ошибочной моделью - сложная часть, но иногда нам просто нужно играть с картами, которые мы получили;) – jpw

3

Вопрос отвечает текущей модели данных, но это большая работа, сложность и полная трата времени.

Однако, с разумной моделью данных, это очень простой вопрос, поэтому я отвечу на него такой моделью.

Мы удалите поле UsersList из вашей таблицы поддержки клиентов. Его никогда не должно быть никогда.. Нет, действительно, никогда.

Теперь, если предположить, что, как показывает пример ваших данных, каждый пользователь может иметь один CSID, мы добавить поле 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; 

Ваш вопрос является очень хорошим примером почему стоит подумать о своей модели данных, прежде чем испортить ее. Ваш запрос extreme простой, если ваша модель данных имеет смысл.

+0

Great Ответ OP должен нормализовать его данные. – Edward

+0

_it - это много работы, сложной и чистой траты времени. Я не согласен. – jpw

+0

Спасибо за ответ. Я буду помнить об этом. !! –

Смежные вопросы