Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Where D. Id IS NULL




 

в выборке останется только 3#Александр, так как у него не назначен департамент.

рис. Left outer join с фильтрацией по полю


RIGHT OUTER JOIN вернет полный список департаментов (правая таблица) и сопоставленных пользователей.


SELECT u.id, u.name, d.name AS d_name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id

 


id name d_name
-- -------- ---------
1 Владимир Сейлз
2 Антон Поддержка
4 Борис Поддержка
NULL NULL Финансы
5 Юрий Логистика

 

Дополнительно можно отфильтровать данные, проверяя их на NULL.


SELECT d.id, d.name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
WHERE u.id IS NULL

 

В нашем примере указав WHERE u.id IS null, мы выберем департаменты, в которых не числятся пользователи. (3#Финансы)


Все примеры вы можете протестировать здесь:

SQLFiddle


Self joins

Так называемая выборка с замыканием на себя (и совсем не closure). Нужна нам, если необходимо выбрать более одного
значения из таблицы для нескольких условий.

Имеем: набор фильтров для информации, значения которых сохраняются в табличке filts_data.
Необходимо: фильтровать продукты по дате, артикулу и имеющимся фильтрам


CREATE TABLE filts_data
(
id serial NOT NULL,
fid integer NOT NULL, -- product_item.id
value integer NOT NULL, -- значение фильтра filts_items.id
pid integer NOT NULL -- фильтр filts.id
)

 

Есть таблица условных товаров product_item


CREATE TABLE product_item
(
id serial NOT NULL,
section_id integer,
date timestamp,
art text,
title text
)

 

Пример: выбрать записи, добавленные после 17/01/2009 и с установленными фильтрами 3=14 и 4=15 и 6=19.
Логика подскажет нам такой запрос (нерабочий):


SELECT p1.title FROM products_item p1
INNER JOIN filts_data p2 ON p1.id = p2.fid
WHERE p1.date > '17.01.2009'
AND (p2.pid = 3 AND p2.value = 14)
AND (p2.pid = 4 AND p2.value = 15)
AND (p2.pid = 6 AND p2.value = 19)

 

Этот запрос не найдет элементов в таблице.
Перепишем запрос, используя join на себя:


SELECT p1.* FROM product_item p1
INNER JOIN filts_data p2 ON p1.id = p2.fid
INNER JOIN filts_data p3 ON p1.id = p3.fid
INNER JOIN filts_data p4 ON p1.id = p4.fid
WHERE p1.date > '17.01.2009'
AND (p2.pid = 3 AND p2.value = 14)
AND (p3.pid = 4 AND p3.value = 15)
AND (p4.pid = 6 AND p4.value = 19)

 

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

Информация по теме:
http://www.somecoders.com/2006/02/explanation-of-the-different-sql-joins/
http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/
http://www.codinghorror.com/blog/archives/000976.html

 

Смотрите: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

 

 

Помоему вместо
SELECT u.id, u.name, d.name AS d_name FROM users u
INNER JOIN departments d ON u.d_id = d.id

Более проще, короче и понятнее будет указать
WHERE u.d_id = d.id

 

Некорректное описание в последней раскраске! Картинка и подпись говорит о Left, а запрос и пример о Right. Путаница у невнимательных новичков будет. Смотрите: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

 

AND (p2.pid = 3 AND p2.value = 14) AND (p2.pid = 4 AND p2.value = 15) AND (p2.pid = 6 AND p2.value = 19)
правильно, что не будет работать. Мы ищем чтоб и 3=14 и 4=15 и 6=19 одновременно. Так не бывает. Поставьте OR.
AND ((p2.pid = 3 AND p2.value = 14) OR (p2.pid = 4 AND p2.value = 15) OR (p2.pid = 6 AND p2.value = 19))
теперь отберутся, где 3=14 или 4=15 или 6=19
Получается одна выборка, затем отсеивание по условию. По Вашему способу придется для каждого JOIN подтягивать каждый раз таблицу.

 

Статья хорошая - коротко и ясно написано.
Только вот тут неточность имеется: "В нашем примере указав WHERE u.id IS null, мы отбросим записи, в которых пользователи не числятся в отделах."
кроется неточность. Вернее будет так:
"В нашем примере указав WHERE u.id IS NOT null, мы отбросим записи, в которых пользователи не числятся в отделах."
или так:
"В нашем примере указав WHERE u.id IS null, мы получим отделы, в которых не числятся пользователи."




Поделиться с друзьями:


Дата добавления: 2015-05-31; Просмотров: 232; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.