Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
ПОМОГИТЕ С SQL |
Философия, технологии, алгоритмы! |
|
Опции темы |
20.10.2005, 12:12 | #1 |
Форумец
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41
Не в сети |
ПОМОГИТЕ С SQL
Люди, помогите!!!!
Сижу и туплю... Задача такая: Есть таблица C1 C2 C3 C4 C5 1 Вася 1 _1 _1 2 Вася 2 _1 _2 3 Вася 3 _1 _3 4 Вася 3 _1 _4 Пытаюсь получить таблицу: C1 C2 C3 C4 C5 1 Вася 1 _1 _1 2 Вася 2 _1 _2 4 Вася 3 _1 _4 сделать выборку по полю С3, убрать двойные значения. Пишу: select C1,C2,C3,C4,C5 from G_L where С4=1 group by C1,C2,C3,C4,C5 не помогает, discinct выводит только один столбец... Если выкинуть столбец С1 и С5- все просто, но они нужны! Помогите, кто чем может... |
20.10.2005, 13:21 | #8 |
Бывалый форумец
Сообщений: 687
Регистрация: 05.08.2005
Не в сети |
Интересно:
вот выбираешь ты записи, у которых С4=1 (твоя исходная выборка в примере). Но в выборке у тебя есть одинаковые значения в С3 - ПРИ ТОМ, что в этих записях С1, С2 и С5 - разные (это Федя и Вася), и КАК - хотя бы логически - ты можешь выбрать distinct С3 (т.е. без дублирования значений), при этом НЕ отказываясь от С1 и С5 ? группировка так не поможет. По какому критерию в описанном тобой примере ты "отбросил" Федю, а не Васю? Я не поняла. Точнее, есть подозрение, но четкого критерия нет. Пока это не будет сформулировано точно, тебе вряд ли кто сможет ответить. А после того, как уточнишь критерий - может, сам ответишь без проблем |
20.10.2005, 13:24 | #9 |
Пью пиво
Сообщений: 249
Регистрация: 14.09.2005
Возраст: 56
Не в сети |
Где нужны то? Сформулируй вопрос, что бы понятно было. Если просто нужны в выборке так добавь:
select distinct(С3), C2, C4, C5, C6, C125, ... (и т.д.) from G_L where C4=1 Если надо в что бы и эти поля не задваивались, так и сделай distinct(C5), distinct(C1)... |
20.10.2005, 13:58 | #10 |
Форумец
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41
Не в сети |
мне нужно выбрать все записи из таблицы, в которых С3 не повторяется, вот и все. Но Distinct не помогает, потому что я хочу показать не один столбец, а все.
Есть какой то DistinctRows в accesse, но я тыкаюсь из под делфи в ib |
20.10.2005, 14:31 | #14 |
Форумец
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41
Не в сети |
Как же не пробовать, по моему я уже все пробовал, что в sql возможно.
select distinct(С3), * from G_L where C4=1 Вообще то на такую запись он ругается, звездочка ему не нравиться... Говорит, если начал с discint, то изволь все поля руками перечислить. Я ему пишу: select distinct(С3), С4, C2 from G_L where C4=1, он, как я и хотел выдает поля с уникальным С3. Но мне нужны еще и С1 и С5. Пишу: select distinct(С3), С4, C2,C1,C5 from G_L where C4=1 Он выводит таблицу как будто у меня запрос select *from G_L where C4=1. Никакой discinct он не учитывает. Таже проблема, если делаешь это через group by! По моему в SQL такое просто незапланировано!)) |
20.10.2005, 14:48 | #15 |
Бывалый форумец
Сообщений: 687
Регистрация: 05.08.2005
Не в сети |
Простейший вариант (проверено в Firebird 1.03, SQL Dialect 3):
select g.C1, g.C2, g.C3, g.C4, g.C5 from G_L g where g.C4=1 and g.C1= (select max(g1.C1) from G_L g1 where g1.C4=1 and g1.C3=g.C3 ) ; Это если ты хочешь выбрать среди тех, у кого дублируется C3 - записи с НАИБОЛЬШИМИ значениями С1 (см. в условии where - select max...) Если критерий выборки другой - надо в скобки в where загонять соотв. критерий. |
21.10.2005, 08:50 | #16 |
Форумец
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41
Не в сети |
Большое спасибо за идею. Буду думать...
Просто у меня не важно какая запись (петя, или вася). Сейчас я всех васями сделал. И не обязательно двойное С3 может быть только у записей с максимальным С1. Двойных записей по С3 может быть несколько и они дублирются по разным значениям. Пример С1: C1 C2 C3 C4 C5 1 Вася 1 _1 _1 2 Вася 2 _1 _2 3 Вася 3 _1 _3 4 Вася 3 _1 _4 5 Вася 2 _1 _5 6 Вася 1 _1 _6 7 Вася 4 _1 _8 8 Вася 4 _1 _8 Получается, что вложеный запрос должен возвращать не одну, а несколько записей. Такое SQL не умеет. |
21.10.2005, 09:28 | #17 |
Бывалый форумец
Сообщений: 687
Регистрация: 05.08.2005
Не в сети |
SQL - умеет. Вопрос в том, что у тебя нет ЯСНОГО критерия - какую (какие) из дублированных записей брать. Тебе о этом уже говорили несколько постов назад, ситуация с тех пор не изменилась.
Я же тебе ясно и понятно написала: я всего лишь в качестве ПРИМЕРА взяла критерий максимума. Он давал возможность ограничить выборку каким-то четким условием. Можно сочинить другое условие. Вот его тебе и нужно записать в обоих where. SQL не умеет сам догадываться, какие именно записи тебе нужны, а ты фактически пытаешься переложить решение на него - при том, что задача некорректно сформулирована ТОБОЙ. |
18.11.2005, 07:58 | #19 |
Форумец
Сообщений: 1,581
Регистрация: 11.04.2003
Не в сети |
Для SQL, для SQL.
SELECT MAX(c1) AS c1, c3 FROM table GROUP BY c3, c1 выдаст тебе твой желаемый результат - ряды 1, 2, 4. это элементарная агрегатная (даже не знаю, как по-русски, по-аглицки aggregate) функция. GROUP BY вступает в силу только тогда, когда в первой части (после SELECT) идёт агрегатная функция (типа SUM, MAX, MIN, AVG и т.д.) с другой стороны, меняя MAX на MIN, получишь в качестве результата ряды 1, 2, 3 а ещё, в сиквеле есть гораздо более продвинутые вещи: функции, сохраненные процедуры, курсоры, подзапросы, транзакции. Короче говоря, всю бизнес-логику абсолютно реально сделать в самом сиквеле, не прибегая к внешним программным средствам (речь идёт, конечно же, о продуктах бизнес-плана типа oracle, db/2 и ms sql, mysql пока не дотягивает) |
18.11.2005, 18:54 | #20 | |
error #65535
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24
Не в сети |
Цитата:
|
|