在MySQL中,如何将子查询用于左连接语句?

时间:2012-07-18 21:50:58

标签: mysql sql select left-join clause

我尝试计算t2子集中有多少新元组与t1相比

SELECT
  COUNT(t2.id)
FROM (
  (SELECT id, col1 FROM t2 WHERE col2=0 AND col3=0) AS t
  LEFT OUTER JOIN
    t1
  ON
    t.id=t1.id
)
WHERE
  t1.id IS NULL;

子集由

定义
(SELECT id, col1 FROM t2 WHERE col2=0 AND col3=0) AS t

但上述程序似乎不起作用,发出错误。

3 个答案:

答案 0 :(得分:2)

无需在FROM中附上()条款。您在汇总t2.id中引用了COUNT(),但您的SELECT列表只会从封装t.id的子查询中生成t2。此版本解决了您的错误来源:

SELECT
  COUNT(t.id) AS idcount
FROM 
  (SELECT id, col1 FROM t2 WHERE col2=0 AND col3=0) AS t
  LEFT OUTER JOIN t1 ON t.id = t1.id
WHERE t1.id IS NULL

然而:

由于您的子查询实际上非常简单,我认为根本没有必要。整个过程可以使用LEFT JOIN

完成
SELECT
  /* The equivalent of COUNT(*) in this context */
  COUNT(t2.id) AS idcount
FROM
  t2 
  LEFT OUTER JOIN t1 ON t2.id = t1.id
WHERE
  t1.id IS NULL
  AND (t2.col2 = 0 AND t2.col3 = 0)

答案 1 :(得分:1)

你确定你不想做COUNT(t.id)吗? t2在子查询中,仅主t查询不可用,t和t1可用。

答案 2 :(得分:1)

问题在于别名。你有:

select count(t2.id)

但是,t2是在子查询中定义的,因此它超出了范围。

你想:

select count(t.id)