SQL表达式和结果的差异

时间:2014-07-02 01:54:30

标签: sql oracle

大家好,因为我继续学习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');

这将返回所有项目名称。

对我来说,这些看起来都一样。我错过了什么?

我们的教授没有解释为什么这些都会有不同的评价

由于

3 个答案:

答案 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一样。