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

» SQL запрос

Автор: AndVGri
Дата сообщения: 23.12.2010 02:07
yarrr
А по конкретнее, можно?
Если не выводить из 2 таблицы встречающиеся id, то что тогда из неё выводить? Связывать то по чему?
И не встречающиеся во 2 таблице id, в которой не должны встречаться в 1 или в 3?
Если выводить данные только из 1 и 3, не имеющие id во второй, то

Select tab1.*, tab3.* From tab1 Inner Join tab3 On (tab1.id = tab3.id)
Where (tab1.id Not In (Select id From tab2)) And (tab3.id Not In (Select id From tab2))

P. S. Если база данных не поддерживает Inner Join, то соединение tab1 и tab3 в Where
Автор: yarrr
Дата сообщения: 23.12.2010 08:18
AndVGri

Выводить нужно id из 3табл, не встречающиеся во 2й. а по первой просто сортировать.
Автор: AndVGri
Дата сообщения: 23.12.2010 08:34
yarrr
Select tab1.*, tab3.* From tab1 Inner Join tab3 On (tab1.id = tab3.id)
Where tab3.id Not In (Select id From tab2) Order By tab1.last_name
или без Join
Select tab1.*, tab3.* From tab1, tab3
Where (tab1.id = tab3.id) And (tab3.id Not In (Select id From tab2)) Order By tab1.last_name
Автор: noobofthenoobs
Дата сообщения: 23.12.2010 13:07
День добрый. Изобрел тут велосипед, можно ли как-то упростить следующую хранимку:


Код:
PROCEDURE `mybase`.testproc_safe2(IN param1 VARCHAR(255), IN param2 VARCHAR(255))
BEGIN SET @query = 'SELECT field1 FROM test_table WHERE ';
SET @param1 = param1;
SET @param2 = param2;

IF param1 IS NOT NULL Then
SET @query = CONCAT(@query, 'criteria1 = ? ');
ELSE SET @query = CONCAT(@query, '? IS NULL ');
END IF;

IF param2 IS NOT NULL Then
SET @query = CONCAT(@query, 'AND criteria2 = ? ');
ELSE SET @query = CONCAT(@query, 'AND ? IS NULL '); END IF;

PREPARE stmt FROM @query;
EXECUTE stmt USING @param1, @param2;
DEALLOCATE PREPARE stmt;
END
Автор: mdid
Дата сообщения: 23.12.2010 14:00
noobofthenoobs
если уж все так попробуйте поюзать IsNull
Автор: greenpc
Дата сообщения: 23.12.2010 16:05
noobofthenoobs

Цитата:
Вот можно ли как-то упростить

1.не использовать процедуру
ведь всеравно собираете динамику.
2. передать готовый where одним параметром
3. передать все параметры одной строкой с разделителями
и распарсить в процедуре циклом
Автор: dneprcomp
Дата сообщения: 23.12.2010 19:22
noobofthenoobs
Попробуй использовать param непосредственно в WHERE без парсинга. Просто передав все параметры в процедуру и создав блок [ CASE WHEN ] для каждого param
Код:
SELECT field1 FROM test_table

WHERE 1 = 1

AND CASE WHEN param1 IS NULL THEN 1
ELSE CASE WHEN [some_fields] = param1 THEN 1
ELSE 0 END END = 1

AND CASE WHEN param2 IS NULL THEN 1
ELSE CASE WHEN [some_fields] = param2 THEN 1
ELSE 0 END END = 1
Автор: yarrr
Дата сообщения: 23.12.2010 23:17
AndVGri
Выводит одну и туже запись несколько раз. пытался сделать без Join
может это потому что в tab2 могут быть (есть ) пустые поля id?

хотя нет, просите назнаю как удалить сообщение. все завелось. спасибо огромное.
Автор: noobofthenoobs
Дата сообщения: 02.01.2011 19:48
dneprcomp
Спасибо за вариант. Подскажите какие +/- у case-подхода, а какие у prepare+concat (не обязательно как выше у меня, а например так как ниже) или это просто больше дело вкуса?


Цитата:

PROCEDURE `mybase`.proc_prep(IN param1 VARCHAR(255), IN param2 VARCHAR(255))
BEGIN

