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

Откуда:
Сообщений: 15
Здравствуйте товарищи!
Недавно столкнулся с одной проблемой, решить так и не смог!
Можно ли написать запрос на SQL Server таким образом, чтобы в условии отбора указывался порядковый номер поля, а не его имя

Н-р:
Select count(*) from table_stat_1
where fields_1 = :a1

fields_1 как раз и неизвестен, может как то можно написать его по индексу?

Буду благодарен любой помощи!
5 авг 11, 11:04    [11074915]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Если только строить запрос динамически, вытаскивая имя столбца по его порядковому номеру из INFORMATION_SCHEMA.COLUMNS. Но сам подход ущербен априори.
5 авг 11, 11:07    [11074939]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
grisha-kr,

BOL
Идентификаторы столбцов могут не быть последовательными.
5 авг 11, 11:16    [11075021]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
grisha-kr
Member

Откуда:
Сообщений: 15
Суть в том, что имеется большое количество таблиц, одинаковых по структуре (там всего 4 поля), но название первого поля (самого нужного, поля даты\времени) у всех разное (придумал это чудо решение не я).
И данная выборка должна происходить многократно. Запросы из Си посылаются. Вообще я могу предварительно просто выбрать одну запись с таблицы и узнать имя поля, но это тоже совсем не совершенно. Были мысли что я чего то простого не знаю, казалось что можно в запросе просто указать индекс поля или что то в этом роде...
5 авг 11, 11:22    [11075080]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
grisha-kr,

declare @sql varchar(max), @Art varchar(50), @i int = 1 --номер атрибута

Set @Art = (select sc.Name from sys.columns sc where sc.object_id=object_ID('table_stat_1') and sc.column_id=@i)

set(@sql) = 'Select count(*) from table_stat_1
			 where '+@Atr+' = :a1' 
exec(@sql)
5 авг 11, 11:23    [11075089]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
Только set @sql без скобок
5 авг 11, 11:31    [11075176]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
ё
Guest
grisha-kr
Суть в том, что имеется большое количество таблиц, одинаковых по структуре (там всего 4 поля), но название первого поля (самого нужного, поля даты\времени) у всех разное (придумал это чудо решение не я).
И данная выборка должна происходить многократно. Запросы из Си посылаются. Вообще я могу предварительно просто выбрать одну запись с таблицы и узнать имя поля, но это тоже совсем не совершенно. Были мысли что я чего то простого не знаю, казалось что можно в запросе просто указать индекс поля или что то в этом роде...


select null as f1, null as f2, null as f3, null as f4 where 1=0

union all

SELECT * FROM [пофик какая таблица]
5 авг 11, 13:17    [11076123]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
Anddros
Member

Откуда:
Сообщений: 1077
with q(f1,f2,f3,f4) as (select * from ...)
select * from q where f4 = ...
5 авг 11, 13:25    [11076186]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
Anddros
with q(f1,f2,f3,f4) as (select * from ...)
select * from q where f4 = ...


по-моему, отличный вариант.
5 авг 11, 15:48    [11077255]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
grisha-kr
Member

Откуда:
Сообщений: 15
Anddros
with q(f1,f2,f3,f4) as (select * from ...)
select * from q where f4 = ...


Огромное вам спасибо Anddros! Это как раз то, что я и хотел!
5 авг 11, 21:50    [11079014]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
grisha-kr
Anddros
with q(f1,f2,f3,f4) as (select * from ...)
select * from q where f4 = ...


Огромное вам спасибо Anddros! Это как раз то, что я и хотел!


Совет - приложение нужно проектировать так, чтобы при добавлении полей в таблицы оно оставалось работоспособным
6 авг 11, 11:57    [11080108]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
ilyaBS
Anddros
with q(f1,f2,f3,f4) as (select * from ...)
select * from q where f4 = ...

по-моему, отличный вариант.

ага, хорошие грабли...
6 авг 11, 18:18    [11080978]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
ura
Совет - приложение нужно проектировать так, чтобы при добавлении полей в таблицы оно оставалось работоспособным

Geep
ага, хорошие грабли...


На самом деле, грабли это, или не грабли, мы не знаем. Теоретически - грабли, но на самом деле все зависит от деталей. Мало ли, может быть база у людей купленная, и менять в этом "чудо-решении" что-нибудь они не собираются никогда. Или срок жизни клиентского приложения заведомо мал.

Непонятно другое: зачем человеку "универсальная форма" select-а, если select, все равно, выполняется из разных таблиц, и имя таблицы требуется подставлять? Т.е. текст запроса все-равно конструируется перед его выполнением. А если программист заранее знает имя таблицы и подставляет его в текст запроса, то что ему мешает заранее знать имя поля, и тоже его подставлять? Уровень сложности реализации будет практически тот же. И без всякого риска (без потенциальных граблей).
8 авг 11, 11:56    [11084666]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
колумнэхтымойколумн
Guest
grisha-kr
Суть в том, что имеется большое количество таблиц, одинаковых по структуре (там всего 4 поля), но название первого поля (самого нужного, поля даты\времени) у всех разное (придумал это чудо решение не я).
И данная выборка должна происходить многократно. Запросы из Си посылаются. Вообще я могу предварительно просто выбрать одну запись с таблицы и узнать имя поля, но это тоже совсем не совершенно. Были мысли что я чего то простого не знаю, казалось что можно в запросе просто указать индекс поля или что то в этом роде...


вычисляемое поле в них во всех добавить - не? или через вьюхи на них смотреть?
8 авг 11, 13:41    [11085503]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
grisha-kr
Member

Откуда:
Сообщений: 15
Shlippenbaranus

На самом деле, грабли это, или не грабли, мы не знаем. Теоретически - грабли, но на самом деле все зависит от деталей. Мало ли, может быть база у людей купленная, и менять в этом "чудо-решении" что-нибудь они не собираются никогда. Или срок жизни клиентского приложения заведомо мал.

Непонятно другое: зачем человеку "универсальная форма" select-а, если select, все равно, выполняется из разных таблиц, и имя таблицы требуется подставлять? Т.е. текст запроса все-равно конструируется перед его выполнением. А если программист заранее знает имя таблицы и подставляет его в текст запроса, то что ему мешает заранее знать имя поля, и тоже его подставлять? Уровень сложности реализации будет практически тот же. И без всякого риска (без потенциальных граблей).


Я с вами тут согласен и не согласен! Мне в данный момент приходится выкручиваться, чтобы сделать то, что от меня требуют и не поломать все остальное! И то что я хочу\требуют, реализуемо только таким запросом. Тут просто нужно поверить. Просто когда делаешь что то муниципалам, да еще и в существующей базе и к ней кто только не тулится.... и не дай бог там кто то в менеджмент студии поля местами поменяет.... рухнет всё и у всех... там 3 курсовые и 4 дипломные кто написал. Я так же поддерживаю и улучшаю Другую систему, написанную изначально мною, там таких тупостей и проблем нету.
Спасибо за интерес к проблеме!
9 авг 11, 15:56    [11092433]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
grisha-kr
Member

Откуда:
Сообщений: 15
колумнэхтымойколумн

вычисляемое поле в них во всех добавить - не? или через вьюхи на них смотреть?


К сожалению нет, оптимизировать даже во вьюхи нельзя, начальный набор данных и условий настраиваемый.
9 авг 11, 15:58    [11092452]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
grisha-kr
Member

Откуда:
Сообщений: 15
grisha-kr,

А еще вопрос! Не получается записать несколько команд WITH в одном запросе!

как не пробовал..
//=========== не так

WITH q1(f1, f2, f3, f4) AS (SELECT * FROM frs_stat)
WITH q2(f5, f6, f7, f8) AS (SELECT * FROM kadastr_stat)
SELECT count(*)
FROM q1, q2

//=============== и не так
with q1(f1,f2,f3,f4) as (select * from frs_stat)
select count(*) from q1, history where q1.f2 = 1 and q1.f4 =history.id_key and history.wnd IN (1,2,3,4,5,6,7,8,9,10)
union all
select count(*) from q1, history where q1.f2 = 2 and q1.f4 =history.id_key and history.wnd IN (1,2,3,4,5,6,7,8,9,10)

with q2(f5,f6,f7,f8) as (select * from kadastr_stat)
select count(*) from q2, history where q2.f6 = 1 and q2.f8 =history.id_key and history.wnd IN (1,2,3,4,5,6,7,8,9,10)
union all
select count(*) from q2, history where q2.f6 = 2 and q2.f8 =history.id_key and history.wnd IN (1,2,3,4,5,6,7,8,9,10)

//================

может кто знает в чем ошибка
9 авг 11, 18:06    [11093540]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
iljy
Member

Откуда:
Сообщений: 8711
grisha-kr,

ошибка вестимо в ситнаксисе - его надо не придумывать, а использовать.
;WITH q1(f1, f2, f3, f4) AS (SELECT * FROM frs_stat)
   ,q2(f5, f6, f7, f8) AS (SELECT * FROM kadastr_stat)
SELECT count(*)
FROM q1, q2
9 авг 11, 18:09    [11093554]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
grisha-kr,

Пример:
WITH T3 AS
(select YEAR(OrderDate) AS YearOfOrder, CustomerID from Sales.SalesOrderHeader),
T4 AS
(select YearOfOrder, COUNT(DISTINCT CustomerID) AS NumOfCusts from T3 GROUP BY YearOfOrder)
select YearOfOrder, NumOfCusts from T4 where NumOfCusts>5000

Понимаете? ;)
9 авг 11, 18:13    [11093574]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по условию отбора неизвестного поля!  [new]
grisha-kr
Member

Откуда:
Сообщений: 15
SamMan, iljy

Спасибо большое, теперь я понял как работать с этой командой!
12 авг 11, 09:41    [11107513]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить