大家好,因为我继续学习SQL我已经知道以下是三种不同的表达式,我希望能够返回相同的结果。
有四个表我正在使用这个查询涉及的两个
SHIPMENTS with the columns (SUPPLIERNO, PARTNO,PRJECTNO,QUANTITY)
PROJECT (PROJECTNO, NAME, CITY)
问题是找到供应商S1和S2不向其发运任何部件的项目名称
QUERY # 1
SELECT distinct PROJECTS.NAME
FROM PROJECTS, SHIPMENTS
WHERE PROJECTS.PROJECTNO NOT IN(
SELECT distinct SHIPMENTS.PROJECTNO
FROM SHIPMENTS
WHERE SUPPLIERNO <= 'S2');
此查询返回预期结果,其中有一个项目既没有发送部件。
查询2
SELECT distinct PROJECTS.NAME
FROM PROJECTS, SHIPMENTS
WHERE PROJECTS.PROJECTNO NOT IN(
SELECT distinct SHIPMENTS.PROJECTNO
FROM SHIPMENTS
WHERE SUPPLIERNO <= 'S2')
AND SHIPMENTS.PROJECTNO = PROJECTS.PROJECTNO;
这不会返回任何结果,我想要做的就是确保关系已知。
和QUERY 3
SELECT distinct PROJECTS.NAME
FROM PROJECTS, SHIPMENTS
WHERE PROJECTS.PROJECTNO NOT IN(
SELECT distinct SHIPMENTS.PROJECTNO
FROM SHIPMENTS
WHERE SUPPLIERNO = 'S2'
AND SUPPLIERNO = 'S1');
这将返回所有项目名称。
对我来说,这些看起来都一样。我错过了什么?
我们的教授没有解释为什么这些都会有不同的评价
由于
答案 0 :(得分:0)
您的查询#1包含两个表但未连接。
FROM PROJECTS, SHIPMENTS
在查询#2中,这两个表连接在
中AND SHIPMENTS.PROJECTNO = PROJECTS.PROJECTNO
最后查询#3,子查询包含特定供应商的过滤器。
Sub-query:
SELECT distinct SHIPMENTS.PROJECTNO
FROM SHIPMENTS
WHERE SUPPLIERNO = 'S2'
AND SUPPLIERNO = 'S1'
<强>更新强>
第一个查询未使用
中第二个表SHIPMENTS
中的任何字段
SELECT distinct PROJECTS.NAME
FROM PROJECTS, SHIPMENTS
答案 1 :(得分:0)
您缺少的一件事是这个子查询:
SELECT distinct SHIPMENTS.PROJECTNO
FROM SHIPMENTS
WHERE SUPPLIERNO = 'S2'
AND SUPPLIERNO = 'S1'
可能不会返回任何行。因此,您的查询3将抛出错误或返回每个可能的行。
此外,我的个人理论是,&#34;如有疑问,请查看您的数据。&#34;对于查询2,删除子查询。跑吧:
SELECT distinct PROJECTS.NAME
FROM PROJECTS, SHIPMENTS
WHERE SHIPMENTS.PROJECTNO = PROJECTS.PROJECTNO;
你说你想检查这种关系,这样就可以了。
编辑从此处开始
如果这个评论,&#34;表格中有5个供应商,所有S1,S2 ......我应该在原来的问题中包括这个问题&#34;,提到我的初步陈述,我的观点不够明确。记录在字段中只能有一个值。因此,如果值为S1,则它也不能是S2。也许该子查询应该是:
SELECT distinct SHIPMENTS.PROJECTNO
FROM SHIPMENTS
WHERE SUPPLIERNO = 'S2'
or SUPPLIERNO = 'S1' -- changed the and to an or
或者这个:
SELECT distinct SHIPMENTS.PROJECTNO
FROM SHIPMENTS
WHERE SUPPLIERNO in ( 'S2', 'S1')
答案 2 :(得分:0)
在所有三个查询中,您都有一个通用过滤器,因为不应在SHIPMENT表中找到PROJECTNO。但是3个查询根本不相同。代码变化不大但是有一些微妙的差异会产生很大的后果:
在Q1中,您不会对代码添加任何其他限制,因此它将返回所有没有装运的PROJECTS。
在Q2中,您添加了PROJECTNO返回的要求必须与SHIPMENT.PROJECTNO相同,但您正在寻找没有装运的PROJECTS,因此永远不会满足此条件,因此您没有返回任何数据。 / p>
在Q3中,您指定SUPPLIERNO应该是S1和S2,但是这是不可能的,因此从子查询中不会返回任何SHIPMENTS,因此您将列出所有PROJECTS,就好像没有发生SHIPMENTS一样。