Страница 3 из 4
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 12:19:22
Unvictis
vitaly_l писал(а):Unvictis писал(а):Как видно из скриншота в запросе отсутствуют как минимум первые две записи из таблицы CLIENTS.
Я там где-то выше предполагал, что редактор и создатель разные и поэтому они не отображаются.
Посмотрите первые две записи, там создатель имеет id = 1, а редактор имеет id = 3. Выборка SQL, которую Вы делаете, априори исключает строки в которых РЕДАКТОР <> СОЗДАТЕЛЯ. (JOIN - тут не поможет).
Опишите что вы хотите получить? Какую именно выборку? Что хотите "отбраковать"?
Хочу что-бы отображались ВСЕ данные из таблицы CLIENTS а в полях CREATORLOOKUP и EDITORLOOKUP были имена пользователей создавших/изменивших данную запись. И всё.
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 12:24:17
kosteek
Unvictis писал(а):Хочу что-бы отображались ВСЕ данные из таблицы CLIENTS а в полях CREATORLOOKUP и EDITORLOOKUP были имена пользователей создавших/изменивших данную запись. И всё.
Ну и как? Получилось?
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 12:27:16
Unvictis
kosteek писал(а):Ну и как? Получилось?
В том то и дело что нет - ваше решение не помогло, IBExpert ругается.
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 12:47:32
olegy123
Код: Выделить всё
SELECT С.*,
CREATOR.EMPLOYEE AS "CREATORLOOKUP",
EDITOR.EMPLOYEE AS "EDITORLOOKUP"
FROM
CLIENTS AS C
LEFT JOIN EMPLOYEES AS CREATOR ON CREATOR.EMPLOYEE_ID=C.CREATOR
LEFT JOIN EMPLOYEES AS EDITOR ON EDITOR.EMPLOYEE_ID=C.EDITOR
Добавлено спустя 3 минуты 56 секунд:Если выводит, потом условие добавите
WHERE C.EDITOR IS NULL OR C.EDITOR=ID_MODERATORили
WHERE C.EDITOR IN [NULL,ID_MODERATOR]
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 12:56:45
Unvictis
olegy123 писал(а):ID_MODERATOR
Мне вот интересно, откуда взялось ID_MODERATOR? Мне подобный идентификатор не нужен - логика программы немного другая.
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 13:01:45
vitaly_l
Unvictis писал(а):Хочу что-бы отображались ВСЕ данные из таблицы CLIENTS а в полях CREATORLOOKUP и EDITORLOOKUP были имена пользователей создавших/изменивших данную запись. И всё.
Точно не уверен, нужно пробовать в живую, но примерно как-то так:
Код: Выделить всё
SELECT CLIENTS.CLIENT_ID,
CLIENTS.CREATOR,
EMPLOYEES.EMPLOYEE AS "CREATORLOOKUP",
CLIENTS.EDITOR,
CLIENTS.EDITED,
CLIENTS.CLIENT,
CLIENTS.PHONE,
CLIENTS.ADDRESS,
CLIENTS.E-MAIL,
CLIENTS.ANGRY,
CLIENTS.NOTES
FROM CLIENTS,
EMPLOYEES
WHERE
EMPLOYEES.EMPLOYEE_ID = CLIENTS.CREATOR
UNION
SELECT EMPLOYEES.EMPLOYEE AS "EDITORLOOKUP"
FROM CLIENTS, EMPLOYEES
WHERE EMPLOYEES.EMPLOYEE_ID = CLIENTS.EDITOR ;
Попробуйте возможно заработает (но скорее всего заругается, но суть в UNION).
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 13:02:38
Unvictis
olegy123 писал(а):Код: Выделить всё
SELECT С.*,
CREATOR.EMPLOYEE AS "CREATORLOOKUP",
EDITOR.EMPLOYEE AS "EDITORLOOKUP"
FROM
CLIENTS AS C
LEFT JOIN EMPLOYEES AS CREATOR ON CREATOR.EMPLOYEE_ID=C.CREATOR
LEFT JOIN EMPLOYEES AS EDITOR ON EDITOR.EMPLOYEE_ID=C.EDITOR
Добавлено спустя 3 минуты 56 секунд:Если выводит, потом условие добавите
WHERE C.EDITOR IS NULL OR C.EDITOR=ID_MODERATORили
WHERE C.EDITOR IN [NULL,ID_MODERATOR]
Вот теперь появляются все записи! Большое спасибо! Буду курить SQL - пока не понимаю как работает JOIN - но в какую сторону двигаться - уже ясно.
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 13:08:41
alexs
Конкурс - кто напишет запрос сложнее

Код: Выделить всё
SELECT
CLIENTS.*,
(select
EMPLOYEES.EMPLOYEE
from
EMPLOYEES
where
EMPLOYEES.EMPLOYEE_ID=CLIENTS.CREATOR) as CREATOR,
(select
EMPLOYEES.EMPLOYEE
from
EMPLOYEES
where
EMPLOYEES.EMPLOYEE_ID=CLIENTS.EDITOR) as EDITOR
FROM
CLIENTS
Плюсы - не загромождаем условия основного запроса
Минусы - усложняется select список полей, повторный запрос к таблице EMPLOYEES.
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 13:19:25
vitaly_l
Unvictis писал(а):Вот теперь появляются все записи!
Они и вот так все появятся (просто уберите WHERE):
Код: Выделить всё
SELECT CLIENTS.CLIENT_ID,
CLIENTS.CREATOR,
EMPLOYEES.EMPLOYEE AS "CREATORLOOKUP",
EMPLOYEES.EMPLOYEE AS "EDITORLOOKUP",
CLIENTS.EDITOR,
CLIENTS.EDITED,
CLIENTS.CLIENT,
CLIENTS.PHONE,
CLIENTS.ADDRESS,
CLIENTS.E-MAIL,
CLIENTS.ANGRY,
CLIENTS.NOTES
FROM CLIENTS, EMPLOYEES
olegy123 писал(а):Если выводит, потом условие добавите
WHERE C.EDITOR IS NULL OR C.EDITOR=ID_MODERATOR
или
WHERE C.EDITOR IN [NULL,ID_MODERATOR]
И откуда взялось ID_MODERATOR??? Чему оно равно?
Добавлено спустя 50 секунд:alexs писал(а):Конкурс - кто напишет запрос сложнее
Ищите решение: либо как предлагает alexs с двумя select, либо через union (хотя и JOIN можно сделать без WHERE).
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 16:42:35
alexs
vitaly_l писал(а):либо через union
Будет 2 строки - а там же одна
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 17:31:34
vitaly_l
alexs писал(а):Будет 2 строки - а там же одна
Вообще-то нет, т.к. выборка из одинаковых таблиц. Но если ВДРУГ такое произойдёт, то тогда можно добавить: GROUP BY CLIENTS.CLIENT_ID и тогда строка останется одна.
Только что специально попробовал, сделал вот такой запрос:
Код: Выделить всё
SELECT * FROM `xxx` WHERE `id` < 5 UNION SELECT * FROM `xxx` WHERE `id` < 10
Номера с 1-го по 5-й - не дублируются и выводятся одной строкой. И потом добавляются, те, что в UNION с 6 по 10, хотя запрос от 0 до 10.
Но если будет выводится, то можно вот так:
Код: Выделить всё
SELECT * FROM `xxx` WHERE `id` < 5 UNION SELECT * FROM `xxx` WHERE `id` < 10 GROUP BY `id`
Суть в том, что - при UNION на один запрос к БД меньше, т.к. что с select, что с join - делаются 3 запроса. А с union только 2. Но для ТС я думаю это неважно.
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 15.06.2017 21:23:21
olegy123
Unvictis писал(а):Вот теперь появляются все записи! Большое спасибо! Буду курить SQL - пока не понимаю как работает JOIN - но в какую сторону двигаться - уже ясно.
Понять просто - SQL во второй таблице ищет в ключевом поле NULL - а там нет.. раз нет значит выборка ложная. результата нет.
описание на русском:
http://www.skillz.ru/dev/php/article-Ob ... OUTER.htmlкартинка кликабельная:
Добавлено спустя 3 минуты 59 секунд:Правда про "FULL OUTER JOIN" в FirebirdSQL не знаю.
Добавлено спустя 8 минут 1 секунду:alexs писал(а):Плюсы - не загромождаем условия основного запроса
Минусы - усложняется select список полей, повторный запрос к таблице EMPLOYEES.
Select B в Select A - это плохой подход. Каждый Row A может выборку делать в Select B каждый раз. если Select A - дает 1000 и Select B 2000 - то ловите 2000000 операций.
Еще фокус в том что если Select B даст более одной позиции?
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 16.06.2017 05:31:05
vitaly_l
olegy123 писал(а):Select B в Select A - это плохой подход. Каждый Row A может выборку делать в Select B каждый раз. если Select A - дает 1000 и Select B 2000 - то ловите 2000000 операций.
Еще фокус в том что если Select B даст более одной позиции?
Правда шоли? Не могет быть!!! Неужели там Select B даст более одной позиции?
А если JOIN даст более одной позиции? <== Вникаете в своё незнание предмета? или всё ещё нет?
И прекратите уже заниматься схоластикой.
Код: Выделить всё
Схола́стика
В повседневном общении схоластикой часто называют представления, оторванные от жизни, основывающиеся на отвлечённых рассуждениях, не проверяемых опытом.
olegy123 - садитесь вам двойка ( Select B у него даст более одной позиции, будучи с уникальным индексом... ).
Добавлено спустя 111 минут 111 секунд:PS: все варианты дадут одинаковый результат. Какой хотите, такой и пользуйте.
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 16.06.2017 06:28:35
olegy123
vitaly_l там вопрос тянулся от конвейера - что будет делать узел когда вдруг встретит два значения? А?
vitaly_l писал(а):PS: все варианты дадут одинаковый результат. Какой хотите, такой и пользуйте.
Ну вы же специалист с большой буквы тут - разъясните мне, двоечнику - в чем мой грех?
Re: Firebird 2.5: Выбор данных при NULL
Добавлено: 16.06.2017 06:41:36
vitaly_l
olegy123 писал(а):вопрос тянулся от конвейера - что будет делать узел когда вдруг встретит два значения? А?
разъясните мне, двоечнику - в чем мой грех?
Я же написал: Там -
уникальный индекс. Так вы ещё и индексы не знаете, что ли?
Сейчас-же идите учите все уникальные и не уникальные индексы!

И пока все:
уникальные индексы - не выучите, на форум не возвращайтесь! Двоечник

!