左连接两个单独的查询

时间:2013-12-04 15:25:35

标签: mysql left-join outer-join

我有两个单独的查询,几乎可以返回相同的内容:

select id 
from t 
where id<>'' 
GROUP BY id 
having count(*) >= 2;

select id 
from t2 
where id is not null 
GROUP BY id 
having count(*) >= 2 
ORDER BY id ASC;

其值出现多次的ID列表。第一个查询返回的次数超过了第二个,所以我需要以某种方式将它们连接起来以获得第一个查询中的结果,但不是第二个查询中的结果。我试图做左连接,但它无法正常工作。

我也试过以下无济于事:

select id 
from t 
where id<>'' 
GROUP BY id 
having count(*) >= 2 
  not in (select id from t2 where id is not null GROUP BY id having count(*) >= 2 
          ORDER BY id ASC)

其他信息

查询一个给了我所有与表1具有相同值的ID,查询2给了我与表2相同的值。还有其他的问题,比如表1中有一些空白ID,而有一些表2中为空,因此条件不包括前者的空白和后者的空值。所以我收回这两个单独的结果,几乎是相同的,除了在结果1中有声称不在结果2 但仅在运行这些查询时,因为它们在表1中重复但不是在表2中,虽然它们确实存在于表2中。所以一个简单的左连接,其中t1.id&lt;&gt; t2.id将无效,因为它们确实存在于t2中。

enter image description here

2 个答案:

答案 0 :(得分:1)

SELECT t.id, t2.id FROM t 
LEFT OUTER JOIN t2
ON t.id <> t2.id
WHERE t.id<>'' 
GROUP BY t.id having count(t.id) >= 2 
ORDER BY t.id ASC

我假设您的不在部分之前,子查询实际上意味着表t和t2中的id不相同,因此添加条件 t.id&lt;&gt; t2.id

修改

SELECT t.id  FROM t 
WHERE t.id<>''
AND t.id NOT IN (SELECT id FROM t2  where id is not null )
GROUP BY t.id having count(t.id) >= 2 
ORDER BY t.id ASC

SQLFIDDLE

答案 1 :(得分:1)

您想在t1中选择不在t2中的ID。 JOIN上的t2,并确保结果为NULL

SELECT t.id
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE t2.id IS NULL
GROUP BY t.id
HAVING COUNT(t.id) > 1