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

Помогите с запросом в SQL !!! - Базы данных

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

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

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

У меня это реализовано пока так:
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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Помогите с запросом в SQL !!! (Базы данных):

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

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

VB5, SQL & WHERE помогите!
Суть проблемы: делаем запрос, например SELECT * FROM TABLE WHERE...

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

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

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

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

Помогите написать правильный SQL-запрос
Суть вот в чем: необходимо вставить строку в таблицу, но таким образом, чтобы...

Помогите сделать структуру базы данных на SQL
Все тривиально, начальник хочет интернет магазин!. Начала писать на php с...


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

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

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