Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL表达式和结果的差异_Sql_Oracle - Fatal编程技术网

SQL表达式和结果的差异

SQL表达式和结果的差异,sql,oracle,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, SHIPME

大家好,当我继续学习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');
这将返回所有项目名称

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

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

谢谢

您的查询#1包含两个表,但未连接

FROM PROJECTS, SHIPMENTS
而查询#2这两个表连接在哪里

AND SHIPMENTS.PROJECTNO = PROJECTS.PROJECTNO
最后一个查询#3,子查询包含特定supplierno的筛选器

Sub-query:

 SELECT distinct SHIPMENTS.PROJECTNO
 FROM SHIPMENTS
 WHERE SUPPLIERNO = 'S2'
  AND SUPPLIERNO = 'S1'
更新

第一个查询没有使用第二个表中的任何字段

SELECT distinct PROJECTS.NAME
FROM PROJECTS, SHIPMENTS

您缺少的一点是此子查询:

SELECT distinct SHIPMENTS.PROJECTNO
FROM SHIPMENTS
WHERE SUPPLIERNO = 'S2'
AND SUPPLIERNO = 'S1'
可能不返回任何行。因此,查询3要么抛出错误,要么返回所有可能的行

另外,我个人的理论是,“当有疑问时,查看您的数据。”对于查询2,去掉子查询。只需运行以下命令:

SELECT distinct PROJECTS.NAME
FROM PROJECTS, SHIPMENTS
WHERE SHIPMENTS.PROJECTNO = PROJECTS.PROJECTNO;
你说你想检查这段关系,这就行了

编辑从这里开始

如果这句话“表中有5家供应商,所有S1、S2……我应该将其包括在我的原始问题中”,暗示了我的最初陈述,我的观点不够明确。一条记录在一个字段中只能有一个值。因此,如果值是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')

在所有三个查询中,您都有一个通用的过滤器,即PROJECTNO不应在装运表中找到。但是,这3个查询完全不同。代码变化不大,但有一些细微的差异会产生很大的后果:

在Q1中,您没有向代码添加任何额外的限制,因此它将返回所有没有装运的项目

在第2季度中,您添加了一项要求,即返回的PROJECTNO必须与Shipping.PROJECTNO相同,但您正在寻找没有装运的项目,因此从未满足此标准,因此您没有返回任何数据


在Q3中,您指定SUPPLIERNO应为S1和S2,但是,这是不可能的,因此子查询不会返回任何装运,因此您会像没有装运一样列出所有项目。

感谢您编辑我的帖子,您如何让它以这种方式突出显示?缩进四个空格或空格将您的脚本括在严重的重音符号之间`对不起,我可能说错了我这意味着我想确保查询知道正确的关系。但最后一个问题并不能满足我的需要。表中有5家供应商,均为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')