Не уверен, что может сделать меня более идиоматичным, чем это. Ваш запрос кажется прекрасно. Какой бы ни была замена, она была бы, по меньшей мере, более многословной и не обязательно более ясной. (Я имею в виду, это может быть так же ясно и идиоматично, как и ваш запрос).
Но если вы настаиваете, вот возможный вариант:
SELECT a.cnt / b.cnt AS ratio
FROM
(SELECT COUNT(*) FROM a) a (cnt),
(SELECT COUNT(*) FROM b) b (cnt)
Может быть одна проблема. Вы делите целое число на целое число. Некоторые серверы баз данных выполняют целочисленное деление в таких случаях, что может привести к неожиданному результату. Например, 90 / 100
даст 0
, а 2000 / 1001
приведет к 1
.
Чтобы решить эту проблему, необходимо выполнить деление на нецелые числа. Достаточно преобразовать только один из операндов в нецелочисленный числовой тип, чтобы результат был более осмысленным. Вы можете использовать явное преобразование, как продемонстрировал @ hamlin11 , или вы можете преобразовать неявно, как это:
SELECT a.cnt * 1.0 / b.cnt AS ratio
FROM
(SELECT COUNT(*) FROM a) a (cnt),
(SELECT COUNT(*) FROM b) b (cnt)
Или, применяя непосредственно к вашему скрипту:
select (select count(*) from a) * 1.0 / (select count(*) from b) as ratio;