1. 程式人生 > 其它 >SELECT...FROM 表 a,( SELECT...FROM...WHERE...) tc...的一些注意

SELECT...FROM 表 a,( SELECT...FROM...WHERE...) tc...的一些注意

將sql查詢結果作為一個表來查詢的時候的一些注意事項

因為工作,發現了這種sql的寫法,但是有的時候感覺並不是自己想要的結果,自己試著玩了屬於是

簡單來說,這個查詢並不是拼接結果的,而是將結果按照一個表來進行sql查詢的

表結構,表資料如下

或者將表建好以後插入進去

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

可以得到

但是執行下面的這段時

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

結果卻是

單獨執行

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)為

明明兩個表中的資料都只有兩行,為什麼會出現四行的資料呢

再修改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

結果為

此時結果又成為了兩行資料

大概猜測:這種方法查出的結果是按照從第一個表開始查詢,然後拿到結果,在查詢第二個,在輸出第二個查詢的結果時,每一次輸出結果都會將前面的結果帶出來,以此類推,也就是說,如果第一個表中的結果有兩行,第二的查詢的結果有兩行,第三個查詢的結果有一行,則總的結果集就一共有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行

所以這個結果並不是拼接的,而是和普通sql一樣

以上

您能讀到這兒,我呢是發自真心的感謝您,若要轉載,還望請您帶上鍊接