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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите с запросом, ALARM 
:(
    Опции темы
fath_fast
Дата 1.7.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Ребята HELP!!! Долго бьюсь над ним  smile 
Вот наваял подобный запрос, вживил в хранилку:

Код

CREATE PROCEDURE all_pay(IN since DATE, IN till DATE)
BEGIN

  SELECT employees.id_employee,  employees.fio, payments.pay_date FROM  employees LEFT JOIN payments USING(id_employee) WHERE employees.id_employee IN
    (SELECT id_loader  FROM list_price WHERE id_list IN (SELECT id_list FROM travel_list WHERE giving_date BETWEEN since AND till) UNION SELECT id_driver FROM list_price WHERE id_list IN (SELECT id_list FROM travel_list WHERE giving_date BETWEEN since AND till))
    AND payments.pay_date=(SELECT MAX(payments.pay_date) FROM payments WHERE payments.id_employee=employees.id_employee);

END//


А проблема в том заключается, что когда таблица payments не содрежит опеределённого id_employee, то он не отображается в результирующей, а хотелось что если бы не было такой записи, то были NULL... Вообщем чтобы сработал полностью  LEFT JOIN !
PM MAIL   Вверх
TicTak
Дата 2.7.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 2.3.2005

Репутация: 1
Всего: 1



Попробуй сначала так:
Код

AND payments.pay_date=(SELECT MAX(payments.pay_date) FROM payments WHERE payments.id_employee=employees.id_employee) (+)


Если не получится, то:
Код

NVL (payments.pay_date, SYSDATE) =
          DECODE (payments.pay_date,
                  NULL, SYSDATE,
                  (SELECT MAX (payments.pay_date)
                     FROM payments
                    WHERE payments.id_employee = employees.id_employee)
                 );

PM   Вверх
SergKO
Дата 2.7.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: 3
Всего: 20



Цитата(fath_fast @  1.7.2007,  23:15 Найти цитируемый пост)

Код

 SELECT employees.id_employee,  employees.fio, payments.pay_date FROM  employees LEFT JOIN payments USING(id_employee) WHERE employees.id_employee IN
    (SELECT id_loader  FROM list_price WHERE id_list IN (SELECT id_list FROM travel_list WHERE giving_date BETWEEN since AND till) UNION SELECT id_driver FROM list_price WHERE id_list IN (SELECT id_list FROM travel_list WHERE giving_date BETWEEN since AND till))
    AND payments.pay_date=(SELECT MAX(payments.pay_date) FROM payments WHERE payments.id_employee=employees.id_employee);



У Вас, похоже не MS SQL. Но, по аналогии с ним, все выражениия с IN в условиях фильтрации будут преобразованы оптимизатором в INNER JOIN. ВОЗМОЖНО в Вашем случае происходит то-же самое.
PM MAIL   Вверх
fath_fast
Дата 2.7.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Извините, что сразу не указал какая у меня СУБД - MySql


TicTak, 
Цитата

Код

AND payments.pay_date=(SELECT MAX(payments.pay_date) FROM payments WHERE payments.id_employee=employees.id_employee) (+)


У меня подобный синтакис не поддерживается (это я про плюс)? тоже самое касается и функции NVL в MySql такой нет :(

SergKO, 
Код

У Вас, похоже не MS SQL. Но, по аналогии с ним, все выражениия с IN в условиях фильтрации будут преобразованы оптимизатором в INNER JOIN. ВОЗМОЖНО в Вашем случае происходит то-же самое. 

Так что можете в моём случае посоветовать, кроме как менять СУБД?


PM MAIL   Вверх
SergKO
Дата 3.7.2007, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: 3
Всего: 20



Скорее всего у Вас происходит следующее: сначала идет выборка по 
Код

SELECT employees.id_employee,  employees.fio, payments.pay_date FROM  employees LEFT JOIN payments 
в этом наборе присутствуют и NULL для отсутствующих в payments id_employee. Затем этот набор фильтруется в соответствии с заданными во WHERE условиями. Вот здесь и исчезают желаемые NULL.

Попробуйте переписать все IN через  INNER JOIN. Примерно так, только подправьте синтаксис в соответствии с правилами MySql

Код

select employees.id_employee,  employees.fio, payments.pay_date 
 from employees 
    inner join list_price on list_price.id_loader = employees.id_employee
    inner join travel_list on travel_list.id_list = list_price.id_list
    inner join list_price on list_price.id_driver = employees.id_employee
    inner join travel_list on travel_list.id_list = list_price.id_list
    left join payments USING(id_employee)
 where travel_list.giving_date BETWEEN since AND till 
 and payments.pay_date=(select MAX(payments.pay_date) from payments where payments.id_employee=employees.id_employee);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.