С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Inna
1

Помогите с запросом в SQL !!!

09.09.2007, 16:24. Просмотров 1461. Ответов 15
Метки нет (Все метки)

Помогите, пожалуйста решить проблему в SQL:

есть Table1 с ключевым полем ID и привязаная к ней по ID Table2 (один ко многим). В Table2 для каждой записи ID содержится набор радионуклидов(R) и их активностей (А).
Нужно отобрать все записи из Table1 с указанием для каждой записи радионуклида, имеющего максимальную активность.

У меня это реализовано пока так:
SQL
1
2
3
SELECT ID.T1, R.T2, A.T2
FROM T1 INNER JOIN T2 ON T1.ID=T2.ID WHERE 
T2.A = (SELECT MAX(T2.A) FROM T2 WHERE T2.ID=T1.ID GROUP BY T2.ID)
Проблема возникает, когда несколько радинуклидов имеют максимальную активность. У меня тогда отбирается несколько раз запись с одинаковым ID. Мне нужно выбрать первый попавшийся. В Access для этого есть функция DFirst(), а в SQL не знаю что делать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2007, 16:24
Ответы с готовыми решениями:

Помогите с запросом
Делаю запрос (укороч. вариант) SELECT t1.fdate, t2.fname, t1.fkol, t1.fsumma FROM t1,t2 WHERE...

Помогите с запросом
помогите создать запрос на осуществление следующей операции: допустим, что SQL запрос выдал нам N...

проблема с sql запросом
народ помогите, возможно ли построить такой запрос: допустим в таблице есть две записи, в...

VB5, SQL & WHERE помогите!
Суть проблемы: делаем запрос, например SELECT * FROM TABLE WHERE USER=''ПЕТРОВ'' А затем хотим...

SQL в DBF !!! Помогите!!!
Здрасвуйте! Есть дамп с linux sql сервака 3.23.41, снял используя phpmyadmin. Как мне его перевести...

15
AndreP
0 / 0 / 1
Регистрация: 22.07.2007
Сообщений: 260
09.09.2007, 16:37 2
Если нужно выбрать для каждого ID максимальное значение T2.A, то