SET @query = 'SELECT field1 FROM test_table WHERE 1=1';

IF param1 IS NOT NULL Then
SET @query = CONCAT(@q, ' AND criteria1 = ', param1);
END IF;

IF param2 IS NOT NULL Then
SET @query = CONCAT(@query, ' AND criteria2 = ', param2);
END IF;

PREPARE stmt FROM @query;

EXECUTE stmt;

END
Автор: dneprcomp
Дата сообщения: 03.01.2011 22:05
noobofthenoobs
Честно говоря, не знаю что лучше. Оба подхода сработают. Вариант с concat лично мне кажется несколько устаревшим и тяжеловесным. Но это вcего лишь исключительно мнение.
Автор: DarkSmoke
Дата сообщения: 10.01.2011 18:12
Добрый день
подскажите, что быстрее, два запроса, или один?

Код:
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'
Автор: dneprcomp
Дата сообщения: 10.01.2011 18:22
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'
Автор: kniazkinP
Дата сообщения: 25.01.2011 10:01
Прошу помощи вот с таким запросом интересным Есть определенные поля: Фио, место выдачи (москва, самара..), соц.статус (учащийся, работающий..) Как видно, они не содержат чисел. А мне надо сколько (например) студентов(это социальный статус его) в городе 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 поле_место_жительства;
Автор: AndVGri
Дата сообщения: 26.01.2011 02:45
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;
Автор: kniazkinP
Дата сообщения: 26.01.2011 13:10
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;
Автор: AndVGri
Дата сообщения: 27.01.2011 05:40
kniazkinP

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


Код:
(Select MESTO7, Count(SOZ8) As FStudend From ':1Samara23:All.dbf' Where status = "Студент" group by MESTO7) As T2
Автор: kniazkinP
Дата сообщения: 27.01.2011 11:28
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);
Автор: greenpc
Дата сообщения: 31.01.2011 08:20
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;

Автор: kniazkinP
Дата сообщения: 01.02.2011 11:31
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;
Автор: kniazkinP
Дата сообщения: 02.02.2011 11:58

Код: 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;
Автор: greenpc
Дата сообщения: 03.02.2011 12:17
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;
Автор: Jakoni
Дата сообщения: 16.02.2011 14:44
Здраствуйте !
Не подскажете как с помощью запроса сравнить два значения в таблице допустим min_kolichestvo и kolichestvo
Автор: greenpc
Дата сообщения: 16.02.2011 14:54
Jakoni

Код: select * from table where min_kolichestvo =kolichestvo
Автор: Jakoni
Дата сообщения: 16.02.2011 16:10
Опишу подробнее поставленную задачу, есть таблица в которой есть поля kod, name, kolichestvo, min_kolichestvo необходимо чтоб два раза в день проверялись значения kolichestvo и min_kolichestxo, и если значение из поля kolichestvo будет меньше min_kolichestvo. необходимо выполнить хранимую процедуру которая отправляет письмо с уведомлением
Автор: DenisConqueror
Дата сообщения: 17.02.2011 00:07
сделайте jobs на сервере, который 2 раза в день будет сравнивать и выполнять, если надо.
Автор: chel78
Дата сообщения: 21.02.2011 16:24
Привет,
подскажите плз, как можно из сервера Oracle, через SQL на локальную машину вытаскивать в файл отчеты, через spool? я слышал что как то через батник, но как не в курсе
например такая SQL


Код: spool test.xls;
set linesize 200;
set pagesize 1000;
select SYSNAM, SYSDSC, VALUE from syspar;
Автор: greenpc
Дата сообщения: 22.02.2011 10:44
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
Автор: chel78
Дата сообщения: 22.02.2011 10:59

Код: 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
Автор: greenpc
Дата сообщения: 22.02.2011 15:01
chel78
я что-то не понимаю что Вы хотите.

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

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

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

а каким способом Вы попадаете на сервер? или у вас нет логина-пароля?
Автор: chel78
Дата сообщения: 28.02.2011 08:44
Привет, подскажите в чем бок.
в MS Query есть запрос с переменной,

при обновлении появляется окошко для ввода переменной(дата), ввожу дату,

жму выполнение, и далее выпадает ошибка.

на другом компе этот же файл - работает на ура...

Страницы: 1234567891011121314

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


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