我有两个MySQL表(testa,resa),如下所示:
CREATE TABLE RESA (
`tdate` date,
`reg` varchar(4),
`num` int(2),
`P1` int(2),
`P2` int(2),
`P3` int(2),
`P4` int(2)
);
CREATE TABLE TESTA (
`tdate` date,
`reg` varchar(4),
`numa` int(2),
`numb` int(2),
`name` varchar(10),
`reso` varchar(2)
);
INSERT INTO RESA VALUES
("2015-12-06", 'NERA', 2, 1,2,3,4),
("2015-12-06", 'WAS', 5, 5,6,7,9),
("2015-12-08", 'NERA', 1, 3,5,6,8);
INSERT INTO TESTA VALUES
("2015-12-06", 'NERA', 2,1, 'Qalyub',""),
("2015-12-06", 'NERA', 2,2, 'Kunjin',""),
("2015-12-06", 'NERA', 2,3, 'Carrizal',""),
("2015-12-07", 'NERA', 2,4, 'Amur',""),
("2015-12-06", 'NERA', 2,6, 'Heni',""),
("2015-12-06", 'NERA', 2,7, 'El Moro',""),
("2015-12-07", 'NERA', 2,10, 'Fifth-C',""),
("2015-12-06", 'WAS', 5,2, 'Bora',""),
("2015-12-06", 'WAS', 5,3, 'Imjin',""),
("2015-12-06", 'WAS', 5,5, 'RR',""),
("2015-12-07", 'WAS', 5,6, 'Qalyub',""),
("2015-12-06", 'WAS', 5,7, 'RR',""),
("2015-12-07", 'WAS', 5,9, 'Qalyub',""),
("2015-12-07", 'NERA', 1,2, 'Kunjin',""),
("2015-12-07", 'NERA', 1,3, 'Carrizal',""),
("2015-12-07", 'NERA', 1,5, 'Amur',""),
("2015-12-07", 'NERA', 1,6, 'Bora',""),
("2015-12-07", 'NERA', 1,7, 'Imjin',""),
("2015-12-07", 'NERA', 1,8, 'Magboy',"") ;
Run Code Online (Sandbox Code Playgroud)
实际表具有数千行和其他列。
对于每个RESA行,都有可变数量的关联TESTA行,其中每个表的前3个字段(date,reg,num / date,reg,numa)建立关系。两个表中的行是不同的,即没有重复。
每个实验结果(RESA)行至少有2个测试(TESTA)行。
当每个表的前3个字段匹配时,仅TESTA行中的一个对应于RESA.p1和TESTA.numb,因此以下内容将返回两个表中的所有相关行,这些更新行将用于将更新应用于TESTA中的其他列:
SELECT * FROM TESTA as T
NATURAL JOIN RESA AS R
WHERE T.numb = R.p1;
Run Code Online (Sandbox Code Playgroud)
因此,要更新的TESTA行的计数应与表RESA中的行计数匹配,即,以下计数将相同:
mysql>SELECT count(*) FROM TESTA as T
NATURAL JOIN RESA AS R
WHERE T.numb = R.p1;
mysql>SELECT COUNT(*) FROM RESA;
Run Code Online (Sandbox Code Playgroud)
在样本数据中,它们是不一样的,这就是我要确定的问题。在小样本中,罪魁祸首很容易找到:RESA.tdate在最后一行:(“ 2015-12-08”,'NERA',1,3,5,6,8); 不正确,应为“ 2015-12-07”,与TESTA中的相关数据匹配。
我的问题是如何在RESA中使用更大的数据库来识别孤儿,即那些在TESTA中没有相关数据的行?
上面的反面:
SELECT count(*) FROM TESTA as T
NATURAL JOIN RESA AS R
WHERE T.numb != R.p1;
Run Code Online (Sandbox Code Playgroud)
由于RESA具有唯一(即,在TESTA中不存在并且不正确)的tdate值,因此相关字段没有NATURAL JOIN,因此无法使用。
我的实际数据库有数千行,并且有2个差异,是否可以使用脚本来识别它们?
所以像LEFT JOIN?
SELECT t.* FROM RESA t
LEFT OUTER JOIN TESTA s
ON(t.tdate = s.tdate AND t.reg = s.reg and t.num = s.numa)
WHERE s.tdate is null
Run Code Online (Sandbox Code Playgroud)
或搭配NOT EXISTS():
SELECT t.* FROM RESA t
WHERE NOT EXISTS(SELECT 1 FROM TESTA s
WHERE t.tdate = s.tdate
AND t.reg = s.reg
AND t.num = s.numa)
Run Code Online (Sandbox Code Playgroud)