SELECT...FROM 表 a,( SELECT...FROM...WHERE...) tc...的一些注意
阿新 • • 發佈:2022-02-25
將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一樣
以上
您能讀到這兒,我呢是發自真心的感謝您,若要轉載,還望請您帶上鍊接