Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 оператор IN - нуб нубит  [new]
maloun
Member

Откуда:
Сообщений: 9
Доброго времени суток. Помогите пожалуйста с решением следующей проблемы:
Хочу описать условие типа "ID IN ( ID_LIST )" но в ID_LIST указывать поле таблицы.
Выглядит это примерно так:
/* Создаем таблицу 1 */

DROP TABLE t1;
CREATE TABLE [dbo].[t1] (
[Id] int NOT NULL,
[Name] varchar(20) NOT NULL,
PRIMARY KEY (Id)
)
INSERT INTO [dbo].[t1] (Id,Name) VALUES (1,'Name1');
INSERT INTO [dbo].[t1] (Id,Name) VALUES (2,'Name2');
INSERT INTO [dbo].[t1] (Id,Name) VALUES (3,'Name3');
INSERT INTO [dbo].[t1] (Id,Name) VALUES (4,'Name4');
INSERT INTO [dbo].[t1] (Id,Name) VALUES (5,'Name4');

/* Создаем таблицу 2 */

DROP TABLE t2;
CREATE TABLE [dbo].[t2] (
[Id] int NOT NULL,
[SELECT_ID] int,
[SELECT_ID_LIST] varchar(20),
PRIMARY KEY (Id)
)
INSERT INTO [dbo].[t2] (Id,SELECT_ID,SELECT_ID_LIST) VALUES (1,'1','1,2,3');

/* Вопрос знатакам: */

SELECT t1.Name FROM t1 JOIN t2 ON t2.SELECT_ID IN ( t2.SELECT_ID_LIST )

При выполнении сего чуда, закономерно получаю ошибку:
"Ошибка преобразования значения varchar "1,2,3" в тип данных int."
26 ноя 15, 20:43    [18478338]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
MrVoid
Member

Откуда:
Сообщений: 333
SELECT t1.Name FROM t1 JOIN t2 ON t2.SELECT_ID IN (SELECT t2.SELECT_ID_LIST FROM dbo.t2)
26 ноя 15, 21:07    [18478420]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
maloun
Member

Откуда:
Сообщений: 9
автор
SELECT t2.SELECT_ID_LIST FROM dbo.t2

Не похоже на решение. И результат не поменялся. Пишет туже ошибку.
26 ноя 15, 21:15    [18478451]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
Хочу описать
Guest
maloun,

оно так не умеет
надо или распарсить и сложить в табличку
или делать вроде

where SELECT_ID_LIST  like '%,' + cast(SELECT_ID as varchar(10)) + ',%'

но надо сделать чтоб разделитель с обеих сторон был всегда (для простоты написания запроса)
26 ноя 15, 21:25    [18478491]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
maloun
Member

Откуда:
Сообщений: 9
автор
оно так не умеет
надо или распарсить и сложить в табличку


Я правильно понял что проблема в том что оператор IN в скобках
принимает какой-то другой тип, и этот тип "табличка" ?

И как\чем лучше парсить список ?
26 ноя 15, 21:33    [18478521]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
Хочу описать
Guest
maloun
автор
оно так не умеет
надо или распарсить и сложить в табличку


Я правильно понял что проблема в том что оператор IN в скобках
принимает какой-то другой тип, и этот тип "табличка" ?

И как\чем лучше парсить список ?

оператор IN описан в хелпе с примерами
примеров функций по разбитию строки в таблицу валом в гугле и здесь на форуме
26 ноя 15, 21:47    [18478581]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
maloun
Я правильно понял что проблема в том что оператор IN в скобках
принимает какой-то другой тип, и этот тип "табличка" ?
Проблема в том, что эту модель данных проектировал человек, не разбирающийся в компьютерах и в программировании.

Оператор поиска в множестве IN он планировал использовать для поиска в строке. Он бы ещё запланировал хранить списки ID в JPEG-картинках, и искать там с помощью IN :-)

Для определения отношений многие-ко-многим используют не табличку с строками [SELECT_ID_LIST] varchar(20), а классическую реализацию:
CREATE TABLE [dbo].[t2] (
    [SELECT_ID] int,
    [SELECT_ID_LIST] int,
    PRIMARY KEY ([SELECT_ID], [SELECT_ID_LIST])
)

Причём, перед тем, как делать такие таблички, желательно ещё почитать какие нибуть книжки.
26 ноя 15, 23:44    [18478952]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Хочу описать
maloun,

оно так не умеет
надо или распарсить и сложить в табличку
или делать вроде

where SELECT_ID_LIST  like '%,' + cast(SELECT_ID as varchar(10)) + ',%'

но надо сделать чтоб разделитель с обеих сторон был всегда (для простоты написания запроса)
Это неправильно. Тогда уж так:
where ','+SELECT_ID_LIST+','  like '%,' + cast(SELECT_ID as varchar(10)) + ',%'
27 ноя 15, 09:58    [18479940]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4422
А почему не
where SELECT_ID_LIST  like '%' + cast(SELECT_ID as varchar(10)) + '%'
27 ноя 15, 11:37    [18480505]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
SQL2008
А почему не
where SELECT_ID_LIST  like '%' + cast(SELECT_ID as varchar(10)) + '%'
В смысле, зачем запятые?
Что бы, если в SELECT_ID есть "1", не выбиралась из списка запись "...,234512345,..."
27 ноя 15, 11:40    [18480522]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4422
Сам спросил, сам ответил. Понятно почему
В Диасофте было так

INSERT INTO [dbo].[t2] (Id,SELECT_ID,SELECT_ID_LIST) VALUES (1,'1',';1;2;3;');

и

where SELECT_ID_LIST  like '%;' + cast(SELECT_ID as varchar(10)) + ';%'
27 ноя 15, 11:41    [18480523]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
maloun,

неправильно
/* Создаем таблицу 2 */

DROP TABLE t2;
CREATE TABLE [dbo].[t2] (
[Id] int NOT NULL,
[SELECT_ID] int,
[SELECT_ID_LIST] varchar(20),
PRIMARY KEY (Id)
)
INSERT INTO [dbo].[t2] (Id,SELECT_ID,SELECT_ID_LIST) VALUES (1,'1','1,2,3');

/* Вопрос знатакам: */

SELECT t1.Name FROM t1 JOIN t2 ON t2.SELECT_ID IN ( t2.SELECT_ID_LIST )


надо
/* Создаем таблицу 2 */

DROP TABLE t2;
CREATE TABLE [dbo].[t2] (
[Id] int NOT NULL,
[SELECT_ID] int,
[SELECT_ID_LIST] int,
PRIMARY KEY (Id)
)
INSERT INTO [dbo].[t2] (Id,SELECT_ID,SELECT_ID_LIST) VALUES (1,'1',1),(1,'1',2),(1,'1',3);

/* Вопрос знатакам: */

SELECT t1.Name FROM t1 WHERE EXISTS (SELECT * FROM [dbo].[t2] WHERE t2.SELECT_ID_LIST = t2.SELECT_ID)


Но в Вашем запросе нет никакого смысла, т.к. Вы не находите пересечение множеств. Вы выбираете множество А при условии, что множество Б не пустое.
27 ноя 15, 13:44    [18481383]     Ответить | Цитировать Сообщить модератору
 Re: оператор IN - нуб нубит  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
Владислав Колосов
Но в Вашем запросе нет никакого смысла, т.к. Вы не находите пересечение множеств. Вы выбираете множество А при условии, что множество Б не пустое.
У ТС в общем тоже не пересечение множеств, у него тоже фактически EXISTS.
Хотя это зависит от того, уникально ли поле [SELECT_ID], но по смыслу должно быть уникально.
27 ноя 15, 13:49    [18481424]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить