Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
Добрый день всем!
Прошу прощения за такой тривиальный вопрос. Готова буду понести заслуженное наказанье.
Искать долго очень, а нужно задачку решить побыстрее.
Суть вот в чем.
Есть некий входной список, представляющий собой набор числовых значений, к примеру:

2390392003
3058123103
1436999303
49060516
641587016
663744216
1930344203
1450619903

Необходимо сделать выборку из таблицы в базе данных. На основе этого списка & все значения из таблицы, где некое поле "уровень начальника" < 10.
одиночный-то запрос я кое-ка смогу сделать, а вот обработать таблицу на основе этих входных данных...
12 янв 11, 11:07    [10058000]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
SvetlanaNikit
Есть некий входной список

входной куда и в каком виде (файл, строка или просто руками в ssms напечатали)?
12 янв 11, 11:10    [10058023]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
Дедушка
входной куда и в каком виде (файл, строка или просто руками в ssms напечатали)?

да, прошу прощения: этот входной список хранится в тестовом файле.

вот так:

[IMG]http://s2.ipicture.ru/uploads/20110112/thumbs/RNqUC9Xb.jpg[/IMG]
12 янв 11, 11:13    [10058058]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
проходящий.
Guest
SvetlanaNikit
одиночный-то запрос я кое-ка смогу сделать, а вот обработать таблицу на основе этих входных данных...
Простите, но непонятно, что такое одиночный запрос и чем он отличается от неодиночного. Еще непонятна связь количества запросов и возможностей обработки таблицы.
12 янв 11, 11:14    [10058064]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SvetlanaNikit
Дедушка
входной куда и в каком виде (файл, строка или просто руками в ssms напечатали)?

да, прошу прощения: этот входной список хранится в тестовом файле.
варианты: insert bulk, SSIS, openrowset bulk, bcp
12 янв 11, 11:22    [10058119]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
проходящий.
SvetlanaNikit
одиночный-то запрос я кое-ка смогу сделать, а вот обработать таблицу на основе этих входных данных...
Простите, но непонятно, что такое одиночный запрос и чем он отличается от неодиночного. Еще непонятна связь количества запросов и возможностей обработки таблицы.

прошу прощения, постараюсь исправиться :)

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

select subjname from orgtable where rank < 10

а мне нужно в итоге получить все записи из таблицы, которые соответствуют условию rank < 10 И условию что поле workID (к примеру так назвала это поле) равно строке из списка.
Т.е. беру следующую запись из таблицы, проверяю ее на соответствие условию rank < 10 а также проверяю ее на то, что поле workID содержит значение, равное записи в списке.
12 янв 11, 11:22    [10058124]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
_djХомяГ
Guest
Первоначально содержимое файла нужно перенести в существующий объект базы данных (таблицу) - например с помощью bcp или bulk insert
Далее уже производить манипцляции с данными
12 янв 11, 11:23    [10058127]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
или даже нет, не так.

выбираю очередное значение из списка, ищу в таблице все записи, у которых поле WorkID = этому значению, и у которых значение Rank < 10.

вот так, по-моему, лучше будет понятно, что нужно получить на выходе.
12 янв 11, 11:25    [10058151]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
_djХомяГ
Первоначально содержимое файла нужно перенести в существующий объект базы данных (таблицу) - например с помощью bcp или bulk insert
Далее уже производить манипцляции с данными

ага, понятно.
а дальше - как сравнивать, не подскажете?
12 янв 11, 11:27    [10058165]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
проходящий.
Guest
SvetlanaNikit
а мне нужно в итоге получить все записи из таблицы, которые соответствуют условию rank < 10 И условию что поле workID (к примеру так назвала это поле) равно строке из списка.
И что Вам мешает это сделать? При условии предварительного перегона Вашего списка в табличный вид любым из предложенных способов?
Т.е. беру следующую запись из таблицы, проверяю ее на соответствие условию rank < 10 а также проверяю ее на то, что поле workID содержит значение, равное записи в списке.
А предыдущее предложение не описывает ли уже все нужные для выбора нужных записей условия? Почему для select subjname from orgtable where rank < 10 Вам перебор записей не понадобился, а тут уже он появился? Вы не умеете в одном запросе устнавливать несколько условий?
12 янв 11, 11:28    [10058172]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SvetlanaNikit,
вот вам пример, поразбирайтесь
-- исходная таблица данных
declare @t table(WorkID varchar(100), [Rank] int)
insert into @t 
select 2390392003,10 union all 
select 11111,1 union all 
select 22222,2 union all 
select 3058123103,3 union all 
select 1436999303,14 union all 
select 49060516,5 union all 
select 641587016,6 union all 
select 663744216,19

-- импортируем в таблицу из текстового файла
create table #txt(a varchar(100))
bulk insert #txt
from 'c:\myfile.txt'
with (CODEPAGE = 1251,FIRSTROW=1,rowterminator = '\n')

-- выбираем пересечения по WorkID
select * 
from 
	@t t
	join #txt txt on txt.a = t.WorkID
where
	t.[Rank] < 10

-- удаляем таблицу имопрта
drop table #txt

12 янв 11, 11:32    [10058197]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

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

спасибо! поразбираюсь ))
12 янв 11, 11:50    [10058333]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
Я
Guest
1) Залить данные в таблицу
2) смотри оператор IN ( справка на русском)
12 янв 11, 12:00    [10058416]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
SomewhereSomehow, подскажите, пожалуйста, можно ли с помощью bulk insert заполнить таблицу, состоящую более чем из одного столбца, значениями также из тестового файла, разделенными запятыми (или любым другим общепринятым разделителем)?
12 янв 11, 12:11    [10058512]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
Я
Guest
с примерами на русском
12 янв 11, 12:18    [10058549]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
SvetlanaNikit
подскажите, пожалуйста, можно ли с помощью bulk insert заполнить таблицу, состоящую более чем из одного столбца, значениями также из тестового файла, разделенными запятыми (или любым другим общепринятым разделителем)?

bulk insert
12 янв 11, 12:18    [10058553]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
разобралась, спасибо.
12 янв 11, 12:22    [10058588]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
извините, еще не подскажете, что я делаю не так: в тех полях таблицы, куда из текстового файла импортируются значения, содержащие Ф.И.О кириллицей, теперь одни знаки вопроса вместо кириллических символов

делала так

bulk insert Table_2
from 'c:\input.csv'
with (CODEPAGE = 1251,FIRSTROW=1, FIELDTERMINATOR = ';', rowterminator = '\n')

таблица, куда импортирую данные создана так:

USE [AdventureWorks]
GO
/****** Object: Table [dbo].[Table_2] Script Date: 01/12/2011 12:38:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Table_2](
[DisplayName] [text] NULL,
[IDN] [varchar](50) NULL,
[ParentIDN] [varchar](50) NULL,
[DutyName] [text] NULL,
[DutyRank] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
SET ANSI_PADDING ON

вот эти самые [DisplayName] и [DutyName] у меня по идее должны содержать русские имена/названия.
12 янв 11, 12:39    [10058733]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
_djХомяГ
Guest
См коллейшн базы в которую идёт импорт (AdventureWorks) - оно не кириллическое, отсюда проблемы

PS А зачем это "лить" в AdventureWorks?
12 янв 11, 12:45    [10058772]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
в спешке всё :(
действительно, коллейшн базы соответствует "умолчальному" для данного сервера - SQL_Latin1_General_CP1_CI_AS

но... вот проблема.. создала новую базу на этом сервере, указала ей коллейшн Cyrillic_General_CI_AI, и всё равно - после импорта крякозябры отображаются...
12 янв 11, 12:56    [10058871]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SvetlanaNikit,
У вас сам текстовый файл в какой кодировке/формате сохранен? Например если utf-8, то будут кракозябры...
еще проверьте какой колейшн у темпдб если вы во временные таблицы льете, проверьте колейшн самого поля в таблице..
12 янв 11, 13:03    [10058921]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
поняла, спасибо, вроде разобралась с кодировками.
в итоге вот что получается.
решила немного упростить себе задачу - разбить ее на подзадачи поменьше: сначала сформировала таблицу, в которую загрузила все записи, у которых rank < 10
потом создала вторую таблицу, в которую загрузила данные из текстового файла.

потом сделала так:

select * 
from 
		dbo.Table_22
		join dbo.Table_11 on dbo.Table_11.a = dbo.Table_22.ISN

где Table_11 состоит из одного столбца, содержащего данные из текстового файла.
а в Table_22 содержащая столбцы
[DisplayName]
[IDN]
[ParentIDN]
[DutyName]
[DutyRank]

загружены записи с rank < 10


Правильно?
12 янв 11, 15:28    [10060328]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SvetlanaNikit,
Правильно или нет - это уже вам виднее =)
12 янв 11, 15:35    [10060395]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SvetlanaNikit
Member

Откуда:
Сообщений: 96
SomewhereSomehow,
да в том-то и дело, что я, откровенно говоря, чувствую себя обезъяной, которой дали если и не гранату - то что-то подобное :(
результат-то я получила. но не уверена в корректности своих действий...
12 янв 11, 16:00    [10060640]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать выборку из таблицы на основе некоторого списка/массива?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SvetlanaNikit,
Если сервер выполняет запрос и возвращает какой-то результат, то синтаксических ошибок и ошибок времени выполнения - нет.
Что касается логической правильности, то проверить может только тот, кто хотел этот результат получить. По каким-то одним известным ему критерииям. Так что у вас два пути - отдать запрос тому кто ставил задачу на проверку, или узнать каковы криетрии "правильности" и сверить с ними ваши результаты.
А как иначе? телепатов тут нет.. =)
12 янв 11, 16:11    [10060743]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить