2

我试图计算 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

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

4

3 回答 3

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)
于 2012-07-18T21:57:21.760 回答
1

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

于 2012-07-18T21:56:27.577 回答
1

问题是别名。你有:

select count(t2.id)

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

你要:

select count(t.id)
于 2012-07-18T21:57:59.240 回答