a 是包含5,000,000条记录和分数的表格。 b 是包含100,000条记录和(不同)分数的表格。我希望输出表格 a 中的每条记录,只要同一记录不在表格 b 中且得分等于1。
我写的以下查询执行了15个小时,但仍在运行。是否有可能需要这么长时间来进行这样的查询,或者我的代码可能有问题?
SELECT a.c1, a.c2, a.score
INTO OUTFILE 'file.csv'
FROM a
LEFT OUTER JOIN b
ON a.c1=b.c1
AND a.c2=b.c2
WHERE b.score <> 1
答案 0 :(得分:1)
您的查询检索表a中同样位于表b中且分数不等于1的所有记录(并且它将检索这些记录的次数与表b中显示的分数不同于1)。 这与“表a中的每条记录不同,只要同一记录不在表b中且得分等于1”。
SELECT a.c1, a.c2, a.score
INTO OUTFILE 'file.csv'
FROM a
WHERE NOT EXISTS (
SELECT 1 FROM b
WHERE a.c1 = b.c1
AND a.c2 = b.c2
AND b.score = 1
)
上面的查询可以利用以下索引
create index my_idx on b(c1,c2,score)
答案 1 :(得分:1)
你可以用不同的方式实现他。
SELECT a.c1, a.c2, a.score
INTO OUTFILE 'file.csv'
FROM a WHERE NOT EXISTS
(SELECT * FROM b WHERE a.c1=b.c1
AND a.c2=b.c2 and b.score = 1)
OR
SELECT a.c1, a.c2, a.score
INTO OUTFILE 'file.csv'
FROM a WHERE NOT EXISTS
(SELECT * FROM a INNER JOIN b
ON a.c1=b.c1
AND a.c2=b.c2 and b.score =1 )
另一种方式
;with t as
(
SELECT a.c1, a.c2, a.score from a
),
u as
(
select * FROM b where score =1 and b.c2=t.c2 and b.c1 = t.c1
)
SELECT t.c1,t.c2,t.score FROm t INTO OUTPUT 'FILe.csv WHERE NOT EXISTS (SELECT * FROM u)
您也可以使用In,但这可能会出现性能问题。 http://www.w3resource.com/sql/special-operators/sql_exists.php