Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Открыть новую тему     Написать ответ в эту тему

dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noobofthenoobs
Честно говоря, не знаю что лучше. Оба подхода сработают. Вариант с concat лично мне кажется несколько устаревшим и тяжеловесным. Но это вcего лишь исключительно мнение.

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 23:05 03-01-2011
DarkSmoke



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день
подскажите, что быстрее, два запроса, или один?

Код:
 
SELECT * FROM `company` WHERE `city_id`=(SELECT `id` FROM `cities` WHERE `name_en`='dnepropetrovsk')
 
SELECT `id` FROM `cities` WHERE `name_en`='dnepropetrovsk'
SELECT * FROM `company` WHERE `city_id`='2'
 


----------
Абонентское обслуживание и ремонт компьютеров в Днепропетровске

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 19:12 10-01-2011
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DarkSmoke
 
Оба предложенных варианта используют два запроса.
Но два раздельных(второй случай) будут выполняться быстрее. Особенно при наличии индексов на  
cities.id,  company.city_id, cities.name_en  
Пример одного запроса:

Код:
SELECT *  
FROM company INNER JOIN cities ON cities.id = company.city_id  
WHERE  cities.name_en = 'dnepropetrovsk'

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 19:22 10-01-2011 | Исправлено: dneprcomp, 19:34 10-01-2011
kniazkinP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу помощи вот с таким запросом интересным Есть определенные поля: Фио, место выдачи (москва, самара..), соц.статус (учащийся, работающий..) Как видно, они не содержат чисел. А мне надо  сколько (например) студентов(это социальный статус его) в городе 1, в городе 2..; сколько работающих(это социальный статус его) в городе 1, в городе 2. Вот скрин кусочка базы и таблицы готовой в Excel (для примера)  

Делаю вот так
Код:
Select count(Fam2) as Students,MESTO7 as RaionVidachi from ':1Samara23:All.dbf' where SOZ8='Студент' Group By MESTO7;
Select count(поле_фамилия),поле_место_жительства from ':1Samara23:All.dbf' where поле_социальный статус='Студент' Group By поле_место_жительства;
 

Получается 2 столбца    
- в первом количество студентов, а во втором место жительства. Как сделать ещё столбцы - студент, работающий, выпускник и тоже по городам?

Всего записей: 26 | Зарегистр. 16-01-2011 | Отправлено: 11:01 25-01-2011
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kniazkinP
Введём, для краткости , названия полей: status - соц.статус, place - место выдачи, в базе данных mybase (запрос в формате Access)

Код:
 
Select T1.Place, FStudend, FWork, FOut
From (((Select place from mybase group by place) As T1 Left Join
(Select place, Count(status) As FStudend From mybase Where status = "студент" group by place) As T2
On T1.place = T2.Place) Left Join
(Select place, Count(status) As FWork From mybase Where status = "работающий" group by place) As T3
On T1.place = T3.place) Left Join
(Select place, Count(status) As FOut From mybase Where status = "выпускник" group by place) As T4
On T1.place = T4.place;
 

И так далее можно собирать

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 03:45 26-01-2011
kniazkinP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AndVGri
Спасибо! Сегодня дома попробую отпишусь!
Вот попробывал.. Совсем не работает..
Код:
 
Select T1.place, FStudend, FWork, FOut  
From (((Select place from ':1Samara23:All.dbf' group by MESTO7) As T1 Left Join  
(Select MESTO7, Count(SOZ8) As FStudend From ':1Samara23:All.dbf' Where status = "Студент" group by MESTO7) As T2  
On T1.place = T2.Place) Left Join  
(Select MESTO7, Count(SOZ8) As FWork From ':1Samara23:All.dbf' Where status = "Работающий" group by MESTO7) As T3  
On T1.place = T3.place) Left Join  
(Select MESTO7, Count(status) As FOut From ':1Samara23:All.dbf' Where status = "Выпускник" group by place) As T4  
On T1.place = T4.place;
 

Может я где - то ошибаюсь, но в данном коде (пишу запрос в Delphi в SQL)
Код:
Select T1.place, FStudend, FWork, FOut

выбираются поля T1.place-обозначается как место, FStudend-студент, FWork-работающий и т.д. Но самих по себе таких полей нету, это значения столбца SOZ8-социальный статус.. Я ещё пробывал вот так -  

Код:
Select count(Fam2) as Students, MESTO7 as RaionVidachi, SOZ8 as Status from ':1Samara23:All.dbf' Group By MESTO7,SOZ8;

Получил вот что- . Надеюсь подскадите как переделать

Всего записей: 26 | Зарегистр. 16-01-2011 | Отправлено: 14:10 26-01-2011 | Исправлено: kniazkinP, 15:57 26-01-2011
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kniazkinP

Цитата:
Но самих по себе таких полей нету


Код:
 
(Select MESTO7, Count(SOZ8) As FStudend From ':1Samara23:All.dbf' Where status = "Студент" group by MESTO7) As T2  
 

Этот подзапрос и содержит поле FStudent
 
 Сам запрос, приведённый мною для примера,  сбор (объединение) нескольких подзапросов T1, T2, T3, T4 в одну таблицу
Проблемы могут быть в следующем (как я писал запрос под Access):
1. убери ; в запросах из сред программирования не нужна (по идее - должно быть исключение, о неправильной строке запроса)
2. 'студент' и прочие строковые константы должны быть в одинарных кавычках
3. place и status - разве названия твоих полей в таблице :1Samara23:All.dbf? Я же написал, что обозвал так для упрощения написания примера
4. As T1 и т. д. (псевдоним подзапроса) может иметь другой синтаксис. Например, в Oracle слово As не используется
5. Возможно объединение ключевыми словами Left Join не поддерживается драйвером dbf, значит надо смотреть как организовать левое объединение в этом случае
 

Цитата:
Select count(Fam2) as Students, MESTO7 as RaionVidachi, SOZ8 as Status from ':1Samara23:All.dbf' Group By MESTO7,SOZ8;  

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

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 06:40 27-01-2011
kniazkinP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AndVGri
Сделал вот так-
Код:
Select T1.MESTO7, FStudend, FWork, FOut  
From (((Select  MESTO7 from ':1Samara23:All.dbf' group by MESTO7) As T1 Left Join  
(Select MESTO7, Count(SOZ8) As FStudend From ':1Samara23:All.dbf' Where status = "Студент" group by MESTO7) As T2  
On T1. MESTO7 = T2. MESTO7) Left Join  
(Select MESTO7, Count(SOZ8) As FWork From ':1Samara23:All.dbf' Where status = "Работающий" group by MESTO7) As T3  
On T1. MESTO7 = T3. MESTO7) Left Join  
(Select MESTO7, Count(SOZ8) As FOut From ':1Samara23:All.dbf' Where status = "Выпускник" group by MESTO7) As T4  
On T1.MESTO7 = T4.MESTO7);

Ругается на select вот на это место
Код:
From (((Select  MESTO7 from


Цитата:
4. As T1 и т. д. (псевдоним подзапроса) может иметь другой синтаксис. Например, в Oracle слово As не используется

Вот тут согласен, готов почитать, но не понимаю в какой это теме найти Есть книжечка по SQL вот сижу по вечерам штудирую, там написано про left join, но не указано где и как оно работает. Я свою базу делаю в Delphi на BDE, если что.

Всего записей: 26 | Зарегистр. 16-01-2011 | Отправлено: 12:28 27-01-2011
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kniazkinP

Код:
with t as (select 'место1' place, 'студент' b from dual
union all
select 'место1' place, 'студент' b from dual
union all
select 'место1' place, 'работающий' b from dual
union all
select 'место2' place, 'работающий' b from dual)
select place, (select count(t1.b)  from t t1 where t1.b='студент' and t1.place=t.place) "студент",
(select count(t1.b)  from t t1 where t1.b='работающий' and t1.place=t.place) "работающий" from t group by place;

 
нужное выделено жирным

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 09:20 31-01-2011 | Исправлено: greenpc, 09:21 31-01-2011
kniazkinP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc
Ввёл в query вот что:

Код:
select MESTO7,  
(select count(SOZ8.b)  
from ':1:all.dbf' t1 where SOZ8.b='Студент' and t1.MESTO7=t.MESTO7),
(select count(SOZ8.b) from ':1:all.dbf' t1 where t1.SOZ8='Работающий'  
and t1.MESTO7=t.MESTO7) from ':1:all.dbf' group by MESTO7;

Выдает ошибку - Invalid field name. b.
t1.b - это я так понимаю вроде псевдонима?
И для чего вот это?  

Код:
 
with t as (select 'место1' place, 'студент' b from dual  
union all  
select 'место1' place, 'студент' b from dual  
union all  
select 'место1' place, 'работающий' b from dual  
union all  
select 'место2' place, 'работающий' b from dual)

 
Добавлено:
Кстати, если оставляю  

Код:
t.place) "студент",
 
t.place) "работающий" from t
 

то пишет ошибку тут..

Всего записей: 26 | Зарегистр. 16-01-2011 | Отправлено: 12:31 01-02-2011
kniazkinP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
select MESTO7, (select count(t1.SOZ8) from 2009 t1 where t1.SOZ8='Студент'),  
(select count(t1.SOZ8)  from 2009 t1 where t1.SOZ8='Работающий') from 2009 group by MESTO7;

Вот так практически правильно.. Не понимаю куда вот это деть -
Код:
and t1.place=t.place) "студент",
 
Тоже ругается на ошибки. А посчитал и построил правильно но только сделал в общем а не для каждого города, что в принципе то и понятно почему.. Как бы это решить?

Всего записей: 26 | Зарегистр. 16-01-2011 | Отправлено: 12:58 02-02-2011
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kniazkinP
вместо t название таблицы (у меня это была виртуальная таблица которая создается не выделенным текстом)
т.е.  

Код:
select MESTO7, (select count(t1.SOZ8) from 2009 t1 where t1.SOZ8='Студент' and t1.MESTO7=t.MESTO7),  
(select count(t1.SOZ8)  from 2009 t1 where t1.SOZ8='Работающий' and t1.MESTO7=t.MESTO7) from 2009 t group by t.MESTO7;  

 
ЗЫ: код нужно понимать и использовать полностью.

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 13:17 03-02-2011 | Исправлено: greenpc, 13:36 03-02-2011
Jakoni

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здраствуйте !
Не подскажете как с помощью запроса сравнить два значения в таблице допустим min_kolichestvo  и kolichestvo

Всего записей: 5 | Зарегистр. 22-01-2007 | Отправлено: 15:44 16-02-2011
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jakoni

Код:
select * from table where min_kolichestvo =kolichestvo

какой вопрос- такой ответ

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 15:54 16-02-2011
Jakoni

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Опишу подробнее поставленную задачу, есть таблица в которой есть поля kod, name, kolichestvo, min_kolichestvo необходимо чтоб два раза в день проверялись значения kolichestvo и min_kolichestxo, и если значение из поля kolichestvo будет меньше min_kolichestvo. необходимо выполнить хранимую процедуру которая отправляет письмо с уведомлением

Всего записей: 5 | Зарегистр. 22-01-2007 | Отправлено: 17:10 16-02-2011
DenisConqueror

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сделайте jobs на сервере, который 2 раза в день будет сравнивать и выполнять, если надо.

Всего записей: 19 | Зарегистр. 17-05-2009 | Отправлено: 01:07 17-02-2011
chel78



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Привет,
 подскажите плз, как можно из сервера Oracle, через SQL на локальную машину вытаскивать в файл отчеты, через spool? я слышал что как то через батник, но как не в курсе
например такая SQL
 

Код:
spool test.xls;
set linesize 200;
set pagesize 1000;
 select SYSNAM, SYSDSC, VALUE from syspar;

Всего записей: 124 | Зарегистр. 19-01-2007 | Отправлено: 17:24 21-02-2011 | Исправлено: chel78, 17:25 21-02-2011
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
chel78
например так:
файл Test.sql

Код:
SET ECHO OFF  
SET NEWPAGE 0  
SET SPACE 0  
SET PAGESIZE 0  
SET FEEDBACK OFF  
SET HEADING OFF  
SET TRIMSPOOL ON  
SET TAB OFF  
Select owner || ';' || object_name From all_objects;  
QUIT

и с командной строки
sqlplus user/pass@tnsname @test.sql >testresult.txt

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 11:44 22-02-2011
chel78



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
SET ECHO OFF  
SET NEWPAGE 0  
SET SPACE 0  
SET PAGESIZE 0  
SET FEEDBACK OFF  
SET HEADING OFF  
SET TRIMSPOOL ON  
SET TAB OFF  
Select owner || ';' || object_name From all_objects;  
QUIT  
 
где здесь дорога к серверу, с логином/пассом?
 

Цитата:
sqlplus

 
а если не sqlplus?
 
для доступа к серверу, требуется логин/пасс..

Всего записей: 124 | Зарегистр. 19-01-2007 | Отправлено: 11:59 22-02-2011
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
chel78
я что-то не понимаю что Вы хотите.

Цитата:
где здесь дорога к серверу, с логином/пассом?  

дорога, как Вы выразились, в команде sqlplus.  
идет коннект и выполение sql с выводом форматированного текста в файл

Цитата:
а если не sqlplus

а каким способом Вы попадаете на сервер? или у вас нет логина-пароля?

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 16:01 22-02-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru