1

「ユーザー」というテーブルがあります

Usersテーブルには主キーとしてUserIdがあり、他の15個のテーブルの外部キーです。

ユーザーと関連するすべてのテーブルから上位200行を一度に選択するクエリテンプレートはありますか?したがって、クエリに他の15個のテーブルをすべて入力する必要はありません。

Queryは、関連するテーブルから列を動的に検索して取得しますか?

テーブル間のすべての関係に内部結合を使用できます。

4

4 に答える 4

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
于 2012-07-03T15:52:38.790 に答える
0

あなたはこのようにそれを行うことができます:

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

inner joinすべてのテーブルでを作成してから、結果を選択する必要がありtop 200ます。

于 2012-07-03T15:18:41.553 に答える
0

これはあなたが探しているものです。動的Whereステートメント。にスキップして、Case statementsクエリでケースを使用する方法を学びます。

于 2012-07-03T15:27:24.773 に答える
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 ...'"を実行してから、すべてのテーブルに対してクエリを実行できます。

于 2012-07-03T15:31:18.410 に答える