sql-为什么这两句我看似一样的SQL输出的结果不一样?

问题描述

为什么这两句我看似一样的SQL输出的结果不一样? 3C
SELECT splname FROM qsplWHERE splno NOT IN(SELECT splno FROM qdelWHERE itemname = 'Compass'OR itemname = 'Geopositioning System'); Select splnameFrom qdel aqspl bWhere a.splno=b.splnoAnd (a.itemname != ('Compass') or a.itemname != ('Geopositioning System'))

这是ERD图
图片说明

解决方案

第一条SQL为子查询,第二条SQL为连接查询

看似一样,看你判断条件所导致的结果是不一样的。

第一条中的 NOT IN 排除了 itemname 为('Compass') 和 ('Geopositioning System')

第二条 And 后面的意思是itemname不能为('Compass')或者 ('Geopositioning System'),

所以第二条的or 应该改为 and

解决方案二:
只是看起来一样而已,,,

解决方案三:
第二句判断条件or改为and

解决方案四:
楼主没有理清楚SQL的含义。
第一句:NOT IN 表示查询值qspl.splno不在子查询(SELECT splno FROM qdel .....)中的
第二句:两表关联,使用的是等值连接,所以左右表互相具有过滤效果。
但是楼主的第一个WHERE条件表示:qdel.splno等于qspl.splno,这啥意思?就是说你的qdel.splno存在于qspl.splno这个中,
这就相当于:IN的作用了:FROM qspl WHERE splno IN (SELECT splno FROM qdel)
后面两个条件正确
改写后的正确SQL:

 SELECT splname  FROM qspl b  LEFT JOIN qdel a    ON b.splno = a.splno   AND (a.itemname = ('Compass') OR          a.itemname = ('Geopositioning System')) WHERE b.splno IS NOT NULL;

总结,这是一道将NOT IN 改写成 JOIN的操作,建议楼主深入的体会下:NOT IN 、NOT EXISTS、LEFT JOIN+ NOT NULL。这三者的用法。并且有啥限制,这才是问题的根本

解决方案五:
假如not in的子查询里有null就不一样了

时间: 2024-09-14 12:00:19

sql-为什么这两句我看似一样的SQL输出的结果不一样?的相关文章

求解答-求数据库高手两个SQL语句 多少说两句给个思路也行啊 谢谢

问题描述 求数据库高手两个SQL语句 多少说两句给个思路也行啊 谢谢 点击搜索显示列表项SQL语句怎么写 insert语句又该怎么写 解决方案 一些求数据库对象的SQL语句 解决方案二: 这是要查多个表的内容,所以在使用连接查询

借助两个开发包在PL/SQL中实现多进程通信

PL/SQL是基于Oracle的一个主流应用程序编程语言,它的主要特点是将SQL语 句与过程化程序开发语言相结合,以实现更为复杂的商业逻辑.本文主要就其中 多进程通信进行讨论. 显然,多进程技术是用来提高应用的并发性,进而提高整个系统的执行效率, 那么如何在PL/SQL中实现多进程的通信呢?其实,PL/SQL其设计的初衷主要是增 强SQL语句的功能,而没有考虑到其他编程语言的高级功能,所以在PL/SQL中实现 多进程通信只能借助于Oracle提供的两个开发包:DBMS_PIPE和DBMS_ALE

数据库-c#中这两句什么意思呢

问题描述 c#中这两句什么意思呢 public static SqlConnection conn = null; public static SqlCommand cmd = null; 解决方案 一个链接 数据库 一个执行sql语句 解决方案二: 没意义的写法,定义了对象引用,就相当于=null. 这是多此一举. 解决方案三: public static SqlConnection conn = null; 是定义一个公共的静态的Sql连接对象并赋值为null. public static

c#连接SQL Server的两种代码

#连接SQL Server的两种代码 连接字符串: <connectionStrings> <add name="conn" connectionString="user id=sa;Password=;initial catalog=Northwind;Server=YourSQLServer;Connect Timeout=30;" providerName="System.Data.SqlClient" /> <

SQL语句的两次执行问题

     昨天下午,写充值窗口时,出现了SQL语句被执行两次的问题.头痛了一下午和一晚上.     充值的窗口要操作两张表,一张是学生的基本信息表,就是将充值金额写入.另一张表,是用来存放本次充值的信息,比如:充值时间日期,谁充的钱...对前一张表的操作很快就写好了.但是在修改第二张表时,却出现了问题.      先来看一下代码: '修改教师充值表 SQL3 = "insert into tearechargeinfo values('" & strCardNum &

利用ASP嵌套JS+SQL Server打造两级连动下拉框(一)

js|server|下拉 利用ASP嵌套JS+SQL Server打造两级连动下拉框(1)   随着网络技术的迅速发展,越来越多的电子商务网站也应运而生.而在构建一个功能强大的电子商务网站往往少不了提供网上注册功能给客户自行注册这个模块,为了尽可能方便客户填写信息,我们经常要用到下拉框供客户选择,特别是两级连动下拉框最为常用. 再说,本人今日发现CSDN论坛上也经常有网友提问这个问题,就是,需要一个两级连动下拉框,第一个显示省份名称,第二个显示相应的城市名.为了解答这个问题,我特别写这篇文章,希

利用ASP嵌套JS+SQL Server打造两级连动下拉框(二)

js|server|下拉 利用ASP嵌套JS+SQL Server打造两级连动下拉框(2) TwoLevel.asp<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="GENERATOR" content="Microsoft FrontPage 4.0"

两句CSS完美截断侧栏最新评论列表

常见的侧栏最新评论列表一般有两种格式:路人甲 发表于 某某文章,或者 路人乙:引言-- 它们都有个问题,就是换行很难控制,长短不一,有时候内容还会把页面撑破.老肥研究了很久 CSS 手册,找到了一个符合标准的办法,像现在我的侧栏 widget 一样,强制只显示一行,多出来的一刀切断,是不是有点像 Gmail 里面的预览文字?方法很简单,比如我的侧栏 widget 是 <DIV class="widget">, 要对它下面的 <LI>进行截断,那么用下面的 CSS

可视化Swing中JTable控件绑定SQL数据源的两种方法深入解析

以下是对可视化Swing中JTable控件绑定SQL数据源的两种方法进行了详细的分析介绍,需要的朋友可以过来参考一下   在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方法.JTable的构造方法通过查阅Java的API,可以可以得到JTable的两个重要的构造方法:JTable(Object[][] rowData, Object[] colu