繁体   English   中英

2列上的左外部联接无法正常运行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM