查詢兩張表數(shù)據(jù)不一致的記錄,可以用求差集(非交集)的辦法來解決。
創(chuàng)新互聯(lián)建站是專業(yè)的東風(fēng)網(wǎng)站建設(shè)公司,東風(fēng)接單;提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行東風(fēng)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
SQL語言求"差集"的辦法相對(duì)于求"交集"的辦法要少很多,一般可用not exists(非存在子句)或 左(右)連接后所產(chǎn)生空字段值來篩選兩表的差集。
下面舉個(gè)例子供參考
選出a表中與b表中id不一致的記錄
select a.* from a where not exists (select 1 from b where b.id=c.id);
說明:上述語句只比對(duì)id一個(gè)字段,我們可以根據(jù)需要比對(duì)多個(gè)字段。not exists在比對(duì)字段有可利用的索引時(shí),其運(yùn)行效率是非常高,但是如果沒有索引的情況下運(yùn)行在大數(shù)據(jù)表時(shí),其運(yùn)行效率極差,這時(shí)應(yīng)避免使用它,這時(shí)我們可改用左(右)連接來求差集。
下面是用左連接來求差集的例子:
1
select a.* from a left join b on a.id=b.id where b.id is null;
用左(右)連接來求差集,由于需要實(shí)施兩表連接會(huì)導(dǎo)致笛卡爾效應(yīng)其輸出集的記錄行可能會(huì)增多,若果不是一對(duì)一或一對(duì)多,我們應(yīng)該將多對(duì)多的情況處理成多對(duì)一后才進(jìn)行連接,否則輸出的記錄集可能不正確。
求差集的兩種方法,有索引可利用時(shí),not exists的效率要高于left join,反之left join效率更好。
只是查詢,不做刪除吧:
SELECT * FROM 表1 WHERE name NOT IN (
SELECT name FROM 表2
)
CREATE TABLE A (
`C1` VARCHAR(10),
`C2` VARCHAR(10),
`C3` VARCHAR(10),
`C4` VARCHAR(10),
`C5` INT
);
INSERT INTO A
SELECT '華北', '遼寧', '沈陽', '20020202', 2 UNION ALL
SELECT '華東', '山東', '青島', '18020133', 3 UNION ALL
SELECT '華北', '北京', '北京', '7193', 7 UNION ALL
SELECT '華北', '北京', '北京', '8358', 5 UNION ALL
SELECT '華北', '北京', '北京', '9773', 8 UNION ALL
SELECT '華東', '山東', '青島', '18020133', 5 ;
CREATE TABLE B (
`C1` VARCHAR(10),
`C2` VARCHAR(10),
`C3` VARCHAR(10),
`C4` VARCHAR(10),
`C5` INT
);
INSERT INTO B
SELECT '華北', '遼寧', '沈陽', '20020202', 5 UNION ALL
SELECT '華東', '山東', '青島', '18020133', 6 UNION ALL
SELECT '華北', '北京', '北京', '7193', 2 UNION ALL
SELECT '華東', '甘肅', '蘭州', '7364', 3 UNION ALL
SELECT '華東', '湖北', '武漢', '7512', 7 UNION ALL
SELECT '華東', '湖北', '武漢', '7512', 2 UNION ALL
SELECT '華東', '江蘇', '常州', '7582', 5 UNION ALL
SELECT '華東', '江蘇', '淮安', '7670', 7;
SELECT
IFNULL(A.`C1`, B.`C1`) AS `區(qū)域`,
IFNULL(A.`C2`, B.`C2`) AS `省份`,
IFNULL(A.`C3`, B.`C3`) AS `城市`,
IFNULL(A.`C4`, B.`C4`) AS `編碼`,
SUM(A.`C5`) AS `表A銷量`,
SUM(B.`C5`) AS `表B銷量`
FROM
A LEFT JOIN B
ON (
A.`C1` = B.`C1` AND
A.`C2` = B.`C2` AND
A.`C3` = B.`C3` AND
A.`C4` = B.`C4`
)
GROUP BY
IFNULL(A.`C1`, B.`C1`),
IFNULL(A.`C2`, B.`C2`),
IFNULL(A.`C3`, B.`C3`),
IFNULL(A.`C4`, B.`C4`)
UNION
SELECT
IFNULL(A.`C1`, B.`C1`) AS `區(qū)域`,
IFNULL(A.`C2`, B.`C2`) AS `省份`,
IFNULL(A.`C3`, B.`C3`) AS `城市`,
IFNULL(A.`C4`, B.`C4`) AS `編碼`,
SUM(A.`C5`) AS `表A銷量`,
SUM(B.`C5`) AS `表B銷量`
FROM
A RIGHT JOIN B
ON (
A.`C1` = B.`C1` AND
A.`C2` = B.`C2` AND
A.`C3` = B.`C3` AND
A.`C4` = B.`C4`
)
GROUP BY
IFNULL(A.`C1`, B.`C1`),
IFNULL(A.`C2`, B.`C2`),
IFNULL(A.`C3`, B.`C3`),
IFNULL(A.`C4`, B.`C4`);
+------+------+------+----------+---------+---------+
| 區(qū)域 | 省份 | 城市 | 編碼 | 表A銷量 | 表B銷量 |
+------+------+------+----------+---------+---------+
| 華北 | 遼寧 | 沈陽 | 20020202 | 2 | 5 |
| 華北 | 北京 | 北京 | 7193 | 7 | 2 |
| 華北 | 北京 | 北京 | 8358 | 5 | NULL |
| 華北 | 北京 | 北京 | 9773 | 8 | NULL |
| 華東 | 山東 | 青島 | 18020133 | 8 | 12 |
| 華東 | 甘肅 | 蘭州 | 7364 | NULL | 3 |
| 華東 | 湖北 | 武漢 | 7512 | NULL | 9 |
| 華東 | 江蘇 | 常州 | 7582 | NULL | 5 |
| 華東 | 江蘇 | 淮安 | 7670 | NULL | 7 |
+------+------+------+----------+---------+---------+
9 rows in set (0.00 sec)
select?URL?from?TABLEA?
where???url?not?in?(select?URL?from?TABLEB?where?APP_NAME=TABLEA.APP_NAME)