Старый 20.10.2005, 12:12   #1   
Форумец
 
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41

oblivio вне форума Не в сети
Cool ПОМОГИТЕ С 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, 12:30   #2   
Пью пиво
 
Аватар для Бух
 
Сообщений: 249
Регистрация: 14.09.2005
Возраст: 56

Бух вне форума Не в сети
Что-то не понятно.... А зачем ты делаешь group?
select * from G_L where C4=1
выведутся все записи в которых значение поля С4 равно 1...
  Ответить с цитированием
Старый 20.10.2005, 12:38   #3   
Форумец
 
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41

oblivio вне форума Не в сети
Мне нужно из большой таблицы выбрать записи, в которых С4=1
А из них еще выбрать те, в котрых уникальное значение С3
  Ответить с цитированием
Старый 20.10.2005, 12:40   #4   
Форумец
 
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41

oblivio вне форума Не в сети
почеу то SQL ошибается, если я пишу:
select *G_L
where С4=1
group by C3

Пишет, что нет поля С3
  Ответить с цитированием
Старый 20.10.2005, 12:44   #5   
Форумец
 
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41

oblivio вне форума Не в сети
В смысле
select from*G_L
where С4=1
group by C3

Прошу прощенья
  Ответить с цитированием
Старый 20.10.2005, 12:49   #6   
Пью пиво
 
Аватар для Бух
 
Сообщений: 249
Регистрация: 14.09.2005
Возраст: 56

Бух вне форума Не в сети
select distinct(С3), C1, C2, C4 from G_L where C4=1
  Ответить с цитированием
Старый 20.10.2005, 13:04   #7   
Форумец
 
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41

oblivio вне форума Не в сети
Он как то неправильно работает. В таком запросе он выдает все поля, из-за С1 наверно. Если написать
select distinct(С3), C2, C4 from G_L where C4=1
Все прекрасно работает, но мне нужны еще поля С1и С5
  Ответить с цитированием
Старый 20.10.2005, 13:21   #8   
Бывалый форумец
 
Аватар для J++
 
Сообщений: 687
Регистрация: 05.08.2005

J++ вне форума Не в сети
Интересно:
вот выбираешь ты записи, у которых С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

oblivio вне форума Не в сети
мне нужно выбрать все записи из таблицы, в которых С3 не повторяется, вот и все. Но Distinct не помогает, потому что я хочу показать не один столбец, а все.
Есть какой то DistinctRows в accesse, но я тыкаюсь из под делфи в ib
  Ответить с цитированием
Старый 20.10.2005, 14:12   #11   
Форумец
 
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41

oblivio вне форума Не в сети
Похоже придется писать руками :.(
  Ответить с цитированием
Старый 20.10.2005, 14:16   #12   
Пью пиво
 
Аватар для Бух
 
Сообщений: 249
Регистрация: 14.09.2005
Возраст: 56

Бух вне форума Не в сети
select distinct(С3), * from G_L where C4=1
Так не пробовал? Ты хоть раз в хелп заглядывал?
  Ответить с цитированием
Старый 20.10.2005, 14:17   #13   
Пью пиво
 
Аватар для Бух
 
Сообщений: 249
Регистрация: 14.09.2005
Возраст: 56

Бух вне форума Не в сети
Цитата:
Сообщение от oblivio
Похоже придется писать руками :.(
Писать надо не руками, а головой! А руками только на клавиши нажимать...
  Ответить с цитированием
Старый 20.10.2005, 14:31   #14   
Форумец
 
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41

oblivio вне форума Не в сети
Как же не пробовать, по моему я уже все пробовал, что в 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   
Бывалый форумец
 
Аватар для J++
 
Сообщений: 687
Регистрация: 05.08.2005

J++ вне форума Не в сети
Простейший вариант (проверено в 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

oblivio вне форума Не в сети
Большое спасибо за идею. Буду думать...
Просто у меня не важно какая запись (петя, или вася). Сейчас я всех васями сделал. И не обязательно двойное С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   
Бывалый форумец
 
Аватар для J++
 
Сообщений: 687
Регистрация: 05.08.2005

J++ вне форума Не в сети
SQL - умеет. Вопрос в том, что у тебя нет ЯСНОГО критерия - какую (какие) из дублированных записей брать. Тебе о этом уже говорили несколько постов назад, ситуация с тех пор не изменилась.

Я же тебе ясно и понятно написала: я всего лишь в качестве ПРИМЕРА взяла критерий максимума. Он давал возможность ограничить выборку каким-то четким условием.

Можно сочинить другое условие. Вот его тебе и нужно записать в обоих where. SQL не умеет сам догадываться, какие именно записи тебе нужны, а ты фактически пытаешься переложить решение на него - при том, что задача некорректно сформулирована ТОБОЙ.
  Ответить с цитированием
Старый 24.10.2005, 09:46   #18   
Форумец
 
Сообщений: 48
Регистрация: 03.06.2004
Возраст: 41

oblivio вне форума Не в сети
Большое спасибо за помощь.
Задача была обломная, согласен. Не для SQL. Из положения вышел, написав 5 строчек программного кода.

Спасибо всем, кто пытался мне помоч.
  Ответить с цитированием
Старый 18.11.2005, 07:58   #19   
Форумец
 
Аватар для yujanin
 
Сообщений: 1,581
Регистрация: 11.04.2003

yujanin вне форума Не в сети
Для 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
 
Аватар для maximn
 
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24

maximn вне форума Не в сети
Цитата:
Сообщение от yujanin
а ещё, в сиквеле есть гораздо более продвинутые вещи: функции, сохраненные процедуры, курсоры, подзапросы, транзакции. Короче говоря, всю бизнес-логику абсолютно реально сделать в самом сиквеле, не прибегая к внешним программным средствам (речь идёт, конечно же, о продуктах бизнес-плана типа oracle, db/2 и ms sql, mysql пока не дотягивает)
есть, но в мускуле их нет, кое-что появилось только в 5 версии, которую хостеры ставить почему-то =) не спешат
  Ответить с цитированием
Поиск в теме: 


Опции темы

Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind