В 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)