我有一個它被稱爲「用戶」選擇與所有相關表
用戶表中有用戶ID作爲主鍵,這是其他15個表的外鍵的表前N個。
有沒有一個查詢模板,它將在一次性選擇用戶和所有相關表的前200行?所以我不需要在查詢中鍵入所有其他15個表。
查詢是否會動態查找並從相關表中提取列?
它可以使用內部聯接表之間的所有關係。
我有一個它被稱爲「用戶」選擇與所有相關表
用戶表中有用戶ID作爲主鍵,這是其他15個表的外鍵的表前N個。
有沒有一個查詢模板,它將在一次性選擇用戶和所有相關表的前200行?所以我不需要在查詢中鍵入所有其他15個表。
查詢是否會動態查找並從相關表中提取列?
它可以使用內部聯接表之間的所有關係。
我承認這是超級醜陋的,可能需要更多的工作,但是它基於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
這很酷,工作!非常感謝。 –
你可以這樣說:
select top 200 columns....
from tablename
inner join table1 ....
inner join table2 ....
...
inner join table15...
你需要讓inner join
所有的表,然後選擇top 200
結果。
謝謝。但正如我所說,我期待查詢將動態地查找並帶來相關表格的列。 –
@Teomanshipahi shipahi你是什麼意思?我不能在你的問題中看到 – phadaphunk
@Teomanshipahi你不會說任何地方,也許只是在你的腦海中:P –
This是你在找什麼。動態Where
聲明。跳至Case statements
以瞭解如何在您的查詢中使用個案。
有一種方法,但它有點複雜。 您可以從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 ...'」 ,然後執行查詢爲每個桌子。
我們可以舉個例子嗎? 1用戶與它應該從相關表中得到什麼列 – phadaphunk
我有像用戶,UserPictures,UserMessages,UserAddresses等表......我會有一個像「從用戶內部連接**相關表**選擇頂部200 * = 1「,但在」所有相關的表「部分將動態地出現。不要手動輸入。 –
你在使用什麼數據庫?這很可能需要不同數據庫之間不同的系統表。 –