Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» SQL запрос

Автор: dneprcomp
Дата сообщения: 08.10.2009 23:53
Irbis3003
Потому что в связанных таблицах больше одного рекорда для данного человека.
Связь one-to-many
Попробуй SELECT DISTINCT или SELECT DISTINCTROW
Автор: greenpc
Дата сообщения: 09.10.2009 10:25
Irbis3003
1
select fio,sum,date from table t1 where date=(select max(date) from table t2 where t2.fio=t1.fio)
2
select * from table t1 join (
select max(date) as md from table
gropu by fio) t2 on t1.fio=t2.fio and t1.date=t2.md
3
SELECT *
FROM table t1
WHERE NOT EXISTS(
SELECT *
FROM table t2
WHERE t2.date > t1.date
AND t2.fio = t1.fio
надеюсь идея понятна ?
Автор: Irbis3003
Дата сообщения: 09.10.2009 13:09
Я решил немного облегчить задачу, и оставить этот запрос. И написать еще один))
Для этого скажите пожалуйста, можно ли результат вышеупомянутого мною запроса запихать в динамически-создаваемую таблицу? Причем у этой таблицы нужно каким-то образом задать адрес сохранения (чтобы после вывода запроса благополучно таблицу убить=) Из этой таблицы сделать еще одну выборку (уже абсолютно безхитростную), и результат вывести в QuickRep. (Напомню еще раз, что юзаю Delphi7, PARADOX)
Автор: greenpc
Дата сообщения: 09.10.2009 14:23
Irbis3003

Цитата:
можно ли результат вышеупомянутого мною запроса запихать в динамически-создаваемую таблицу
да пожалуйста insert into restable (если надо поля) select ....

Цитата:
задать адрес сохранения
т.е. вы не умеете создавать таблицы?

Цитата:
Из этой таблицы сделать еще одну выборку

а смысл таких извращений?
IMHO почитайте лучше книги по sql типа Губера "понимание sql" и большенство вопросов отпадет
Автор: Irbis3003
Дата сообщения: 09.10.2009 16:13
Понимаете, сейчас программный продукт держится на заглушках, и сделав эту последнюю выборку он уже будет похож на работоспособный. А доведение до ума - это уже дело второе, на которое можно посветить больше времени и внимания. Просто сейчас моего ума хватает на подобный алгоритм - двойной запрос :-[

Так все-таки: если я создаю таблицу (самое простое create table mytable (first_pole character);), то как запихать эту таблицу в нужный мне альяс? (то есть альяс уже объявлен, например ":Alias1:")?

Добавлено:
Все, почти разобрался))
Автор: Irbis3003
Дата сообщения: 12.10.2009 18:23
Люди, кто юзает Delphi и PARADOX, помогите. Если написать в Query написать запрос типа выбрать из таблицы и все такое (select * from ":alias:Table.db"), то Query.Actie:=true без проблем ставится. Но если в запрос написать Delete from ":alias:Table.db", то сразу пишет ошибку error creating cursor handle. В чем-то ошибка?

Добавлено:
разобрался))))
Автор: KurkSS
Дата сообщения: 12.10.2009 22:10
Общая помощь по созданию запросов.... лично я из своего опыта преподавания этого языка могу сказать следующее.....
[more]
99% трудностей возникает изза незнания реляционной модели данных...

Кто считает что реляционная модель, это когда есть две таблицы, в них есть совпадающий столбик, и если в одном значение 100, то это ссылка на значения в другой таблице где тоже значение 100 ....... ну почти угадали, несчитая, что связь это не только равно, может быть и меньше и больше и не равно, и может просто отсутствовать.... другое дело что чаще мы используем равно...

Таблица1
поле1 поле2 поле3 поле4
Таблица2
поле1 поле2 поле3
Таблица3
поле1 поле2
Таблица4
поле1 поле2 поле3

Как строиться связь между ними сразу на примере запроса....

1) вначале определяем декартово произведение каких доменов нужно сделать
секция from

Домен... попростому сдесь можете считать, что это таблица представленная ввиде стобика, тоесть её запись(строка) одно целое на данном этапе

Декартово произведение таблиц:

Таблица1
1,саша,123.ВА
2,оля,222,АА
Таблица3
ВА,к343532л
ВП,о3532ш53
АК,345ш4334

их декартово произведение
Табл1.поле1,Табл1.поле2,Табл1.поле3,Табл1.поле4,Табл3.поле1,Табл3.поле2
1,саша,123.ВА,ВА,к343532л
2,оля,222,АА,ВА,к343532л
1,саша,123.ВА,ВП,о3532ш53
2,оля,222,АА,ВП,о3532ш53
1,саша,123.ВА,АК,345ш4334
2,оля,222,АА,АК,345ш4334

2)Определяем собственно реляционную связь ... секция where
из полученого произведения выбираем подмножество которое называеться отношением:
каждую строку проверяем на логическое условие

ТАбл1.поле4=Табл3.поле1 например
1,саша,123.ВА,ВА,к343532л результат

можно и такое ТАбл1.поле4<>Табл3.поле1
2,оля,222,АА,ВА,к343532л
1,саша,123.ВА,ВП,о3532ш53
2,оля,222,АА,ВП,о3532ш53
1,саша,123.ВА,АК,345ш4334
2,оля,222,АА,АК,345ш4334

потом групировка и вычисление агрегирующих функций(это уже не имеет отношение к реляционной модели)
при агрегации можно дополнительно из групы выбирать лишь часть записей по условию(секция хэвинг)
потом сортировка, потом выбор нужных нам столбцов из того что получилость - первая часть оператора.

Теперь чтоб составить запрос, нужно
1)определить данные из каких таблиц нам понадобяться
2)представить себе это ввиде произведения доменов
3)придумать как бы вы вручную из этой каши искали нужные вам записи
4)сделать это для компьютера....

Вложенные подзапросы:
это уже когда условие не просто равно или неравно чемуто.... а например значение содержеться в множесте,
а само множество результат селекта.... тоесть задача просто разбиваеться на две независимые ....

несколько иное дело корелированный подзопрос, это аналог цикла ФОР....

ГДЕ
Табл1.поле2=Табл4.поле1 И
Табл1.поле3 В (Выбор поле3 ИЗ Таблица3 Где Табл3.поле2<> Табл1.поле2)
ведь вложенный подзапрос нельзя выполнить вначале, так как неизвестно значение Табл1.поле2
В этом случае построчно просматриваеться результат умножения таблиц во внешнем запросе, и для каждого значения
Табл1.поле2 выполняетсья внутрений....

Но зачастую задачу можно решить и используя обычную вложеность....

Поэтапная агрегация....

например есть таблица(или можем получить таблицу сделав умножение и выбор отношения, взяв нужные столбики)
Отдел имя датапремии сумапремии...

Хотим получить
отдел КолПремированых Общее количество премий

1 отдел имя КоличествоПремийчела=(Count(*))
2 отдел количествоПремированых=(Count(*)) КоличествоПремий=Sum(количествоПремийЧела)

ну а когда мы говорим про то, что нам нужны записи которые.......... ИЛИ записи, которые.....
притом это вда разных алгоритма получения данных .... на лицо последовательные выборы и соеденение их
UNION

ещо есть джоины и прочее... но вообщемто это экзотика, если вам это крайне необходимо, то либо плохо подумали,
можно и без них, либо не правильно спроэктирована база данных(с точки зрения реляционной модели)....
ну или это какойто нестандартный полуфантастический запрос который раз в год пришло в голову сделать....

Ещо раз настоятельно рекомендую всем, у кого трудности с построение запроса, неполениться и врубиться в
сущность реляционной модели.... легче понимать если ей учить после сетевой модели
Тоесть понимать что это модель, когда нет физической связи между данными... как в сетевой модели.
Там есть только логическая связь, которая каждый раз выщитываеться, и невсегда одна и тажа в общем случае....

1)Из таблиц сотруднико двух отделов выбрать пары чтобы дядя-дядя или тётя-тётя + ещо условия...
для суботника

2)Дядя-тётя +ещо услловия для корпоратива.... юзаем одно и тоже поле, а вот знаки разные.... равенство
полового признака и не равенство.....



Добавлено:
а идейный смысл фразы связь между таблицами в базе..... это не связь между данными, а связи именно между таблицами для поддержания целостности данных.... заметку сделал, так как многих именно подобные предложения и вводят в заблуждение, они начинают думать, что в реляционно базе данных есть связи между данными...
[/more]
Автор: Tantos
Дата сообщения: 13.10.2009 06:10
Irbis3003
Для не-Select запросов используй метод ExecSQL. Кстати, компоненты доступа ты так и не указал.
Автор: greenpc
Дата сообщения: 13.10.2009 09:06
KurkSS
офф
хотел помолчать но не получается лично я бы ни зачто не пошел к вам учится
хотя бы одна эта фраза

Цитата:
ещо есть джоины и прочее... но вообщемто это экзотика

чего стоит... и говорит о вашей проф пригодности
чтобы не вдаваться в спор по этой теме предлагаю почитать по этому хотя бы это _http://www.sql.ru/users/sergcat/1.htm
Автор: KurkSS
Дата сообщения: 13.10.2009 18:24
greenp

Вопервых, большое вам спасибо, что прочитали моё сообщение, не смотря на то, что длинное.Также сразу видно, что прочитали внимательно.... Знаете ... может и есть экзотические, но популярные ситуации
в экзотических базах где есть смысл, и я бы сам использовал часто джоины.... но....
ЗЫ:ситуация похожа как один человек мне доказывал что если есть awk то нужно забыть про
sed


Цитата:
чего стоит... и говорит о вашей проф пригодности
чтобы не вдаваться в спор по этой теме предлагаю почитать по этому хотя бы это _http://www.sql.ru/users/sergcat/1.htm


Взаимно прочитал и разобрал внимательно ваш пример.
Именно по вашему примеру? пусто значение вкачестве ключа - это уже экзотика... везде пишут, что очень не рекомендуеться так делать...

но что будет если для указанного вами примера в каждой таблице-справочнике (таблицы детали1 и детали 2)сделать заглушки.... строки ключ=НУЛ значение(name)=НУЛ... это для того случая когда при связывании по двум айди(полям) одно задано а другое нет

и сразу пример теряет доказательность, что без джоина никуда....

я без юмора, благодарен что внимательно прочитали моё сообщение
Автор: greenpc
Дата сообщения: 14.10.2009 09:23
KurkSS

Цитата:
Взаимно прочитал

тогда в догонку. прочитайте про план разбора запроса (очень часто увидите такую интересную вещь как JOIN), оптимизация.
ну и вообще- то сравнивать join с subquery это как теплое с мягким
перечитал ради интереса Тома Кайта (в силу работы в основном с ораклом)

Цитата:
Use a subquery when you need no columns from the tables referenced in the subquery.
Use a join when you do need some of the columns.

ЗЫ а вы говорите экзотика
Автор: KurkSS
Дата сообщения: 14.10.2009 14:40

Цитата:
тогда в догонку. прочитайте про план разбора запроса (очень часто увидите такую интересную вещь как JOIN), оптимизация.


Оптимизация это круто, только сдесь расговор не о людях у которых не получаеться сделать оптимизацию, а у которых не получаеться хоть както запросить данные....

вы приняли слово экзотика как что-то нереальное... поэтому хочу внести ясность....
я имел ввиду, что тем у кого не получаеться хоть как-то запросить нужные данные, понять сущность реляционной модели и хорошо разобраться с ней как с таковой

а вот потом в теме для супероптимизаторов прочитать чьюто статью, с чего начинаеться супер оптимизация.

ЗЫ
Давайте тогда ещо расмотрим факт оптимизационности СУБД, как приближение их к сетевой модели, и тому у кого не получаеться запросить данные у базы, раскажем как можно используя внутрение языки програмирования(расширения SQL) и оптимизационности добиться супер производительности....
greenpc, предлагаю переехать в личку!

Автор: DarkSmoke
Дата сообщения: 14.12.2009 18:15
А объясните мне такую штуку, делаю SQL запрос

Код:
SELECT Menu.name, Razdel.name FROM `Menu` , `Razdel`
Автор: derelict
Дата сообщения: 14.12.2009 19:07
Надо было дописать условие для связи:

Код:
SELECT Menu.name, Razdel.name FROM `Menu` , `Razdel` WHERE `Menu`.`id`=`Razdel`.`menu_id`
Автор: DarkSmoke
Дата сообщения: 09.01.2010 11:46
Добрый день.
Подскажите, как правильно сделать запрос.
есть таблица новостей:

Код: CREATE TABLE `News` (
`id` int(11) NOT NULL auto_increment,
`title` tinytext,
`news` text NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=19 ;
Автор: dneprcomp
Дата сообщения: 09.01.2010 19:44
DarkSmoke
10 последних новостей

Код: SELECT TOP 10 [чего-нибудь] FROM News ORDER BY date DESC
Автор: DarkSmoke
Дата сообщения: 09.01.2010 20:35
Все хранится в той же таблице. Т.е. Последние 10 новостей мы выводим на страницу а вот уже с 11 по 20 новость помещаем в архив новостей.(Т.е. там типо одни заголовки и дата будет)
Автор: dneprcomp
Дата сообщения: 09.01.2010 20:47
DarkSmoke
Тогда TOP 20 и в коде работы с рекордсетом считаем рекорды. После 10-го показываем только одни заголовки и дату
Автор: SIgor33
Дата сообщения: 11.01.2010 08:50
DarkSmoke
с 11 по 20 новость можно выбрать так

SELECT TOP 20 [чего-нибудь] FROM News
where
id not in (SELECT TOP 10 id FROM News)
ORDER BY date DESC
Автор: dneprcomp
Дата сообщения: 11.01.2010 21:38
SIgor33
Т.e. предлогаете вместо 1 запроса выполнить 3 ?
Можно конечно, но тут уж кому что больше нравится.
Автор: SIgor33
Дата сообщения: 12.01.2010 12:35
dneprcomp
почему 3
все один запрос и один вложенный в сумме =2
Автор: snike555
Дата сообщения: 12.01.2010 17:55
SIgor33
dneprcomp
А вы уверены что от отхватит именно 10 верхних новостей, а не первых попавшихся?
Я бы сделал так:

SELECT TOP 10 "date", "title", "news" FROM (select * from News ORDER BY date DESC)
Union all
SELECT TOP 10 "date", "title", " - " FROM (select * from News where id not in (SELECT TOP 10 id FROM News ORDER BY date DESC) ORDER BY date DESC)
Автор: dneprcomp
Дата сообщения: 12.01.2010 22:50
SIgor33
A получать запросом первые 10 уже не надо?

snike555

Цитата:
А вы уверены что от отхватит именно 10 верхних новостей, а не первых попавшихся?
Я бы сделал так:

А я бы не делал. 'ORDER BY date DESC' для чего стоит?

PS. Честно говоря сбился со счета, сколько всего SELECT-ов в предложенном UNION.
То ли 5, то ли 6.
Первaя строкa вообще черти что делает.
Автор: SIgor33
Дата сообщения: 13.01.2010 08:25
dneprcomp
первые 10 получать можно имеенно как вы написали я только описал вторую часть запроса
Автор: dneprcomp
Дата сообщения: 13.01.2010 09:17
SIgor33
Ну так и получается что для решения всей задачи нужно будет в сумме 3 запроса.
Хотя такой подход тоже имеет право на существование и работать будет. В какой-то степени даже оригинальное решение.
Автор: MbIJIO
Дата сообщения: 13.01.2010 10:06
подскажите как создать план выполнения запроса.
запрос такой

select "Практика", "Руководитель", вид
from
(
select о.Название"Практика", л.Фамилия"Руководитель", в.вид, count(р.id_вида_практики) PR,
max(count(р.id_вида_практики)) over (partition by о.Название,л.Фамилия) maxPR

from Результ_практ р,Люди л, Контактные_лица к, Объект_практики о, вид_практики в

where р.ID_вида_практики=в.ID_вида_практики and р.id_контакт_лица=к.id_контакт_лица
and л.id_человека=к.id_человека and р.id_объекта_пр=о.id_объекта_пр
group by о.Название,л.Фамилия, в.вид

) qw
where pr=maxPR

по возможности расскажите если кто знает как это делать в ORACLE DATABASE 10g EXPRESS EDITION

Автор: SIgor33
Дата сообщения: 13.01.2010 15:15
dneprcomp
Извените, что ложанулся не посчитав первый запрос. Согласен три запроса
Автор: dneprcomp
Дата сообщения: 24.02.2010 05:34
Делаю INSERT. Sourse - текстовый файл. База - MS SQL Server. Одно из полей в файле - ID, вида 000012345
Как количество 0, так и цифр - величина переменная.

1.Необходимо сравнить с имеющимися ID в table и если уже такое ID есть, то, во избежание дубликатов, последовательно заменять нули на 1,2,3 и т.д. с постоянной проверкой на существование.
Что можно использовать, кроме cursor?
Автор: SerBUser
Дата сообщения: 18.03.2010 05:29
Есть две таблицы с одинаковыми полями. Не могу сообразить - как написать sql-запрос, чтоб данные выводились из обеих таблиц последовательно, т.е. сначала из одной таблицы, потом из другой. Подскажите, плиз - как сделать?
Автор: dneprcomp
Дата сообщения: 18.03.2010 05:37
SerBUser

Используй UNION

Код: SELECT * FROM table1
UNION
SELECT * FROM table2

Страницы: 1234567891011121314

Предыдущая тема: Строковый параметр в REG_BINARY


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.