• 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
    	cpcitemtest ct,(
    	SELECT t.*
    	FROM
    		 testcpcbom t 
    	WHERE
    		t.itemid LIKE '12%' 
    	) tc,
    	( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%' ) td
    

    结果8行

    image

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

    以上

  • 相关阅读:
    由铭心提供的免费邮箱
    BT面板安装教程
    Onedrive分享型网盘搭建
    cookie与session
    IntelliJ Idea 2017 免费激活方法
    什么情况下出现的redis
    tomcat编码问题
    idea启动项目报Unable to open debugger port (127.0.0.1:11480): java.net.SocketException "socket closed"
    Sentry异常捕获平台
    亚瑟·阿伦博士的36个问题
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/15933913.html
Copyright © 2020-2023  润新知