Я пытаюсь добиться чего-то похожего на этот пример PostgreSQL кода, но на SQLServer (T- SQL). Я прикреплю код PG SQL ниже.
Вывод, который я ожидаю, - это список имен таблиц в другой таблице. SELECT table_name FROM dbo.table_list
. Этот список также может быть получен из информационной схемы.
Затем я хотел бы count(*)
записей в этой таблице с тем же предложением where каждый раз, когда WHERE status = 'CURRENT'
это поле присутствует в каждой таблице в этом списке.
Вот пример кода PostgreSQL:
SELECT
table_schema,
table_name,
(xpath('/row/cnt/text()' , xml_count))[1]::TEXT::INT AS row_count
FROM (
SELECT
table_name,
table_schema,
query_to_xml(format('SELECT SUM(CASE WHEN status = ''CURRENT'' THEN 1 ELSE 0 END) AS cnt
FROM %I.%I', table_schema, table_name), false, true, '') AS xml_count
FROM information_schema.tables
WHERE table_schema = 'my_schema'
AND table_name LIKE 'new_%'
) my_fancy_table
Это вывод, который я получаю:
table_schema table_name row_count
------------------- --------------- ------------- -
my_schema new_tt1 1265
my_schema new_tt2 2111
my_schema new_tt3 564589
my_schema new_tt4 9999
my_schema new_tt5 1029 *
В идеале мне бы это понадобилось в такой функции:
CREATE OR REPLACE FUNCTION public.count_currs()
RETURNS TABLE(a character varying, b character varying, c integer) AS
$BODY$
BEGIN
RETURN QUERY (SELECT table_schema::VARCHAR, table_name::VARCHAR, (xpath('/row/cnt/text()', xml_count))[1]::text::int FROM ( SELECT table_name, table_schema, query_to_xml(format('select SUM(CASE WHEN status = ''CURRENT'' THEN 1 ELSE 0 END) as cnt from %I.%I', table_schema, table_name), false, true, '') as xml_count from information_schema.tables where table_schema = 'my_schema' and table_name LIKE 'new_') t) ;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION public.count_currs()
OWNER TO postgres;
Так что в моем коде я должен иметь:
SELECT * FROM public.count_currs();
Пожалуйста, извините за подробное объяснение. Я ценю всю помощь!
- РЕДАКТИРОВАТЬ
Как и было запрошено, вы можете использовать это, чтобы создать некоторые данные образца, и я приложу ожидаемый результат. Обратите внимание, что количество таблиц и имена таблиц не установлены и могут быть 1 таблица может быть 1000 таблиц, мне нужно, чтобы это было построено динамически на основе информационной схемы (см. Код выше) или из другой таблицы (см. Код выше). Идея состоит в том, что для каждой таблицы в этом списке возвращаемых таблиц мы выполняем запрос, который будет выполнять что-то вроде этого SELECT COUNT(*) FROM my_schema.table_name WHERE status = 'CURRENT'
, а затем группировать значения из числа х таблиц в один набор результатов:
Код для создать пример данных:
CREATE SCHEMA [my_schema];
CREATE TABLE [my_schema].[tt1](
[status] [varchar](100) NULL);
CREATE TABLE [my_schema].[tt2](
[status] [varchar](100) NULL);
CREATE TABLE [my_schema].[tt3](
[status] [varchar](100) NULL);
CREATE TABLE [my_schema].[tt4](
[status] [varchar](100) NULL);
CREATE TABLE [my_schema].[tt5](
[status] [varchar](100) NULL);
INSERT INTO [my_schema].[tt1] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt1] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt1] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt1] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt1] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt1] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt2] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt2] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt3] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt3] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt3] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt3] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt3] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt3] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt4] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt4] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt4] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt4] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt4] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt5] VALUES ('CURRENT');
INSERT INTO [my_schema].[tt5] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt5] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt5] VALUES ('NOT_CURRENT');
INSERT INTO [my_schema].[tt5] VALUES ('NOT_CURRENT');
Тогда я ожидал бы такой результат: Пример вывода