Код: Выделить всё
SELECT "idt", "table_name", (SELECT COUNT(*) FROM "table_name") FROM master
Код: Выделить всё
SELECT "idt", "table_name", (SELECT COUNT(*) FROM "table_name") FROM master
То же самоеAleksandr. писал(а): В MS SQL такая задача решалась созданием функции, внутри которой формировалась строка запроса и выполнялся EXEC этой строки. А как это можно сделать в FireBird?
Код: Выделить всё
CREATE PROCEDURE GET_RECCOUNT (
TBLNAME VARCHAR(10)) RETURNS (RС INT)
AS
DECLARE VARIABLE S VARCHAR(40);
begin
S='SELECT COUNT(*) FROM '||TBLNAME;
EXECUTE S INTO RС;
suspend;
end
Не получается что-то.делай запросы динамически на сервер и отправляй их с клиента, готовыми
Код: Выделить всё
select A.Id, (select count(*) from Received where TopId=A.Id
and Id not in (select ReadedId from Readed))
from Received A
where TopId is null
Код: Выделить всё
select A.ID, COUNT(B.ID) FROM Received A
LEFT JOIN Received B ON B.TopID=A.ID
WHERE A.TopID IS NULL AND B.ID NOT IN (SELECT ReadedID FROM Readed)
GROUP BY A.ID
нет идеальных оптимизаторов, и потом, лучше писать sql более понятно для сервера, чем "в лоб"....И вообще, если честно, я просто не понимаю, почему такие запросы, проскакивающие на MS SQL за доли секунды, в FB выполняются по 3-4 минуты
Код: Выделить всё
CREATE PROCEDURE F_TABLE
RETURNS (
ID_T INTEGER,
NAME_T VARCHAR(10),
COUNT_T INTEGER)
AS
DECLARE VARIABLE S VARCHAR(10);
begin
for SELECT
idt,
table_name
FROM master
into
:ID_T,
:NAME_T
do
begin
execute statement 'select count(*) from '||NAME_T
into :COUNT_T;
suspend;
end
end
Код: Выделить всё
select ID_T, NAME_T, COUNT_T from F_TABLE
здесь просто маленькая ошибкаAleksandr. писал(а):Пытаюсь выполнить, но непонятно ему EXECUTE S. Из Langref ничего вытянуть не смог по этому поводу, "Мир Interbase" ни в магазинах ни на каких books.ru не найдешь в наличии, слепым котенком себя чувствую...Код: Выделить всё
CREATE PROCEDURE GET_RECCOUNT ( TBLNAME VARCHAR(10)) RETURNS (RС INT) AS DECLARE VARIABLE S VARCHAR(40); begin S='SELECT COUNT(*) FROM '||TBLNAME; EXECUTE S INTO RС; suspend; end
Код: Выделить всё
execute statement S into :RC;
или
execute statement 'SELECT COUNT(*) FROM '||TBLNAME into :RC;
Пробовал, абсолютно без разницы. Вообще, самым печальным в этом является то, что изначально таблица readed пустая, и ускорение выполнения запроса дает только ее наполнение - по крайней мере, у меня появление в ней нескольких readedid сразу дает ускорение на несколько секунд .тебе надо объединить ее как
received left join readed
и вывести только те (where), где received.id is null
Пробовал, абсолютно без разницы. Вообще, самым печальным в этом является то, что изначально таблица readed пустая, и ускорение выполнения запроса дает только ее наполнение - по крайней мере, у меня появление в ней нескольких readedid сразу дает ускорение на несколько секунд .тебе надо объединить ее как
received left join readed
и вывести только те (where), где received.id is null
Вот поэтому я бы предложил вывернуть схему наизнанку - хранить идентификаторы непрочитанных сообщений. Но по-всякому достаточно двух таблиц так что "подстановка имени таблицы в запрос" напрочь не нужна.kdv писал(а):проблема в том, что "найти те, для которых нет соответствия", может выполниться только полной проверкой источника, то есть Received.