2012-07-03 51 views
1

我有一個它被稱爲「用戶」選擇與所有相關表

用戶表中有用戶ID作爲主鍵,這是其他15個表的外鍵的表前N個。

有沒有一個查詢模板,它將在一次性選擇用戶和所有相關表的前200行?所以我不需要在查詢中鍵入所有其他15個表。

查詢是否會動態查找並從相關表中提取列?

它可以使用內部聯接表之間的所有關係。

+0

我們可以舉個例子嗎? 1用戶與它應該從相關表中得到什麼列 – phadaphunk

+0

我有像用戶,UserPictures,UserMessages,UserAddresses等表......我會有一個像「從用戶內部連接**相關表**選擇頂部200 * = 1「,但在」所有相關的表「部分將動態地出現。不要手動輸入。 –

+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 
+0

這很酷,工作!非常感謝。 –

0

你可以這樣說:

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

你需要讓inner join所有的表,然後選擇top 200結果。

+0

謝謝。但正如我所說,我期待查詢將動態地查找並帶來相關表格的列。 –

+0

@Teomanshipahi shipahi你是什麼意思?我不能在你的問題中看到 – phadaphunk

+0

@Teomanshipahi你不會說任何地方,也許只是在你的腦海中:P –

0

This是你在找什麼。動態Where聲明。跳至Case statements以瞭解如何在您的查詢中使用個案。

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' +列+ 'FROM' +表名+ 'WHERE ...'」 ,然後執行查詢爲每個桌子。