2010-11-10 2 views
1

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

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

Это то, что у меня есть написанные на данный момент:

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

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

Когда я вынимаю ГДЕ заявление, я получаю следующий ответ:

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 
+2

Не могли бы вы предоставить членов и запланировать структуру таблицы? – andr

+2

В частности, имеет ли таблица MEMBERS столбец PLANID (подсказка, подсказка) –

+0

@andr: [«Тег домашней работы, как и другие так называемые мета-теги, теперь обескуражен», (http: // meta. переполнение стека.com/q/10812), но, @Jeff, пожалуйста (как всегда) следуйте [общим правилам] (http://tinyurl.com/so-hints): укажите любые специальные ограничения, покажите, что вы пробовали до сих пор, и спросите, что конкретно вас путает. – 2010-11-10 16:55:33

ответ

2

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

SELECT planid, plndescription, plncost 
FROM plans 
WHERE planid not IN 
(SELECT planid FROM members); 
2

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

SELECT p.planid, p.plndescription, p.plncost 
FROM plans p 
WHERE p.planid NOT IN 
(SELECT m.planid FROM members m) 
4

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

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

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

SELECT planid, plndescription, plncost FROM plans WHERE planid not IN (SELECT PlanID FROM Members) 
1

Используйте НЕ-СУЩЕСТВУЮЩИЙ пункт вместо НЕ. NOT IN возвращает 0 запись, если NULL возвращается подзапросом, но NOT Exists дает правильный результат. Для получения более подробной информации, пожалуйста, проверьте эту статью:

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

+0

PlanID указан как не равный нулю в таблице «Планы», поэтому мы можем предположить, что в таблице участников настроен правильный внешний ключ для предотвращения нулей, но в целом ваша точка действительна , +1. –

+0

SELECT planid, plndescription, plncost ОТ планов p ГДЕ СУЩЕСТВУЕТ (ВЫБРАТЬ 1 ОТ членов m ГДЕ m.planid = p.planid); –

3

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

Делитесь и наслаждайтесь.

Смежные вопросы