SQL WHERE подзапрос в списке полей

У меня есть запрос как:

SELECT field
FROM table
WHERE
    (
        SELECT COUNT(*)
        FROM table2
        WHERE table2.field = table.field
    )
    !=
    (
        SELECT COUNT(*)
        FROM table3
        WHERE table3.field = table.field
    )

Теперь я хочу иметь те WHERE подзапросы в моем списке полей, как:

SELECT field, count1, count2
FROM table
WHERE
    (
        SELECT COUNT(*)
        FROM table2
        WHERE table2.field = table.field
    ) AS Count1
    !=
    (
        SELECT COUNT(*)
        FROM table3
        WHERE table3.field = table.field
    ) AS Count2

Это возможно? Конечно, я мог бы поместить эти подзапросы в список полей, но тогда я не могу их сравнить.

Есть идеи?

3 ответа

Решение

Вы можете сделать это, если вы используете Sql Server:

SELECT field, ca2.c2, ca3.c3
FROM table t
cross apply(SELECT COUNT(*) c2
            FROM table2 t2
            WHERE t2.field = t.field)ca2
cross apply(SELECT COUNT(*) c3
            FROM table3 t3
            WHERE t3.field = t.field)ca3
where ca2.c2 <> ca1.c1

Используйте коррелированные субвыборы для подсчета. Заверните в производную таблицу:

select dt.* from
(
SELECT field,
       (SELECT COUNT(*)
        FROM table2
        WHERE table2.field = table.field) as cnt1,
       (SELECT COUNT(*)
        FROM table3
        WHERE table3.field = table.field) as cnt2
FROM table
) dt
where dt.cnt1 <> dt.cnt2

Вам просто нужно использовать производную таблицу:

select *
from
 (
   SELECT field, 
    (
        SELECT COUNT(*)
        FROM table2
        WHERE table2.field = table.field
    ) AS Count1,
    (
        SELECT COUNT(*)
        FROM table3
        WHERE table3.field = table.field
    ) AS Count2
   FROM table
 ) dt
WHERE Count1 <> Count2
Другие вопросы по тегам