|
|
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
Задача в следующая, есть таблица: Id1 Id2 Qty 1 1 10 1 2 10 1 3 20 2 1 20 2 2 20 2 3 30 3 1 40 3 2 50 Поля id1, id2 составляют первичный ключ. Следует написать один запрос (т.е. без предварительных запросов, сохраняющих данные где-нибудь в переменных или временных таблицах, без циклов и проч.) , возвращающий по одной записи для каждого значения id1, встречающегося в исходной таблице, при этом, если в исходной таблице есть несколько строк с таким значением id1, то возвращается строка с минимальным для этого значения id1 значением поля Qty. Если таких строк для данного id1 будет несколько, годится любая из них. Мне на ум пришло только такое решение: select t.id1, max (t_.id2) , t.qty from (select id1, min(qty) qty from test_table group by id1) t inner join test_table t_ on (t.id1 = t_.id1 and t.qty = t_.qty) group by t.id1, t.qty Является ли данное решение верным? Ну тоесть результат верный, но можно ли сказать, что я не использую предварительных запросов? Верные результаты для приведенной таблицы? Id1 Id2 Qty 1 1 10 2 1 20 3 1 40 Id1 Id2 Qty 1 2 10 2 1 20 3 1 40 Id1 Id2 Qty 1 1 10 2 2 20 3 1 40 Id1 Id2 Qty 1 2 10 2 2 20 3 1 40 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2014, 15:07 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
select id1,id2,min(Qty) from t group by id1 нет ? или я что-то не так понял в вашем вопросе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2014, 15:45 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
SashaMercuryselect id1,id2,min(Qty) from t group by id1 нет ? или я что-то не так понял в вашем вопросе Такой запрос работать не будет, ибо группировка только по id1, если добавить в group by еще и id2, то выборка будет совсем не та, что нужна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2014, 15:52 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
SashaMercuryselect id1,id2,min(Qty) from t group by id1 нет ? или я что-то не так понял в вашем вопросе "столбец id2 недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2014, 15:53 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
Вот такой запрос будет работать select id1, max(id2), min(qty) qty from test_table group by id1 Но меня смущает следующее, пусть id1 – это код товара, id2 – код партии товара, Qty – остаток на складе. Запрос должен выбрать по одной партии каждого товара с наименьшим остатком, тогда я, практически явно задаю, что код партии будет максимальным при минимальном остатке, а этого делать не нужно. Тоесть нужно задать в условии, что остаток должен быть минимальным и все, потом для каждого товара выбрать партию с минимальным остатком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2014, 15:54 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
Нет, все же вариант select id1, max(id2), min(qty) qty from test_table group by id1 Не верный ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2014, 16:26 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
Aftor_Magister, Что то я не пойму зачем выбирать в результирующий набор id2? В условии нет ничего про него. Ваш запрос все правильно возвращает, но вы же сами привели несколько вариантов "правильной" выборки и, например oracle, не гарантирует какую из них выдаст при каждом следующем запросе. Либо условие задачи не такое либо здесь не имеет значения какой первичный ключ и есть ли он вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2014, 16:33 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
Aftor_Magisterможно ли сказать, что я не использую предварительных запросов? Можно. Ты используешь вложенные запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2014, 16:43 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
Aftor_Magister , извольте всё-таки указать СУБД. Aftor_MagisterТакой запрос работать не будетНапример, в MySQL - прекрасно будет работать. Ну или строго - можно так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2014, 16:50 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
Aftor_Magister, для такого типа запросов лучше использовать NOT EXISTS, тоесть перефразируя твое задание, выбрать строки по id1 для которых НЕСУЩЕСТВУЕТ строк с тем же id1 и qty меньше исходного. Ну и для исключения дубликатов задействовать id2 или COUNT() Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2014, 12:26 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
AkinaНапример, в MySQL - прекрасно будет работать.а в постгре можно вывернуться через distinct on + order by :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 08:48 |
|
||
|
Выборка из таблицы с первичным ключем из двух полей
|
|||
|---|---|---|---|
|
#18+
On 15.05.2014 16:45, SashaMercury wrote: > Автор: SashaMercury. select id1,id2,min(Qty) from t > group by id1 > > нет ? или я что-то не так понял в вашем вопросе Фу, Саша, фу... Как ты мог так лажануться ? select id1, min(Qty) from t group by id1 Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 12:45 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38644410&tid=1341357]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
187ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 558ms |

| 0 / 0 |
