Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择top N和所有相关表格_Sql_Foreign Keys_Relational Database - Fatal编程技术网

Sql 选择top N和所有相关表格

Sql 选择top N和所有相关表格,sql,foreign-keys,relational-database,Sql,Foreign Keys,Relational Database,我有一个表,它被称为用户 Users表将UserId作为主键,它是其他15个表的外键 是否有一个查询模板可以一次性从用户和所有相关表中选择前200行?因此,我不需要在查询中键入所有其他15个表 查询将动态查找并从相关表中获取列吗 它可以对表之间的所有关系使用内部联接。您可以这样做: select top 200 columns.... from tablename inner join table1 .... inner join table2 .... ... inner join table

我有一个表,它被称为用户

Users表将UserId作为主键,它是其他15个表的外键

是否有一个查询模板可以一次性从用户和所有相关表中选择前200行?因此,我不需要在查询中键入所有其他15个表

查询将动态查找并从相关表中获取列吗


它可以对表之间的所有关系使用内部联接。

您可以这样做:

select top 200 columns....
from tablename
inner join table1 ....
inner join table2 ....
...
inner join table15...

您需要与所有表进行内部联接,然后选择前200个结果。

就是您要查找的结果。动态Where语句。跳到Case语句,学习如何在查询中使用Case。

有一种方法,但有点复杂。 您可以从information_模式中选择所有表名和表列,并使用它们构建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 */
您可以从“+TableName+”中执行“选择”+Columns+”,其中…'
然后对每个表执行查询。

我承认这非常难看,可能需要更多的工作,但它会基于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

谢谢但正如我所说的,我希望查询能够动态地从相关表中查找并带来列。@Teomanshipahi shipahi这是什么意思?我在你的照片里看不到这一点question@Teomanshipahi你没有在任何地方说过,也许只是在你的脑海里:我们能举个例子吗?1个用户,它应该从相关表中获取哪些列我有一些表,如用户、用户图片、用户消息、用户地址等。。。我将有一个查询,如SELECTTOP200*from users内部联接相关表,其中userid=1,但在所有相关表中,节将动态出现。不手动键入。您使用的是什么数据库?这很可能需要不同数据库的系统表。