当前位置:首页 » 编程语言 » sql不在表中
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql不在表中

发布时间: 2023-06-17 01:21:30

sql如何判断不在表中数据段内

select 表1.[No] from 表1,表2 group by 表1.[No] having(sum(case when (表1.[No]>表2.[from] and 表1.[No]<表2.[to]) then 1 else 0 end)=0)

Ⅱ SQL中,如何查询存在一个表而不在另一个表中的数据记录

问题是怎么才算在两个表里都有?我以ID相同举例吧,其他的自己悟。 select * from a where id not in (select id from b) 这样就能列出a表里有而b表里没有的记录(以ID相同为标准)。 明白了嘛? 晕……你又没说是MYSQL……

Ⅲ mysql查询数值不在表中的sql语句

select id from table where id in(1,2,3,4);这段先查询到你数据库存在的id,

然后在程序里面过滤掉这些id,剩下的就是数据不存在的id

Ⅳ sql 如何查询不在这个范围内的数据,如下

用not in语句即可解决。

Ⅳ 关于sql查询b表中存在,a表中不存在的数据

这实际上是求非交集(差集)问题,sql语句求差集相对于求交集的办法要少得多。

求差集方法中,使用not in关键字进行筛选在逻辑上最容易理解,很多人都会想到利用到它,数据量不大时还行,但是它有个重大缺陷,那就是在碰到大数据表的情况下其运行效率极低,有没有可被利用的索引效率都一样极差。我曾在利用大数据表的测试中,发现not in 语句常常要花费数小时才能返回结果,最夸张的例子耗时竟然超过一天!在返回结果前数据查询会处在"假死"状态,让人感觉是返回了空集似的,其实不是那样的,只是数据库引擎尚未完成运算而已。

在有可被利用的索引情况下,我们可以利用非存在not exists子句来筛选出两表之间的差集,其运行效率是非常高的。以题主的语句为例可改写如下:

原来使用not in筛选差集,大数据表效率极差:
SELECT ipdz FROM ipdz_b WHERE ipdz not in(select ipdz_d from zj_b);

而使用not exists筛选差集,大数据表有索引可利用时返回结果酒快多了:
select b.ipdz from ipdz_b b where not exists(
select 1 from zj_b a where a.ipdz_d=b.ipdz);

请留意不要踩not exists的坑!尽管它在有可被利用的索引时运行效率极高,但是如果没可利用的索引它会跟not in一样在遇到大数据表时, 运行运行效率也很糟!

在没有索引可被利用的情况下,建议利用左(右)联接出现的null值来求出差集,但是需要留意并小心处理因两表连接所导致的记录行变多问题。

下面是以题主的表结构为例的sql语句写法,其返回结果集的速度还是很不错的:

left join 筛选差集:
select b.ipdz from ipdz_b b left join zj_b a on
a.ipdz_d=b.ipdz where a.ipdz_d is null;

这里假设a表的ipdz_d是唯一的,如果非唯一需调整如下

select b.ipdz from ipdz_b b left join (
select distinct ipzd_d from zj_b) a on
a.ipdz_d=b.ipdz where a.ipdz_d is null;

总结:

小数据量not in随便用,此方法逻辑简单,语句易于编写;
大数据量在有可利用的索引情况下,建议首选 not exists(因为效率最高);
大数据量时,有没有可被利用的索引not in都要避免使用。而not exists 在没索引可利用时也应避免使用,此时建议使用左left join或右连接返回差集会有比较好的表现。

后两种方法在逻辑上不太好理解,还要处理因连接导致的记录行变多问题,语句编写相对麻烦。

Ⅵ SQL中如何判断一个字符是否包含在表字段中,而不是包含在表记录中

Select
name
from
syscolumns
Where
ID=OBJECT_ID('表名')
这个可以查出你所查询的表的所有字段名字,如你所说你传入个3个话可以写
Select
name
from
syscolumns
Where
ID=OBJECT_ID('表名')
and
name
like
'%3%'
这样返回就是这个表的字段名包含3的字段了,在程序里你自己把这些个字段名取出来,拼成
字段1,字段2的格式,再放到你的查询语句去就是了~

