Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / "Тройной" запрос ... / 9 сообщений из 9, страница 1 из 1
28.06.2001, 12:09
    #32008568
AlexUnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
Привет всем!
Подскажите, а то ничего в голову уже не лезет У меня есть прайс, который реализован в виде двух таблиц, одна из которых - название и вид прайса, другая - позиции прайса. Соотвественно эти таблицы связаны по ID. Я формирую список товара, в котором берется номенклатурная позиция и цепляются к ней три вида цен (каждый из своего прайса). Беда в том, что прайсы могут быть неоднородными по составу, т.е. в одном данная номенклатурная позиция имеется, а в другом - нет. Как мне составить запрос, который выводил бы все позиции номенклатуры с тремя ценами, но в случае отсутствия одной из цен проставлял бы нули? Что-то типа:
CREATE VIEW price_records AS
SELECT detail, p_r1.price, p_r2.price, p_r3.price,
FROM detail d INNER JOIN
price_rec p_r ON d.detail_id = p_r.detail_id AND
INNER JOIN
price_rec p_r1 ON d.detail_id = p_r1.detail_id AND
INNER JOIN
price_rec p_r2 ON d.detail_id = p_r2.detail_id AND
INNER JOIN
price_rec p_r3 ON d.detail_id = p_r3.detail_id AND
d.base_id = p_r3.base_id
WHERE (p_r1.price_id = 'Прайс 1') AND (p_r2.price_id = 'Прайс 2') AND
(p_r3.price_id = 'Прайс 3')
В этом запросе у меня выводятся лишь позиции со тремя непустыми ценами
(detail - справочник номенклатуры, price_rec - вид с записями прайсов, detail_id - идентификатор номенклатуры, name - наименование номенклатуры, price - цена)
...
Рейтинг: 0 / 0
28.06.2001, 12:18
    #32008569
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
SELECT detail, isnull(p_r1.price,0), isnull(p_r2.price,0), isnull(p_r3.price,0)
FROM detail d INNER JOIN
price_rec p_r ON d.detail_id = p_r.detail_id AND
LEFT JOIN
price_rec p_r1 ON d.detail_id = p_r1.detail_id AND
Left JOIN
price_rec p_r2 ON d.detail_id = p_r2.detail_id AND
Left JOIN
price_rec p_r3 ON d.detail_id = p_r3.detail_id AND
d.base_id = p_r3.base_id
WHERE (p_r1.price_id = 'Прайс 1') AND (p_r2.price_id = 'Прайс 2') AND
(p_r3.price_id = 'Прайс 3')
...
Рейтинг: 0 / 0
28.06.2001, 13:10
    #32008580
AlexUnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
2 Dmitry
Спасибо. Один вопрос - а не выдаст ли данный запрос по отдельной строке на каждый вид цены, типа:
Наименование Цена1 Цена2 Цена3
шина 1000 0 0
шина 0 1000 0
шина 0 0 1000
Или я чего-то не понимаю?
...
Рейтинг: 0 / 0
28.06.2001, 13:13
    #32008581
AlexUnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
2 Admin
А зачем убираются пробелы из строчек? Иногда они бывают нужны...
...
Рейтинг: 0 / 0
29.06.2001, 08:52
    #32008619
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
Во-первых, извиняюсь за неточности, но с другой стороны я не проверял Ваш запрос, потому как Вы написали что он работает, хотя если посмотреть повнимательней, то возникает вопрос как это вообще работает конструкция
"price_rec p_r1 ON d.detail_id = p_r1.detail_id AND
INNER JOIN"
(and перед join-ом)
--------------------------------------
Решение в нормальном виде:
create table detail (detail_id int, detail varchar(100))
create table price_rec (price_id varchar(40),detail_id int, price int)
insert into detail values(1,'Memory')
insert into detail values(2,'Processor')
insert into detail values(3,'Monitor')
insert into price_rec values('Прайс1',1,4)
insert into price_rec values('Прайс2',1,3)
insert into price_rec values('Прайс3',1,6)
insert into price_rec values('Прайс1',2,4)
insert into price_rec values('Прайс3',2,4)
--------------------------------------------
SELECT detail, isnull(p_r1.price,0) as price1, isnull(p_r2.price,0) as price2 , isnull(p_r3.price,0) as price3
FROM detail d left JOIN
price_rec p_r1 ON d.detail_id = p_r1.detail_id and p_r1.price_id = 'Прайс1'
Left JOIN
price_rec p_r2 ON d.detail_id = p_r2.detail_id and p_r2.price_id = 'Прайс2'
Left JOIN
price_rec p_r3 ON d.detail_id = p_r3.detail_id and p_r3.price_id = 'Прайс3'
--------------------------------------------------
Результат:

Memory 4 3 6
Processor 4 0 4
Monitor 0 0 0

Я так понимаю это и требовалось
...
Рейтинг: 0 / 0
29.06.2001, 12:09
    #32008627
AlexUnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
2 Dmitry
OK! Это мне и требовалось, большое Вам спасибо!
...
Рейтинг: 0 / 0
29.06.2001, 12:12
    #32008628
AlexUnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
PS Насчет AND перед INNER JOIN - извини погорячился, обрезая полную версию вида
...
Рейтинг: 0 / 0
02.07.2001, 14:14
    #32008730
am (a_mitin)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
... а как это здорово в Access-SQL с помощью TRANSFORM и PIVOT решается... эх...
...
Рейтинг: 0 / 0
03.07.2001, 05:16
    #32008743
AlexUnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Тройной" запрос ...
2 am (a_mitin)
В том-то и дело, большиство моих задач в прошлом были реализованы именно на Access. Теперь пришло время пожинать плоды В тех организациях, где число пользователей и размеры информации не сильно возросли, Access еще справляется, но этим лучше не обольщаться... По различным историям непредсказуемого краха БД на Access мне можно уже сочинять мемуары
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / "Тройной" запрос ... / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]