我需要在两个(或更多)表之间进行比较,其中包含大约60,000行和大约60列。
在这些表中,我有两个值要运行查询。查询的目的是根据行中的两个值计算TABLE_A中存在但不存在于TABLE_B中的行。
我运行了以下查询:
SELECT id
FROM table_a ta
WHERE NOT EXISTS (
SELECT id
FROM table_b tb
WHERE ta.value1=tb.value1 AND ta.value2=tb.value2
)
如上所述,我已尝试过上面的代码及其中的一些变体。但要运行此查询,它需要很长时间才能完成。我希望找到一个在10秒内运行的解决方案。
我试过的下一个查询,我认为其中有效:
SELECT value1, value2
FROM (
SELECT ta.value1, ta.value2
FROM table_a ta
UNION ALL
SELECT tb.value1, tb.value2
FROM table_b tb
) result
GROUP BY value1, value2
HAVING COUNT(*) = 1
ORDER BY value1
代码显示了两个表之间的所有差异。因此,如果valueX存在于TABLE_A中但不存在于TABLE_B中,则显示它,反之亦然。
因此,简而言之,我希望从TABLE_B中获取TABLE_B中的所有行,这些行基于行中的两个值。
希望有人能提供帮助,谢谢!
答案 0 :(得分:3)
为什么不使用加入?
/* Create a table called NAMES */
CREATE TABLE NAMES(Id integer PRIMARY KEY, Name text, LastName text);
CREATE TABLE OTHERNAMES(Id integer PRIMARY KEY, Name text, LastName text);
/* Create few records in this table */
INSERT INTO NAMES VALUES(1,'Tom','Riddle');
INSERT INTO NAMES VALUES(2,'Lucy','I love');
INSERT INTO NAMES VALUES(3,'Frank','Frankly');
INSERT INTO NAMES VALUES(4,'Jane','Austen');
INSERT INTO NAMES VALUES(5,'Robert','Downey');
INSERT INTO OTHERNAMES VALUES(2,'Lucy','I love');
INSERT INTO OTHERNAMES VALUES(3,'Frank','Frankly');
INSERT INTO OTHERNAMES VALUES(4,'Jane','Austen');
INSERT INTO OTHERNAMES VALUES(5,'Robert','Downey');
select * from NAMES
LEFT JOIN OTHERNAMES on
NAMES.Name = OTHERNAMES.Name
AND Names.LastName = OTHERNAMES.LastName
where OTHERNAMES.id is null
在线查看http://sqlfiddle.com/#!9/640c53/1
如果使用LEFT JOIN
右表中不存在的项将被替换为空条目,可以使用where过滤。
我不知道您的60.000数据库有多高效,但这通常对我有用。
答案 1 :(得分:0)
经过一些试验和错误后,我改进了第二块代码。我注意到我的表格中有一个额外的字段,我可以用来进一步过滤结果。
SELECT date, value1, value2
FROM (
SELECT date, value1, value2
FROM (
SELECT ta.date, ta.value1, ta.value2
FROM table_1 ta
UNION ALL
SELECT tb.date, tb.value1, tb.value2
FROM table_2 tb
) filter
GROUP BY value1, value2
HAVING COUNT(*) = 1
) result
WHERE date='YYYY-MM-DD'
此代码在4秒内过滤结果。
无论如何,感谢大家的麻烦。