SELECT...FROM 表 a,( SELECT...FROM...WHERE...) tc...的一些注意以及多字段之间的模糊查询

将sql查询结果作为一个表来查询的时候的一些注意事项

因为工作,发现了这种sql的写法,但是有的时候感觉并不是自己想要的结果,自己试着玩了属于是

简单来说,这个查询并不是拼接结果的,而是将结果按照一个表来进行sql查询的

表结构,表数据如下

image

image

或者将表建好以后插入进去

INSERT INTO `test`.`cpcitemtest`(`itemid`, `itemcode`, `cpctest`, `cpcbom`) VALUES ('12321421', '1242142312', '43254634', '57658654');

INSERT INTO `test`.`testcpcbom`(`testid`, `itemid`, `cpcbomid`) VALUES (12345, '12', '54321');

运行下面的sql

SELECT
	ct.itemid AS ct的itemid,
	ct.itemcode AS ct的itemcode,
	tc.itemid AS tc的itemid
FROM
	cpcitemtest ct,(
	SELECT t.*
	FROM
		 testcpcbom t 
	WHERE
		t.itemid LIKE '123%' 
	) tc

可以得到

image

但是运行下面的这段时

SELECT
	ct.itemid AS ct的itemid,
	ct.itemcode AS ct的itemcode,
	tc.itemid AS tc的itemid,
	td.itemid AS td的itemid 
FROM
	cpcitemtest ct,(
	SELECT t.*
	FROM
		 testcpcbom t 
	WHERE
		t.itemid LIKE '1234567%' 
	) tc,
	( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%' ) td

结果却是

image

单独运行

SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%'

是有值的

但是

SELECT t.* FROM testcpcbom t WHERE t.itemid LIKE '1234567%'

是没有值的

说明在这种查询之中,有一个表查询出的结果为空时,切记不能放进总的查询中,会使查出的结果为空,即便别的有数据也没用

而且,将sql改成下面有结果的

SELECT
	ct.itemid AS ct的itemid,
	ct.itemcode AS ct的itemcode,
	tc.itemid AS tc的itemid,
	td.itemid AS td的itemid 
FROM
	cpcitemtest ct,(
	SELECT t.*
	FROM
		 testcpcbom t 
	WHERE
		t.itemid LIKE '123456%' 
	) tc,
	( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%' ) td

结果(方便看,将ct中的itemcode改成了1和2)为

image

明明两个表中的数据都只有两行,为什么会出现四行的数据呢

再修改sql为

SELECT
	ct.itemid AS ct的itemid,
	ct.itemcode AS ct的itemcode,
	tc.itemid AS tc的itemid,
	td.itemid AS td的itemid 
FROM
	cpcitemtest ct,(
	SELECT t.*
	FROM
		 testcpcbom t 
	WHERE
		t.itemid LIKE '123456%' 
	) tc,
	( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '123456%' ) td

结果为

image

此时结果又成为了两行数据

大概猜测:这种方法查出的结果是按照从第一个表开始查询,然后拿到结果,在查询第二个,在输出第二个查询的结果时,每一次输出结果都会将前面的结果带出来,以此类推,也就是说,如果第一个表中的结果有两行,第二的查询的结果有两行,第三个查询的结果有一行,则总的结果集就一共有2×2×1=4行结果,那么在所有的结果都能查出两行的时候,应该有8行结果

修改sql试试

SELECT
	ct.itemid AS ct的itemid,
	ct.itemcode AS ct的itemcode,
	tc.itemid AS tc的itemid,
	td.itemid AS td的itemid 
FROM
	cpctest ct,(
	SELECT t.*
	FROM
		 testcpc t 
	WHERE
		t.itemid LIKE '12%' 
	) tc,
	( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%' ) td

结果8行

image

所以这个结果并不是拼接的,而是和普通sql一样

多字段之间的模糊查询

平常是使用like去模糊匹配一下固定的字段

但是有的时候并不能符合自己的需要,所以要查询字段的值

可以使用

A.ITEM LIKE '%'+B.ITEMID+'%'

以上

posted @ 2022-02-24 22:37  DbWong_0918  阅读(807)  评论(0编辑  收藏  举报