这种SQL 语句 为什么每条会查出好多重复的

谁学逆向工程 其他  2017-11-21 10:53:44
已经明确指明是 t1 表了,他还会从 t2 在查询一遍吗,那应该最多两条重复的,咋出来这么多!!
我这里是 SQL SERVER 2008

...全文
683 18 点赞 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
weixin_40706162 2017-11-28
要不帖个 查t1表的所有数据 然后把这条的 查询条件帖t2的删了 应该就好了 如果你只要一条 就 Count(1)
  • 打赏
  • 举报
回复
引用 11 楼 liuzhe147 的回复:
[quote=引用 8 楼 xomix 的回复:] [quote=引用 4 楼 xiaoyuanyuan2009 的回复:] [quote=引用 1 楼 xomix 的回复:] 先写成inner join 再看看出了什么问题
你完全可以做一个select 表1的截图啊[/quote] 你没发现t1 t2 表是一样的么 select*from '000'.tbgoods as t1 where t1.GoodName like '%白菜%' 这样查出来还是这么多数据,那就是数据库里面就是有这么多的数据[/quote] 你join不on,就是个full join,这样的结果是表1如果有一条白菜那么就会产生 表1数量级的白菜开头表1其他字在后面的全部记录。
  • 打赏
  • 举报
回复
引用 8 楼 xomix 的回复:
[quote=引用 4 楼 xiaoyuanyuan2009 的回复:] [quote=引用 1 楼 xomix 的回复:] 先写成inner join 再看看出了什么问题
你完全可以做一个select 表1的截图啊[/quote] 你没发现t1 t2 表是一样的么 select*from '000'.tbgoods as t1 where t1.GoodName like '%白菜%' 这样查出来还是这么多数据,那就是数据库里面就是有这么多的数据
  • 打赏
  • 举报
回复
FainSheeg 2017-11-21
也就是说,如果你的T1表里面,如果小白菜这个只有一条记录的话,那你的T2表里总共有多少条记录,你就能查出多少条重复的小白菜来。
  • 打赏
  • 举报
回复
笛卡儿积,数据量本来就是爆炸的。
  • 打赏
  • 举报
回复
FainSheeg 2017-11-21
你的t1,t2,没有用on语句进行关联,把以t1和t2的关系 是Cross Join,百度一下笛卡尔乘积吧,不知道为什么有这么多重复的了。 而且如三楼所说,你都没用的T2表,为毛要关联进来。
  • 打赏
  • 举报
回复
引用 4 楼 xiaoyuanyuan2009 的回复:
[quote=引用 1 楼 xomix 的回复:] 先写成inner join 再看看出了什么问题
[/quote] 嗯…………没有on的话我不知默认on在哪里。 但是看着情况你表1里面本来就这么多数据啊。 你完全可以做一个select 表1的截图啊
  • 打赏
  • 举报
回复
夏天的枫 2017-11-21
like '%白菜' 这样?
  • 打赏
  • 举报
回复
引用 3 楼 lv1204 的回复:
那你既然只想查询t1的数,为何要加上t2
猜测一下数据库是怎么运行的SQL 语句
  • 打赏
  • 举报
回复
引用 2 楼 hjq624779687 的回复:
会不会你数据就是那么多啊 老铁
肯定不是
  • 打赏
  • 举报
回复
引用 1 楼 xomix 的回复:
先写成inner join
再看看出了什么问题

  • 打赏
  • 举报
回复
清澈的风 2017-11-21
那你既然只想查询t1的数,为何要加上t2
  • 打赏
  • 举报
回复
夏天的枫 2017-11-21
会不会你数据就是那么多啊 老铁
  • 打赏
  • 举报
回复
先写成inner join 再看看出了什么问题
  • 打赏
  • 举报
回复
西漠以西 2017-11-21
学SQL,先搞懂笛卡尔积
  • 打赏
  • 举报
回复
cyg17173 2017-11-21
SQL 基础,发错版块了。
  • 打赏
  • 举报
回复
Drayne 2017-11-21
where t1.字段 = t2.字段 或者 要是t2没什么用就删掉吧
  • 打赏
  • 举报
回复
吉普赛的歌 2017-11-21
USE tempdb
GO
IF OBJECT_ID('t1') IS NOT NULL DROP TABLE t1
IF OBJECT_ID('t2') IS NOT NULL DROP TABLE t2
CREATE TABLE t1 (id1 int,c1 VARCHAR(10))
CREATE TABLE t2 (id2 INT)
INSERT INTO t1 (id1,c1) VALUES (1,'aa')
INSERT INTO t1 (id1,c1) VALUES (1,'bb')
INSERT INTO t1 (id1,c1) VALUES (2,'cc')
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2)

SELECT * FROM t1,t2
/*
------- 3 * 2 = 6 条数据
id1	c1	id2
1	aa	1
1	bb	1
2	cc	1
1	aa	2
1	bb	2
2	cc	2
*/

SELECT * FROM t1,t2 WHERE t1.c1 LIKE '%b%'
/*
--t1 表过滤了一条数据出来,t2 要取全部 : 1*2=2
id1	c1	id2
1	bb	1
1	bb	2
*/

SELECT * FROM t1 INNER JOIN t2 ON t1.c1 LIKE '%b%'
/*
--两者未发生实际连接
--t1 表过滤了一条数据出来,t2 要取全部 : 1*2=2
id1	c1	id2
1	bb	1
1	bb	2
*/

SELECT * FROM t1 INNER JOIN t2 ON t1.id1=t2.id2 AND t1.c1 LIKE '%b%'
/*
-- 两者有实际字段连接,连接数量为 2 条,经 like 过滤后只有一条
id1	c1	id2
1	bb	1
*/
你的两个表, 没有实际的字段连接, 当然如此了。 看看上面的小例子就知道的了啦。
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-11-21 10:53
社区公告

让您成为最强悍的C#开发者