2列上的左外连接未正常运行

时间:2014-09-03 03:29:25

标签: sql heidisql

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

2 个答案:

答案 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