2010-11-10 36 views
1

我正在做我的家庭作业,并且无法计算出“NOT IN”功能的正确语法。使用类型I嵌套查询的差异问题

该数据库是一个小型保险数据库(运营商,成员,雇主,计划)弥补这项任务。我应该弄清楚“哪些计划没有任何成员订阅?列出PlanID,plnDescription和plnCost(提示:使用带IN NOT子句的嵌套Select语句)。”

这就是我所拥有的写成的现在:

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

你能提供会员和计划表结构吗? – andr 2010-11-10 09:44:15

+2

特别是,MEMBERS表有一个PLANID列(提示,提示) – 2010-11-10 09:45:49

+0

@andr:[“家庭作业标签,像其他所谓的'meta'标签,现在不鼓励,”](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

在您的查询,你有期待是不存在的,你从你的子查询中获取MemberNos列表PlanIDs where子句。但是,您的子查询正在MemberNos上运行选择而不是PlanIds。

因此,您所做的是在MemberNos列表中查找PlanIds。所以,显然SQL无法找到任何记录。相反,您必须在PlanId列表中查找PlanID。

根据您的会员表进行编辑。你可以用这个 -

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

使用NOT EXISTS子句而不是NOT IN。如果子查询返回NULL,NOT IN返回0记录,但NOT Exists会返回正确的结果。欲了解更多详情,请查看这篇文章:

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

+0

PlanID在计划表中被指定为非空,所以我们可以假设在成员表上设置了一个适当的外键来防止空值,但是一般来说你的观点是有效的。 +1。 – 2010-11-10 13:09:36

+0

SELECT planid,plndescription,plncost FROM plans p WHERE EXISTS(SELECT 1 FROM members m WHERE m.planid = p.planid); – 2010-11-10 13:10:44

3

你跟MEMBERS.MEMBERNO比较PLANS.PLANID。我怀疑这不是你的意思。

分享和享受。