我有一张名为“用户”的表
Users表将UserId作为主键,它是其他15个表的外键。
是否有一个查询模板可以从一个镜头中选择用户和所有相关表格的前200行?所以我不需要在查询中键入所有其他15个表。
Query会动态查找并从相关表中提取列吗?
它可以对表之间的所有关系使用内连接。
答案 0 :(得分:2)
我承认这非常难看,可能需要更多的工作,但它会根据PK / FK关系进行基本的查询生成。如果任何FK表可能缺少相应的PK记录,您应该将内连接更改为左连接。
declare @table varchar(50);
set @table = 'Users';
declare @pk_table varchar(50);
declare @fk_table varchar(50);
declare @pk_column varchar(50);
declare @fk_column varchar(50);
declare @curr_table varchar(50);
set @curr_table = '';
declare @sql varchar(8000);
set @sql = 'select top 200 * from ' + @table + char(10)
DECLARE table_cursor CURSOR FOR
SELECT
K_Table = FK.TABLE_NAME,
FK_Column = CU.COLUMN_NAME,
PK_Table = PK.TABLE_NAME,
PK_Column = PT.COLUMN_NAME--,
--Constraint_Name = C.CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT
i1.TABLE_NAME,
i2.COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE
i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT
ON PT.TABLE_NAME = PK.TABLE_NAME
where PK.TABLE_NAME = @table
OPEN table_cursor
FETCH NEXT FROM table_cursor INTO @fk_table, @fk_column, @pk_table, @pk_column
WHILE @@FETCH_STATUS = 0
BEGIN
if @curr_table <> @fk_table
begin
-- create join
set @sql = @sql + ' inner join ' + @fk_table + char(10)
set @sql = @sql + ' on ' + @pk_table + '.' + @pk_column + ' = ' + @fk_table + '.' + @fk_column + char(10)
end
else
begin
-- create join on fields
set @sql = @sql + ' and ' + @pk_table + '.' + @pk_column + ' = ' + @fk_table + '.' + @fk_column + char(10)
end
FETCH NEXT FROM table_cursor INTO @fk_table, @fk_column, @pk_table, @pk_column
END
CLOSE table_cursor
DEALLOCATE table_cursor
print @sql
答案 1 :(得分:0)
你可以这样做:
select top 200 columns....
from tablename
inner join table1 ....
inner join table2 ....
...
inner join table15...
您需要为所有表格制作inner join
,然后选择top 200
结果。
答案 2 :(得分:0)
This正是您要找的。动态Where
语句。跳至Case statements
以了解如何在查询中使用案例。
答案 3 :(得分:0)
有一种方法,但它有点复杂。 您可以从information_schema中选择所有表名和表列,并使用这些列构建SQL查询。
这样的事情应该让你开始:
With TableNames
AS
(
select * from INFORMATION_SCHEMA.TABLES where table_name like 'User%'
),
ColumnNames
AS
(
select *
from INFORMATION_SCHEMA.COLUMNS c
join TableNames n
on n.TABLE_NAME=c.TABLE_NAME
)
/* Construct SQL query */
你可以做一个“exec'SELECT'+ Columns +'FROM'+ TableName +'WHERE ...'” 然后对每个表执行查询。