Использование вложенного запроса типа I для решения разностной задачи - PullRequest
1 голос
/ 10 ноября 2010

Я работаю над своей домашней работой, и у меня возникают проблемы с определением правильного синтаксиса для функции «НЕ В».

База данных представляет собой небольшую базу данных страхования (перевозчики, участники, работодатели, планы), сделанныена это назначение.Я должен выяснить: «Какие планы не имеют подписок на участников? Перечислите PlanID, plnDescription и plnCost. (Подсказка: используйте вложенный оператор Select с предложением NOT IN.)»

Вот чтоЯ написал по состоянию на сейчас:

SELECT planid, plndescription, plncost
FROM plans
WHERE planid NOT IN
(SELECT memberno FROM members);

И когда я запускаю этот запрос, я получаю ответ, выбранный из 0 строк.

Когда я вынимаю оператор WHERE, я получаю следующееответ:

PLANID                 PLNDESCRIPTION                      PLNCOST
---------------------- ----------------------------------- ----------------
1                      Single Basic Medical                72.5
2                      2-Party Basic Medical               140
3                      Family Basic Medical                225
4                      Single SuperMed                     110
5                      2-Party SuperMed                    200
6                      Family SuperMed                     350
7                      Single Dental Only                  35
8                      Family Dental Only                  70
9                      Life Only                           16.5
10                     Single SuperMed with Dental         125
11                     2-Party SuperMed with Dental        240
12                     Family SuperMed with Dental         425

12 rows selected

Я уверен, что моя ошибка в операторе WHERE, потому что я уверен, что я использую неправильные имена полей в операторе WHERE, а также во втором операторе SELECT.Любая помощь очень ценится.

Структура таблицы членов:

Name                           Null     Type
------------------------------ -------- -------------
MEMBERNO                       NOT NULL NUMBER
MBRFIRSTNAME                            CHAR(35)
MBRLASTNAME                             CHAR(35)
MBRSTREET                               CHAR(50)
MBRCITY                                 CHAR(30)
MBRSTATE                                CHAR(2)
MBRZIP                                  CHAR(10)
MBRPHONENO                              CHAR(10)
PLANID                                  NUMBER
MBREMAIL                                CHAR(255)
MBRDATEEFFECTIVE                        DATE
EMPLOYERID                              NUMBER

12 rows selected

Структура таблицы планов:

Name                Null     Type
------------------- -------- -------------
PLANID              NOT NULL NUMBER
PLNDESCRIPTION               CHAR(35)
PLNCOST                      NUMBER(8,2)
CARRIERID                    CHAR(4)

4 rows selected

Ответы [ 5 ]

4 голосов
/ 10 ноября 2010

В вашем запросе есть предложение where, которое ищет PlanID, которых нет в списке MemberNos, которые вы получаете из своего подзапроса.Но ваш подзапрос выполняет выборка для MemberNos вместо PlanIds.

Итак, вы делаете поиск PlanIds в списке MemberNos.Итак, очевидно, что SQL не может найти никаких записей.Вместо этого вам придется искать PlanID в списке PlanIds.

Редактировать в соответствии с вашей таблицей участников.Вы можете использовать это -

SELECT planid, plndescription, plncost FROM plans WHERE planid not IN (SELECT PlanID FROM Members)
3 голосов
/ 10 ноября 2010

Вы сравниваете PLANS.PLANID с MEMBERS.MEMBERNO.Я подозреваю, что это не то, что вы намеревались сделать.

2 голосов
/ 10 ноября 2010

Предполагается, что таблица Члены связана с таблицей Планов через внешний ключ PLANID , этот запрос должен работать:

SELECT p.planid, p.plndescription, p.plncost
FROM plans p
WHERE p.planid NOT IN
(SELECT m.planid FROM members m)
2 голосов
/ 10 ноября 2010

Предполагается, что planId входит в члены

SELECT planid, plndescription, plncost
FROM plans
WHERE planid not IN
(SELECT planid FROM members);
1 голос
/ 10 ноября 2010

Используйте предложение NOT EXISTS вместо NOT IN.NOT IN возвращает 0 записей, если подзапросом возвращается NULL, но NOT Exists дает правильный результат.Для более подробной информации, пожалуйста, проверьте эту статью:

http://decipherinfosys.wordpress.com/2007/01/21/32/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...