SQL表达式和结果的差异
大家好,当我继续学习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
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')