Firebird 2.5: Выбор данных при NULL

Модератор: Модераторы

Re: Firebird 2.5: Выбор данных при NULL

Сообщение Unvictis » 15.06.2017 13:19:22

vitaly_l писал(а):
Unvictis писал(а):Как видно из скриншота в запросе отсутствуют как минимум первые две записи из таблицы CLIENTS.

Я там где-то выше предполагал, что редактор и создатель разные и поэтому они не отображаются.

Посмотрите первые две записи, там создатель имеет id = 1, а редактор имеет id = 3. Выборка SQL, которую Вы делаете, априори исключает строки в которых РЕДАКТОР <> СОЗДАТЕЛЯ. (JOIN - тут не поможет).

Опишите что вы хотите получить? Какую именно выборку? Что хотите "отбраковать"?

Хочу что-бы отображались ВСЕ данные из таблицы CLIENTS а в полях CREATORLOOKUP и EDITORLOOKUP были имена пользователей создавших/изменивших данную запись. И всё.
Аватара пользователя
Unvictis
новенький
 
Сообщения: 48
Зарегистрирован: 17.07.2015 18:59:12
Откуда: Kokshetau, Kazakshtan

Re: Firebird 2.5: Выбор данных при NULL

Сообщение kosteek » 15.06.2017 13:24:17

Unvictis писал(а):Хочу что-бы отображались ВСЕ данные из таблицы CLIENTS а в полях CREATORLOOKUP и EDITORLOOKUP были имена пользователей создавших/изменивших данную запись. И всё.


Ну и как? Получилось?
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Firebird 2.5: Выбор данных при NULL

Сообщение Unvictis » 15.06.2017 13:27:16

kosteek писал(а):Ну и как? Получилось?

В том то и дело что нет - ваше решение не помогло, IBExpert ругается.
Аватара пользователя
Unvictis
новенький
 
Сообщения: 48
Зарегистрирован: 17.07.2015 18:59:12
Откуда: Kokshetau, Kazakshtan

Re: Firebird 2.5: Выбор данных при NULL

Сообщение olegy123 » 15.06.2017 13:43:36

Код: Выделить всё
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]
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Firebird 2.5: Выбор данных при NULL

Сообщение Unvictis » 15.06.2017 13:56:45

olegy123 писал(а):ID_MODERATOR

Мне вот интересно, откуда взялось ID_MODERATOR? Мне подобный идентификатор не нужен - логика программы немного другая.
Аватара пользователя
Unvictis
новенький
 
Сообщения: 48
Зарегистрирован: 17.07.2015 18:59:12
Откуда: Kokshetau, Kazakshtan

Re: Firebird 2.5: Выбор данных при NULL

Сообщение vitaly_l » 15.06.2017 14:01:45

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).
Последний раз редактировалось vitaly_l 15.06.2017 14:05:26, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Firebird 2.5: Выбор данных при NULL

Сообщение Unvictis » 15.06.2017 14:02:38

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 - но в какую сторону двигаться - уже ясно.
Аватара пользователя
Unvictis
новенький
 
Сообщения: 48
Зарегистрирован: 17.07.2015 18:59:12
Откуда: Kokshetau, Kazakshtan

Re: Firebird 2.5: Выбор данных при NULL

Сообщение alexs » 15.06.2017 14:08:41

Конкурс - кто напишет запрос сложнее :-)

Код: Выделить всё
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.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird 2.5: Выбор данных при NULL

Сообщение vitaly_l » 15.06.2017 14:18:35

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).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Firebird 2.5: Выбор данных при NULL

Сообщение alexs » 15.06.2017 17:42:35

vitaly_l писал(а):либо через union

Будет 2 строки - а там же одна
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird 2.5: Выбор данных при NULL

Сообщение vitaly_l » 15.06.2017 18:31:34

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. Но для ТС я думаю это неважно.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Firebird 2.5: Выбор данных при NULL

Сообщение olegy123 » 15.06.2017 22:11:21

Unvictis писал(а):Вот теперь появляются все записи! Большое спасибо! Буду курить SQL - пока не понимаю как работает JOIN - но в какую сторону двигаться - уже ясно.

Понять просто - SQL во второй таблице ищет в ключевом поле NULL - а там нет.. раз нет значит выборка ложная. результата нет.

описание на русском:
http://www.skillz.ru/dev/php/article-Ob ... OUTER.html

картинка кликабельная:
LEFT vs Right Outer Join in SQL.png


Добавлено спустя 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 даст более одной позиции?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Firebird 2.5: Выбор данных при NULL

Сообщение vitaly_l » 16.06.2017 06:14:18

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: все варианты дадут одинаковый результат. Какой хотите, такой и пользуйте.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Firebird 2.5: Выбор данных при NULL

Сообщение olegy123 » 16.06.2017 07:28:35

vitaly_l там вопрос тянулся от конвейера - что будет делать узел когда вдруг встретит два значения? А?

vitaly_l писал(а):PS: все варианты дадут одинаковый результат. Какой хотите, такой и пользуйте.

Ну вы же специалист с большой буквы тут - разъясните мне, двоечнику - в чем мой грех?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Firebird 2.5: Выбор данных при NULL

Сообщение vitaly_l » 16.06.2017 07:41:36

olegy123 писал(а):вопрос тянулся от конвейера - что будет делать узел когда вдруг встретит два значения? А?
разъясните мне, двоечнику - в чем мой грех?

Я же написал: Там - уникальный индекс. Так вы ещё и индексы не знаете, что ли?
Сейчас-же идите учите все уникальные и не уникальные индексы!
:roll: И пока все: уникальные индексы - не выучите, на форум не возвращайтесь! Двоечник :wink: !
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru