В MySQL, как использовать подзапрос к левому оператору соединения?

Я попытался посчитать, сколько новых кортежей в подмножестве 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 ответа

Решение

Нет необходимости заключать 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)

Вы уверены, что не хотите делать COUNT(t.id)? t2 находится в подзапросе и не доступен для основного запроса, доступны только t и t1.

Проблема в псевдониме. У тебя есть:

select count(t2.id)

Но t2 определено в подзапросе, поэтому оно выходит за рамки.

Ты хочешь:

select count(t.id)
Другие вопросы по тегам