SELECT T1.ID, MAX(T2.A) FROM TABLE1 AS T1, TABLE2 AS T2 WHERE T1.ID=T2.ID GROUP BY T1.ID
0
Inna
09.09.2007, 16:51 3
Это было бы просто, максимальная активность то одна. Но в том-то и дело, что нужно указывать радионуклид с максимальной активностью, а их несколько :-((
AndreP
0 / 0 / 1
Регистрация: 22.07.2007
Сообщений: 260
09.09.2007, 18:02 4
Стандартным SQL эта задача не решается, к сожалению. Можно написать поцедуру, которая будет выбрасывать лишние записи.
0
maximf
0 / 0 / 0
Регистрация: 29.06.2007
Сообщений: 50
09.09.2007, 18:04 5
2Inna: Вы, к сожалению, не написали какую СУБД используете. Кстати, а почему ссылки на поля у Вас выглядят как поле.таблица?

В MSSQL можно сделать так, через временную таблицу:
T-SQL
1
2
3
4
5
6
7
8
9
select id, max(a) as maxA
into #t
from T2
group by id
 
select b.id, min(r), min(a)
from T2 b
inner join #t t on b.id = t.id and b.a = t.maxA
group by b.id
Удачи!
0
AndreP
0 / 0 / 1
Регистрация: 22.07.2007
Сообщений: 260
09.09.2007, 18:18 6
Это то же может вернуть по две записи. MSSQL плохо понимает, что такое min(r) от текстового поля написанного кирилицей.
0
Inna
09.09.2007, 19:17 7
maximf: Спасибо за идею, такой вариант проходит, правда на простом примере.
В моем случае мне надо отобрать записи из семи похожих по структуре таблиц, накладывая на них еще ограничения, потом это все занести в одну временную таблицу, сгруппировать, как ты предлагаешь, по ID, отбросив дубли, занести результат во вторую временную таблицу, а потом вытянуть эти записи, привязывая к ним поля из других таблиц (причем они разные для каждой из семи главных таблиц). Из-за этих дублей все жутко усложняется. Да еще и процедур этих у меня уже с десяток написано и все с одной проблемой :-(

Может, есть еще идеи, без использования временных таблиц?
maximf
0 / 0 / 0
Регистрация: 29.06.2007
Сообщений: 50
09.09.2007, 22:47 8
Инна, можно просто сделать суперпозицию запросов:
SQL
1
2
3
4
SELECT b.id, MIN(r), MIN(a)
FROM  T2
INNER JOIN (SELECT id, MAX(a) AS maxA FROM T2     GROUP BY id) t ON b.id = t.id AND b.a = t.maxA
GROUP BY b.id
to AndreP:
для вычисления 'min(r) от текстового поля написанного кирилицей' достаточно уметь сравнивать строки. Это MSSQL умеет. Другое дело, что результат может быть различным в зависимости от параметров MSSQL.
0
AndreP
0 / 0 / 1
Регистрация: 22.07.2007
Сообщений: 260
10.09.2007, 12:15 9
to maximf
Согласен, это должно пройти, но сколько избыточности. Может быть все же проще, в данном случае, согласиться на хранимую процедуру. Если речь идет о десятке записей, то разговор не стоит свеч, но записей может быть и много.
0
maximf
0 / 0 / 0
Регистрация: 29.06.2007
Сообщений: 50
10.09.2007, 12:31 10
2 AndreP: согласен, вариант с хранимой процедурой не хуже. Но чем он лучше? Вариант с одним запросом делает то же самое. Единственная 'избыточная' вещь - это min(a) в списке полей (поскольку b.a = t.maxA), но вряд ли она существенно увеличивает время запроса. Интересно, конечно, было бы проверить обе версии на большом объёме.

С уважением.
0
Inna
10.09.2007, 13:34 11
Ура, сработало!!!
я сделала супер-суперпозицию запросов, т.е. по такой схеме:
SQL
1
2
3
4
5
6
SELECT T1.id, T1.остальные_поля, B.R, B.A
FROM T1 INNER JOIN 
(SELECT T2.id, MIN(r) R, MIN(a) A 
FROM T2
INNER JOIN (SELECT id, MAX(a) AS maxA FROM T2 GROUP BY id) t ON T2.id = t.id AND T2.a = t.maxA
GROUP BY T2.id) B ON T1.id=B.id
Спасибо за внимание к моей проблеме и полезные советы.
maximf: отдельное спасибо, сама бы не додумалась до такого решения, с SQL работать стала недавно, всех его возможностей не знаю, в Access такие запросы делать проще.
Inna
10.09.2007, 13:54 12
У меня это и есть процедура с параметрами и очень даже немаленькая, поскольку записи берутся из семи таблиц типа Т1 (в каждой будет много записей, порядка сотни тысяч), да еще для каждой записи из других таблиц и справочников (в числе которых справочник населенных пунктов Украины - 42тыс записи) вытаскивается полная информация. Все это нужно для формирования годовых отчетов, поэтому быстродействие меня не особо волнует, главное - правильный результат.
maximf
0 / 0 / 0
Регистрация: 29.06.2007
Сообщений: 50
10.09.2007, 14:19 13
Рад помочь.
Забавно, я тоже с Украины, и у меня тоже есть справочник населённых пунктов!
0
Inna
10.09.2007, 14:30 14
земляк в беде не оставит :-))
ger
12.09.2007, 10:08 15
А если использовать конструкцию с 'TOP'?
ger
12.09.2007, 10:08 16
А если использовать конструкцию с 'TOP'?
12.09.2007, 10:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2007, 10:08

Помогите исправит ошибку SQL
Добрый вечер У меня такая проблема после перекомпилирование апач и php, 4 сайта (скрипт веб...

SQL - запрос (навороченный) - ПОМОГИТЕ!!!!!
Есть таблица вида: cntr | fld1 | fld2 | fld3 ... 5 | 15.11.01 | IN | ...

Помогите разобраться с ADO в Delphi и MS SQL!
Вопрос следующий: Есть у меня скрипт создания хранимой процедуры для MS SQL 7. Мне его надо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru