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

Откуда: Киев
Сообщений: 98
Здравствуйте!

Есть некий абстрактный код, прочитав который, надеюсь, вы поймёте, что именно мне нужно.

declare @arrayOfUserID unknown_type;
declare @arrayOfCityID unknown_type;

select @arrayOfUserID = userId, @arrayOfCityID = cityId from SomeTable where ...;

select country, state from CitiesTable where cityId in(@arrayOfCityID);


Объяснения:
unknown_type - я не знаю какой тип данных использовать для переменной, чтобы в неё поместить результат выборки(rows).

Общая идея: есть некая таблица SomeTable в которой, например, хранятся идентификаторы пользователей и идентификаторы городов для каждого пользователя. Вот мне нужно выбрать идентификаторы пользователей и городов из SomeTable, а затем еще выбрать полную информацию по каждому городу из таблицы CitiesTable. Как это осуществить?

Повторяю еще раз, что приведена абстрактная информация - вместо городов и пользователей могли бы быть яблоки и бананы, поэтому не акцентируйте на этом внимание.

Спасибо.

Роман.
19 апр 13, 17:00    [14205498]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
roman_lenko
unknown_type - я не знаю какой тип данных использовать для переменной, чтобы в неё поместить результат выборки(rows)
табличный тип
19 апр 13, 17:03    [14205525]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
CitiesTable ct join SomeTable st on ct.cityID = ct.cityID
19 апр 13, 17:05    [14205545]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Мистер Хенки
CitiesTable ct join SomeTable st on ct.cityID = ct.cityID
and where ...


условие фильтрующее на SomeTable
19 апр 13, 17:07    [14205564]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Паганель
табличный тип


Напишите, пожалуйста, как его правильно объявить. Я использую следующий код:

declare @arrayOfUserID table(userId int not null);
declare @arrayOfCityID table(cityId int not null);


После чего, после того как пытаюсь исполнить код ...

select @arrayOfUserID = userId, @arrayOfCityID = cityId from SomeTable where ...;


... второй раз, получаю ошибку о том, что OBJECT #arrayOfUserID и OBJECT #arrayOfCityID ALREADY EXISTS - т.е. они НЕ удаляются после их использования. Как их удалить? - они нужны только на время исполнения скрипта, т.к., являются временными. Понятно, что, можно прописать вконце drop table #arrayOfUserID, drop table #arrayOfCityID, но, что если параллельно выполняются несколько скриптов использующих эти же имена таблиц? - в общем я тут "плаваю".

Мистер Хенки
CitiesTable ct join SomeTable st on ct.cityID = ct.cityID


Ок. Тогда мне нужно сделать:

#arrayOfCityID ct join CitiesTable ct on ct.cityID = ct.cityID


???
19 апр 13, 17:13    [14205619]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
roman_lenko
После чего, после того как пытаюсь исполнить код ...

select @arrayOfUserID = userId, @arrayOfCityID = cityId from SomeTable where ...;

Если вы так хотите добавить записи в таблицу, то это делается командой INSERT
19 апр 13, 17:16    [14205634]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
roman_lenko
Напишите, пожалуйста, как его правильно объявить
http://msdn.microsoft.com/en-us/library/ms188927.aspx
roman_lenko
получаю ошибку о том, что OBJECT #arrayOfUserID и OBJECT #arrayOfCityID ALREADY EXISTS
это не про переменные
это про таблицы
19 апр 13, 17:19    [14205653]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Glory
Если вы так хотите добавить записи в таблицу, то это делается командой INSERT


Да - я хочу добавить данные в эти 2 временные таблицы. И более того, хочу, чтобы они автоматически удалились после исполнения скрипта. Могли бы Вы показать пример?

Извиняюсь за странные вопросы: с алгоритмом у меня все нормально, но я очень "плаваю" в сложных SQL-запросах, особенно в которых требуются, также, и временные таблицы.
19 апр 13, 17:19    [14205659]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
у меня тоже такое чувство, что выполнить Вашу задачу можно 1 запросом

приведите, пожалуйста, пример тестовых данных и желаемого результата
19 апр 13, 17:25    [14205698]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
roman_lenko
Да - я хочу добавить данные в эти 2 временные таблицы. И более того, хочу, чтобы они автоматически удалились после исполнения скрипта. Могли бы Вы показать пример?

Команда INSERT - куча примеров в хелпе
Локальные переменные и так живут только в пакете, в котором объявлены
19 апр 13, 17:25    [14205699]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Все - временные таблицы я научился создавать - только, что почитал мануалы.

Попробую реализовать теперь на практике вариант с JOIN'ом.

Спасибо!
19 апр 13, 17:26    [14205701]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
roman_lenko
Мистер Хенки
CitiesTable ct join SomeTable st on ct.cityID = ct.cityID


Ок. Тогда мне нужно сделать:

#arrayOfCityID ct join CitiesTable [b]ct2[/b] on ct.cityID = [b]ct2[/b].cityID


А лучше
CitiesTable ct join SomeTable st on ct.cityID = st.cityID and условие на SomeTable 
тогда не надо тратиться на вставку во временную таблицу или табличную переменную

???
19 апр 13, 17:31    [14205742]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Мистер Хенки
А лучше
CitiesTable ct join SomeTable st on ct.cityID = st.cityID and условие на SomeTable 

тогда не надо тратиться на вставку во временную таблицу или табличную переменную


Значит, я сделал следующим образом(слегка упрощенный код).

-- Объявляем временную таблицу для хранения результатов.
declare @results table(userId int, cityID int, cityCountry varchar, cityZIPCode varchar);

-- Выбираем во временную таблицу подходящие по условию идентификаторы юзеров и городов.
insert into @results(userId, cityId) select userId, cityId from SomeTable where ... ;

-- Далее обновляем во временной таблице поля cityCountry и cityZIPCode,
-- значения для которых берутся после операции JOIN'а между соответствующими таблицами.
update @results set
  cityCountry = cityCountry,
  cityZIPCode = cityZIPCode
from CitiesTable ct join @results r on ct.cityId = @results.cityId;


Что скажете? - какие-то косяки я наделал? - проблемы с быстродействием?
19 апр 13, 17:52    [14205923]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
roman_lenko,

insert into @results(userId, cityId, cityCountry, cityZIPCode)
select
 st.userId, st.cityId, ct.cityCountry, ct.cityZIPCode
from
 SomeTable st join
 CitiesTable ct on ct.cityId = st.cityId
where
 ...;
19 апр 13, 17:56    [14205953]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
roman_lenko


Что скажете? - какие-то косяки я наделал? - проблемы с быстродействием?

insert into @results(userId , cityID , cityCountry , cityZIPCode)
select st.userId, st.cityId ,ct.cityCountry,ct.cityZIPCode
from	SomeTable st
		inner join CitiesTable ct 
		on ct.cityID = st.cityID
where ...
19 апр 13, 17:59    [14205966]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Ребят, вы звери - спасибо! :) В жизни бы сам не додумал все в таких деталях.
19 апр 13, 18:28    [14206127]     Ответить | Цитировать Сообщить модератору
 Re: Выборка IN из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
roman_lenko,

только не называйте больше табличные переменные временными таблицами. :))
Это разные понятия.
19 апр 13, 19:10    [14206299]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить