Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание однотабличного запроса sql на выборку к БД Paradox7 в DBD  (Прочитано 14910 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Shutter
Гость
« : 17-02-2010 14:01 » 

Помогите, пожалуйста, создать однотабличный запрос на выборку к БД в формате Paradox7

Задание звучит так: вывести список авторов (Authors), у которых НЕТ книг 2000, 2002, 2003 годов издания (YearPub) .

Естественное, первое что пробовал

Код:
SELECT Authors
FROM CatalogBooks
WHERE YearPub not in(2000,2002,2003)

всё было бы так просто если бы у авторов было по одной книге...

за несколько часов мучей с непривычки несколько раз вспоминал о переменных и циклах в цикле... sql это не моё..
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 17-02-2010 14:15 » new

Ну, в принципе, вроде, все так..
Код:
SELECT Authors
FROM CatalogBooks
WHERE not YearPub in(2000,2002,2003)
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Shutter
Гость
« Ответ #2 : 17-02-2010 14:25 » 

ну где же так, если авторы с 2000, 2002 выводятся....

http://s006.radikal.ru/i215/1002/10/e6d32b6b84b9.jpg
« Последнее редактирование: 17-02-2010 15:00 от Алексей1153++ » Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 17-02-2010 15:14 » 

Сорри, не понял задания сразу.. Тогда можно, наверное, составной запрос сделать.. Например так (теоретически пишу, сам не проверял):
Код:
SELECT distinct Authors
FROM CatalogBooks
WHERE not Authors in (select authors FROM CatalogBooks WHERE YearPub in(2000,2002,2003) )
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #4 : 17-02-2010 18:38 » 

мои пять копеек
Код:
SELECT distinct Authors
FROM CatalogBooks C
WHERE NOT EXISTS(SELECT 1 FROM CatalogBooks C1 WHERE C1.Authors = C1.Authors AND C1.YearPub in(2000,2002,2003) )
Записан

I Have Nine Lives You Have One Only
THINK!
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #5 : 18-02-2010 07:26 » 

Судя по структуре таблицы, это какой-то курсовик.. В таком случае, возможно, будет более полезен такой вариант, чтоб избежать составного запроса и использовать агрегацию с HAVING:
Код: (SQL)
SELECT DISTINCT Authors, YearPub FROM CatalogBooks
GROUP BY Authors HAVING YearPub NOT IN (2000, 2002, 2003)
В этом случае возвращается два поля, но нужно будет использовать только первое, поскольку второе нужно только для использования в HAVING
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 18-02-2010 08:24 » 

Shutter, ты покажи как у тебя таблица выглядит.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #7 : 18-02-2010 08:26 » 

Shutter, ты покажи как у тебя таблица выглядит.
Он приводил скриншот выше: https://forum.shelek.ru/index.php/topic,23488.msg227326.html#msg227326
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 18-02-2010 10:21 » 

Ну тогда что то подобное должно помочь:
Код:
SELECT DISTINCT Authors
FROM
    (
        SELECT DISTINCT Authors
        FROM CatalogBooks
        WHERE YearPub IN (2000, 2002, 2003)
    ) AS tTable,
    CatalogBooks
WHERE Authors != tTable.Authors
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 18-02-2010 10:25 » 

Кстати, запрос из 3 ответа (https://forum.shelek.ru/index.php/topic,23488.msg227333.html#msg227333) то же должен сработать.
Записан
Shutter
Гость
« Ответ #10 : 18-02-2010 13:37 » 

Спасибо всем огромное!!!
Этот вариант больше всего понравился, т.к я мыслил в этом направлении)
Сорри, не понял задания сразу.. Тогда можно, наверное, составной запрос сделать.. Например так (теоретически пишу, сам не проверял):
Код:
SELECT distinct Authors
FROM CatalogBooks
WHERE not Authors in (select authors FROM CatalogBooks WHERE YearPub in(2000,2002,2003) )

А вот на второй вариант с Having DBD ругается(  оставлю для рассмотрения в свободное время.

HandKot, Спасибо за участие! А что такое "SELECT 1" о_О

Serg79, Ваш вариант ругнулся Invalid use of keyword
да и честно говоря для меня, новичка, он сложноват в понимании

ВСЕМ Огромное Спасибо!!! Надеюсь из Новенького превращусь хотя бы в понимающего на этом форуме!
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 18-02-2010 16:02 » 

Запросы IN и EXISTS обычно работают медленнее JOIN. Вариант Serg79 выглядит предпочтительней.

Код: (SQL)
SELECT DISTINCT CB1.Authors
FROM CatalogBooks CB1 LEFT JOIN
   (SELECT Authors FROM CatalogBooks WHERE YearPub IN (2000, 2002, 2003)) CB2 ON CB1.Author = CB2.Author
WHERE CB2.Author IS NULL
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #12 : 18-02-2010 18:39 » 

Запросы IN и EXISTS обычно работают медленнее JOIN. Вариант Serg79 выглядит предпочтительней.

Код: (SQL)
SELECT DISTINCT CB1.Authors
FROM CatalogBooks CB1 LEFT JOIN
   (SELECT Authors FROM CatalogBooks WHERE YearPub IN (2000, 2002, 2003)) CB2 ON CB1.Author = CB2.Author
WHERE CB2.Author IS NULL
позвольте не согласится
действительно что IN работает медленнее, но EXISTS дает хорошую скорость,  единственное скорость выполнение зависти в большей степени от структуры таблицы и индексов на ней

вот еще пять копеек (возможно он не пройдет на ПАРАДОКС)
Код:
SELECT .Authors
FROM CatalogBooks
GROUP BY Authors
HAVING SUM(CASE WHEN YearPub IN (2000, 2002, 2003) THEN 1 ELSE 0 END) = 0
 
Цитата
А что такое "SELECT 1" о_О
просто выбрать 1, сделано из-за того что SELECT всегда должен иметь хоть одно поле, а в том подзапросе нужно просто сказать, есть что-то или нет

ЗЫЖ надеюсь не сильно запутал
Записан

I Have Nine Lives You Have One Only
THINK!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines