在另一个sql查询中使用一个查询的结果
我有以下表格结构: 表1在另一个sql查询中使用一个查询的结果,sql,sql-server,stored-procedures,dynamic-sql,Sql,Sql Server,Stored Procedures,Dynamic Sql,我有以下表格结构: 表1 ╔═════╦══════╦═════════════╦═════════════╗ ║Col1 ║ Col2 ║ TableName ║ ColumnName ║ ╠═════╬══════╬═════════════╬═════════════╣ ║ 1 ║ abc ║ Table2 ║ column2 ║ ║ 2 ║ xyz ║ ║ ║ ║ 3 ║ pqr ║ Table1
╔═════╦══════╦═════════════╦═════════════╗
║Col1 ║ Col2 ║ TableName ║ ColumnName ║
╠═════╬══════╬═════════════╬═════════════╣
║ 1 ║ abc ║ Table2 ║ column2 ║
║ 2 ║ xyz ║ ║ ║
║ 3 ║ pqr ║ Table1 ║ column1 ║
║ 4 ║ jbn ║ ║ ║
╚═════╩════════════════════╩═════════════╝
Table2 :
╔════════╦═════════╗
║Column1 ║ Column2 ║
╠════════╬═════════╣
║ 1 ║ A ║
║ 2 ║ B ║
║ 3 ║ C ║
║ 4 ║ D ║
╚════════╩═════════╝
Table3
╔════════╦═════════╗
║Column1 ║ Column2 ║
╠════════╬═════════╣
║ 1 ║ X ║
║ 2 ║ Y ║
║ 3 ║ Z ║
║ 4 ║ A ║
╚════════╩═════════╝
我想编写一个存储过程,它将根据Table1中列tableName和columnName的值选择Table1中的数据和另一个表中的数据
我需要以下格式的数据:
╔═════╦═════╦════════╗
║Col1 ║ Col2║ List ║
╠═════╬═════╬════════╣
║ 1 ║ abc ║A,B,C,D ║
║ 2 ║ xyz ║ ║
║ 3 ║ pqr ║1,2,3,4 ║
║ 4 ║ jbn ║ ║
╚═════╩═════╩════════╝
试试临时桌子。
请看这里:您需要一个动态sql来获得这样的选择。查看链接 编辑: 下面的代码应该可以做到这一点 我假设表1中的Col1列是int类型 我已使用临时表生成所需的表。您可以根据您的方便将其更换到您的桌子上。我还使用了表1,您可以将其替换为表1 此外,这可能不是很好的性能方面,但这是最好的,我可以想出现在
declare @count int, @Query VARCHAR(5000), @counter int, @tableName VARCHAR(50), @ColumnName VARCHAR(50), @Col1 INT, @Col2 VARCHAR(50)
select @count = count(0) from #table1
SET @counter = 1
CREATE TABLE #table4
(
Col1 INT,
Col2 VARCHAR(50),
List VARCHAR(50)
)
WHILE @counter <= @count
BEGIN
SELECT @tableName = TableName, @ColumnName = columnName, @Col1 = Col1, @Col2 = Col2 FROM #Table1 WHERE Col1 = @counter
SELECT @Query = 'INSERT INTO #table4 (Col1 , Col2) VALUES (' + CONVERT(varchar(50),@Col1) + ', ''' + @Col2 + ''')'
EXEC (@Query)
SELECT @Query = ''
IF ISNULL(@tableName, '') != '' AND ISNULL(@ColumnName, '') != ''
BEGIN
SELECT @Query = 'UPDATE #table4 SET LIST = STUFF((SELECT '','' + CONVERT(VARCHAR(50), ' + @ColumnName + ') FROM ' + @tableName + ' FOR XML PATH('''')),1,1,'''') WHERE Col1 = ' + CONVERT(varchar(50),@Col1)
EXEC (@Query)
END
SET @counter = @counter + 1
END
SELECT * FROM #table4
希望这有助于为合并n行而编辑的答案 代码
你能根据我的表格结构举个例子吗?谢谢@samar。我知道我需要动态sql,但我无法创建这样的查询来返回我想要的数据。所以,你能给出一个基于我的表结构的动态查询的例子吗?这是我的荣幸@丽图:我试过了,但没用。它用逗号分隔表名和列名。但我希望列逗号的值被分隔。@Chandnisha:我得到的输出是列1 qwer asdff zxcvb。这是表1第1列的值。您正在使用哪个数据库?在您的表中,只有一行,这就是您获得输出的原因。添加更多行并尝试此解决方案。这是行不通的。
drop table #temp1
declare @tabletemp as varchar (10)
declare @columntemp as varchar (10)
Declare @sqlTemp NVARCHAR(400)
declare @counter1 as int
declare @counter2 as int
select @counter2 = 1
select name,cname into #temp1 from test1
select @counter1 = COUNT(*) from #temp1
while (@counter2<= @counter1)
begin
SET @tabletemp = (SELECT MIN(name) FROM #temp1)
select @columntemp = (select min(cname) from #temp1 where #temp1.name = @tabletemp)
set @sqlTemp='select '+@columntemp +' from '+@tabletemp
exec(@sqlTemp)
delete from #temp1 where name = @tabletemp and cname = @columntemp
select @counter1 = COUNT(*) from #temp1
end
select * from test1
name cname
table1 column1
test2 colname
table1 test
test2 name
select column1 from table1
column1
qwer
asdff
zxcvb
qwer
asdff
zxcvb
select colname from test2
colname
testing
wer
ewrth
sfsf
testing
wer
ewrth
sfsf
select test from table1
--got error message inavlid column nae 'test' as this column does not exist
select name from test2
name
table1
table1
table3
table2
table1
table1
table3
table2