[英]Left outer join on 2 columns not running properly
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
您的查询从表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)
您可以通过不同的方式实现他的目标。
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)
要么
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.