сделать выборку по полю С3, убрать двойные значения.
Пишу:
select C1,C2,C3,C4,C5 from G_L
where С4=1
group by C1,C2,C3,C4,C5
не помогает, discinct выводит только один столбец...
Если выкинуть столбец С1 и С5- все просто, но они нужны!
select distinct(С3), C1, C2, C4 from G_L where C4=1
[Ответ]
oblivio 13:04 20.10.2005
Он как то неправильно работает. В таком запросе он выдает все поля, из-за С1 наверно. Если написать
select distinct(С3), C2, C4 from G_L where C4=1
Все прекрасно работает, но мне нужны еще поля С1и С5
[Ответ]
J++ 13:21 20.10.2005
Интересно:
вот выбираешь ты записи, у которых С4=1 (твоя исходная выборка в примере).
Но в выборке у тебя есть одинаковые значения в С3 -
ПРИ ТОМ, что в этих записях С1, С2 и С5 - разные (это Федя и Вася),
и КАК - хотя бы логически - ты можешь выбрать distinct С3 (т.е. без дублирования значений),
при этом НЕ отказываясь от С1 и С5 ? группировка так не поможет.
По какому критерию в описанном тобой примере ты "отбросил" Федю, а не Васю? Я не поняла. Точнее, есть подозрение, но четкого критерия нет.
Пока это не будет сформулировано точно, тебе вряд ли кто сможет ответить. А после того, как уточнишь критерий - может, сам ответишь без проблем [Ответ]
Бух 13:24 20.10.2005
Где нужны то? Сформулируй вопрос, что бы понятно было. Если просто нужны в выборке так добавь:
select distinct(С3), C2, C4, C5, C6, C125, ... (и т.д.) from G_L where C4=1
Если надо в что бы и эти поля не задваивались, так и сделай distinct(C5), distinct(C1)...
[Ответ]
oblivio 13:58 20.10.2005
мне нужно выбрать все записи из таблицы, в которых С3 не повторяется, вот и все. Но Distinct не помогает, потому что я хочу показать не один столбец, а все.
Есть какой то DistinctRows в accesse, но я тыкаюсь из под делфи в ib
[Ответ]
select distinct(С3), * from G_L where C4=1
Так не пробовал? Ты хоть раз в хелп заглядывал?
[Ответ]
Бух 14:17 20.10.2005
Сообщение от oblivio:
Похоже придется писать руками :.(
Писать надо не руками, а головой! А руками только на клавиши нажимать...
[Ответ]
oblivio 14:31 20.10.2005
Как же не пробовать, по моему я уже все пробовал, что в 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 такое просто незапланировано!))
[Ответ]
J++ 14:48 20.10.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 загонять соотв. критерий.
[Ответ]
oblivio 08:50 21.10.2005
Большое спасибо за идею. Буду думать...
Просто у меня не важно какая запись (петя, или вася). Сейчас я всех васями сделал. И не обязательно двойное С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 не умеет.
[Ответ]
J++ 09:28 21.10.2005
SQL - умеет. Вопрос в том, что у тебя нет ЯСНОГО критерия - какую (какие) из дублированных записей брать. Тебе о этом уже говорили несколько постов назад, ситуация с тех пор не изменилась.
Я же тебе ясно и понятно написала: я всего лишь в качестве ПРИМЕРА взяла критерий максимума. Он давал возможность ограничить выборку каким-то четким условием.
Можно сочинить другое условие. Вот его тебе и нужно записать в обоих where. SQL не умеет сам догадываться, какие именно записи тебе нужны, а ты фактически пытаешься переложить решение на него - при том, что задача некорректно сформулирована ТОБОЙ.
[Ответ]
oblivio 09:46 24.10.2005
Большое спасибо за помощь.
Задача была обломная, согласен. Не для SQL. Из положения вышел, написав 5 строчек программного кода.
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 пока не дотягивает)
[Ответ]
maximn 18:54 18.11.2005
Сообщение от yujanin:
а ещё, в сиквеле есть гораздо более продвинутые вещи: функции, сохраненные процедуры, курсоры, подзапросы, транзакции. Короче говоря, всю бизнес-логику абсолютно реально сделать в самом сиквеле, не прибегая к внешним программным средствам (речь идёт, конечно же, о продуктах бизнес-плана типа oracle, db/2 и ms sql, mysql пока не дотягивает)
есть, но в мускуле их нет, кое-что появилось только в 5 версии, которую хостеры ставить почему-то =) не спешат
[Ответ]