Как сравнить количество строк в 3 или более таблицах и вернуть логическое значение?

Я могу получить BOOLEAN результат, чтобы сказать, имеют ли ДВЕ таблицы одинаковое количество строк в соответствии с этим вопросом и ответами: Сравнить количество строк в двух таблицах в одном запросе и вернуть логическое значение

SELECT 
       CASE WHEN (select count(*) from table1)=(select count(*) from table2)
       THEN 1
       ELSE 0
END AS RowCountResult

Я пробовал это с 3 таблицами:

SELECT 
    CASE WHEN (SELECT count(*) from personal)=(SELECT count(*) from exam)=(SELECT COUNT(*) from contact)    
THEN 1 
ELSE 0 
END AS RowCountResult 

но это возвращает 0, тогда как 3 таблицы на самом деле имеют одинаковое количество строк, поэтому он должен возвращать 1. Любая помощь приветствуется!


person Benjamin    schedule 08.04.2021    source источник


Ответы (2)


Выражение вроде:

a = b = c

оценивается (слева направо) как:

(a = b) = c

и поскольку (a = b) является логическим выражением, оно оценивается как 0 или 1, поэтому вы получаете оценку 1 = c или 0 = c, которая в вашем случае (скорее всего) всегда false.

Вы должны сравнить отдельно a с b и b с c и использовать оператор AND для окончательного результата, например:

a = b AND b = c

Итак, ваш код должен быть:

SELECT 
  (SELECT count(*) from personal) = (SELECT count(*) from exam)
  AND
  (SELECT count(*) from exam) = (SELECT COUNT(*) from contact) AS RowCountResult

или лучше с подзапросом:

SELECT count1 = count2 AND count2 = count3 AS RowCountResult 
FROM (
  SELECT (SELECT count(*) from personal) count1,
         (SELECT count(*) from exam) count2,
         (SELECT COUNT(*) from contact) count3    
) t 

На самом деле вам не нужно выражение CASE.

person forpas    schedule 08.04.2021
comment
Спасибо за это подробное объяснение. - person Benjamin; 08.04.2021

Это связано с тем, что вы сравниваете результат сравнения с третьим числом строк, то есть A = B (что даст истину или ложь) с C (который в данном случае является числом). Вы должны получить то, что вы ожидаете, например, ( A=B)=(B=C), или, в вашем случае

SELECT 
    CASE WHEN 
    ((SELECT COUNT(*) FROM Personal) = (SELECT COUNT(*) FROM Exam))
    = ((SELECT COUNT(*) FROM Contact) = (SELECT COUNT(*) FROM Exam))    
    THEN 1 
    ELSE 0 
    END 
AS RowCountResult 
person Morten    schedule 08.04.2021
comment
Спасибо! У меня это работает сейчас. - person Benjamin; 08.04.2021