Rambler's Top100
, : |

! : http://dreamweaver.net.ru/new-forum/

| FAQ | | |

Сложный запрос - 2

 
  ,         .     ,        .     Форум Macromedia Dreamweaver -> Динамические страницы
 
Никита
Новичок

Новичок


: 36

: 05.05.2007
: 26

: 15, 2007 7:13 am     : Сложный запрос - 2

Привет! Есть БД. Первая таблица содержит (к примеру) поля Наименование и Вариант. Например: наименованию "диван" соответствуют артикулы 001, 002, 003 (несколько записей) и т.д, т.е. все возможные варианты исполнения для данного наименования. Во второй таблице поля Вариант и Количество - например: 002, 007 и т.д. - им соответствуют записи 3, 5 и т.д. Есть такой запрос:

select
*
from
[таблица_1]
where
[наименование] = "диван"
and [вариант] in (select [вариант] from [таблица_2])

Он выводит значения из второй таблицы - те, которые якобы есть в наличии. Но мне нужно, чтобы также выводились значения поля количество. В коде, что я привел, нельзя изымать больше одного поля. Подскажите новичку...
OldFornit
Модератор

Модератор


: 36

: 12.05.2005
: 846

: 16, 2007 3:44 pm     :

задачка интересная и достаточно нетривиальная )

Я мог бы предложить вот такое -
SELECT [таблица_1].[наименование], [таблица_2].[количество]
FROM [таблица_1], [таблица_2]
WHERE
[таблица_1].[наименование] = "диван"
AND [таблица_1].[вариант] IN (SELECT [таблица_2][вариант] FROM [таблица_2])

Но! Это не совсем правильно. Как я вижу, у Вас неграмотно составлены отношения между таблицами.
Я бы предложил сделать такое -

Таблица 1:
id Наименование

Таблица 2:
id id_N Вариант Количество
Где id_N - это ссылка на id из таблицы 1.

Таким образом у нас получилось 2 таблицы с отношением "один-ко-многим".
Так как у нас одному варианту изделия соответствует только одно количество, то такое распределение будет более грамотным.
И запрос в этом случае получится гораздо более простым.
А по полям id и id_N можно нарисовать индексы и тогда скорость работы с БД будет просто впечатляющей
А в том запросе, который привел я, возможно придется еще использовать GROUP BY
OldFornit
Модератор

Модератор


: 36

: 12.05.2005
: 846

: 16, 2007 3:51 pm     :

ах да, в случае, если структура таблицы будет вышеприведенной, то запрос будет таким -

[code:1:6244661c95]
SELECT таблица1.Наименование, таблица2.вариант, таблица2.количество
FROM таблица1, таблица2
WHERE таблица1.наименование="диван"
AND таблица2.id_N=таблица1.id;[/code:1:6244661c95]

Если мои мозги под конец рабочего дня не сплавились, то вот так вот...[/code]
OldFornit
Модератор

Модератор


: 36

: 12.05.2005
: 846

: 16, 2007 3:56 pm     :

а сложный запрос - это вот такое Wink -

[code:1:27ce6cee73]
CREATE OR REPLACE FUNCTION count_traff()
RETURNS bool AS
$BODY$
DECLARE
this_day timestamp;
sum_in integer;
sum_out integer;
gor_in integer;
gor_out integer;
mir_out integer;
mir_in integer;
iface varchar(32); -- интерфейс, по которому считается трафик.
max_id integer;
BEGIN

-- считываем id, вплоть по который работаем;
SELECT INTO max_id this_id();

-- считываем ифейс, с которым пашем
SELECT INTO iface "value" FROM system WHERE "parametr"='iface';

-- получаем дату, с которой будем работать
SELECT INTO this_day TIMESTAMP WITH
TIME ZONE 'epoch' + (SELECT min(ulog.oob_time_sec)
FROM ulog) * INTERVAL '1 second';

-- проверяем в таблице суммирования трафика наличие записи для полученной даты
-- если нет - создаем
IF NOT count_if() THEN
INSERT INTO traff_day("date") VALUES (date_trunc('day',this_day));
END IF;

-- суммируем трафик общий входящий
SELECT INTO sum_in sum(ip_totlen) FROM ulog WHERE
oob_in = iface
AND id <= max_id;

-- суммируем трафик общий исходящий
SELECT INTO sum_out sum(ip_totlen) FROM ulog WHERE
oob_out = iface
AND id <= max_id;

-- суммируем трафик по миру входящий
--примечание относительно функции inetntoa:
--её используем в случае ,если заливали тиблицу ulog из состава ulogd без
--изменений. Если мы озаботились заранее и задали запись адресов назначения
--и источника в формате inet, то функцию не используем. Пример:
-- (SELECT 'true'::boolean FROM ip_city WHERE NOT
-- ulog.ip_saddr << ip_city.ip_addr
-- LIMIT 1);
-- суммируем трафик по городу входящий
SELECT INTO gor_in sum(ip_totlen) FROM ulog WHERE
id <= max_id AND
oob_in=iface AND
(SELECT 'true'::boolean FROM ip_city WHERE
inet_ntoa(ulog.ip_saddr)::inet << ip_city.ip_addr
LIMIT 1);

-- суммируем трафик по городу исходящий
SELECT INTO gor_out sum(ip_totlen) FROM ulog WHERE
id <= max_id AND
oob_out=iface AND
[/code:1:27ce6cee73]
Никита
Новичок

Новичок


: 36

: 05.05.2007
: 26

: 16, 2007 3:58 pm     :

Огромное спасибо! Но вариант с id и id_N думаю не прокатит. Потому что предполагается, что вторая таблица - это прайс с большим числом записей, которая обновляется ежедневно. И, мне кажется, создавать id_N займет очень много времени. А вот первый вариант, думаю, то что надо. Попробую дома. Спасибо!
Никита
Новичок

Новичок


: 36

: 05.05.2007
: 26

: 16, 2007 3:59 pm     :

ОГО! Shocked
OldFornit
Модератор

Модератор


: 36

: 12.05.2005
: 846

: 16, 2007 4:06 pm     :

Никита ():
Огромное спасибо! Но вариант с id и id_N думаю не прокатит. Потому что предполагается, что вторая таблица - это прайс с большим числом записей, которая обновляется ежедневно. И, мне кажется, создавать id_N займет очень много времени. А вот первый вариант, думаю, то что надо. Попробую дома. Спасибо!


Гм. Я хоть и не очень сильный DBA, но вопрос - почему это создание id_N займет много времени? Если это лишь ссылка на id из таблицы наименований.
И в таблицу вставляться id_N будет (и должен) автоматически при создании новой записи вариантов
Никита
Новичок

Новичок


: 36

: 05.05.2007
: 26

: 16, 2007 4:09 pm     :

Просто это я слабый DBA. Наверное Вы правы. Буду изучать...
Никита
Новичок

Новичок


: 36

: 05.05.2007
: 26

: 17, 2007 7:14 am     :

Первый код, который Вы привели - не работает (не могу даже разобраться почему). А вот второй - то, что надо. Можно даже без id.

SELECT таблица1.Наименование, таблица2.вариант, таблица2.количество
FROM таблица1, таблица2
WHERE таблица1.наименование="диван"
AND таблица2.вариант=таблица1.вариант;

Только не пойму - по идее, в последней строке должны быть кавычки (потому что это текст), а с кавычками не работает. И еще: нужно отсортировать по возрастанию, но если добавляю sort by таблица2.вариант ASC, ошибка...
OldFornit
Модератор

Модератор


: 36

: 12.05.2005
: 846

: 17, 2007 9:39 am     :

значит, рабочий день тогда окончательно сьел мой моск Wink
diesel_den
Новичок

Новичок


: 33

: 01.03.2008
: 6

: 20, 2008 11:50 am     :

Никита ():
Только не пойму - по идее, в последней строке должны быть кавычки (потому что это текст), а с кавычками не работает.

А обычно используются одинарные ковычки.
Лично я двойными в таких случаях не пользуюсь.
:   
  ,         .     ,        .     Форум Macromedia Dreamweaver -> Динамические страницы : GMT + 2
1 1

 


Powered by phpBB © 2001, 2005 phpBB Group
phpBB


/ : 136703 / 0

Rambler's Top100 @Mail.ru