Ⅶ SqlServer2008 如何判断一张表的数据不在另外两张表里且在该表中新建一列显示状态

判断tab1的是否在tab2和tab3中有值:
SELECT DISTINCT
a.表字段 AS 字段名,
NVL(b.外键,0) AS dataintab2,
NVL(c.外键,0) AS dataintab3
FROM tab1 a,tab2 b,tab3 c
WHERE a.主键=b.外键(+)
AND a.主键=c.外键(+)
AND a.主键=一个具体值;

PS:1、NVL函数为如果b的外键为空则返回0
2、(+)表示对于a与b和a与c的连接使用左外连接,即就算b和c中没有数据也会将a中的数据返回
3、将b和c的外键返回给dataintab2和dataintab3,即如果b和c中有数据则返回这个数据,否则为空返回0
4、判断b和c中是否有数据即看dataintab2和dataintab3是否为0,如果为0表示b或者c中没有a的数据
5、返回之后在程序中访问这个字段即可完成对其状态的显示。
6、由于使用了外连接,因此会返回几组相同的数据,使用DISTINCT去除相同的数据

上面是一个Oracle版本,下面是一个通用版本:
SELECT DISTINCT
a.表字段 AS 字段名,
NVL(b.外键,0) AS dataintab2,
NVL(c.外键,0) AS dataintab3
FROM tab1 a LEFT JOIN tab2 b ON a.主键=b.外键 LEFT JOIN tab3 c ON a.主键=c.外键
WHERE a.主键=一个具体值;

具体问题具体分析,希望朋友你能养成良好的分析问题的习惯。
希望能够对你有所帮助。

Ⅷ SQL中,如何查询存在一个表而不在另一个表中的数据记录

首先,在SQL中(以SQL Server为例),查询存在一个表而不在另一个表中的数据记录的方法有很多,介绍其中4种:

1、方法一(仅适用单个字段):使用 not in ,比较容易理解,缺点是效率低

如:select A.ID from A where A.ID not in (select ID from B);

2、方法二(适用多个字段匹配):使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录。

如:select A.ID from A left join B on A.ID=B.ID where B.ID is null ;

3、方法三(适用多个字段匹配)

如:select * from B where (select count(1) as num from A where A.ID = B.ID) = 0;

4、方法四(适用多个字段匹配)

如:select * from A where not exists(select 1 from B where A.ID=B.ID)

接着,我们来分析你的SQL语句为什么返回数据不准确的原因。

从你的SQL基础语句来看,你使用了方法一和方法四这两种,两种语法本身都是正确的,但是却没有达到预期的效果,初步分析,问题可能出在gsdj和swdj这两张表的qymc字段的判断比较上。

举个例子:'企业名称'和'企业名称 '这两个字符串看似相同,实际却并不相同,因为第二个“企业名称 ”的后面跟了一个空格字符。就因为这个空格字符导致这个"'企业名称'='企业名称 '"等式不成立。

考虑到你qymc这个字段的类型是字符型,建议你在原有sql基础上做一个微调如下:

select * from gsdj gs where not exists (select * from swdj sw where rtrim(ltrim(sw.qymc)))=rtrim(ltrim(gs.qymc)));

其中Ltrim()可以去除左侧空格,rtrim()可以去除右侧的空格,也就是说我们是对去除空格后的企业名称进行比较,排除了空格的干扰。

(8)sql不在表中扩展阅读:

在SQL中,对于字符型文本数据,经常需要用到去空格的操作,对ORACLE数据来说可以通过TRIM()函数来简单实现,而SQL SERVER中并没有TRIM()函数,只有LTRIM()和RTRIM()两个函数。

SQL 中使用ltrim()去除左边空格,rtrim()去除右边空格,没有同时去除左右空格的函数,要去除所有空格可以用replace(字符串,' ',''),将字符串里的空格替换为空。

例:去除空格函数

declare @temp char(50)

set @temp = ' hello sql '

print ltrim(@temp) --去除左边空格

print rtrim(@temp) --去除右边空格

print replace(@temp,' ','')--去除字符串里所有空格

print @temp

>> 输出结果
hello sql

hello sql

hellosql

hello sql