【问题标题】:Use result of one query in another sql query在另一个 sql 查询中使用一个查询的结果
【发布时间】:2014-03-12 06:07:52
【问题描述】:

我有以下表格结构:

表1

╔═════╦══════╦═════════════╦═════════════╗
║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 sql-server stored-procedures dynamic-sql


    【解决方案1】:

    试试临时表。 看这里:http://www.sqlteam.com/article/temporary-tables

    【讨论】:

    • 你能根据我的表结构举个例子吗?
    【解决方案2】:

    您将需要一个动态 sql 来获得这样的选择。查看链接http://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/

    编辑:

    下面的代码应该可以解决问题。

    我假设 Table1 中的列 Col1 是 int 类型。

    我已经使用 Temp 表来生成所需的表。您可以根据自己的方便将其替换为您的桌子。我还使用了#table1,您可以将其替换为您的Table1

    另外,这在性能方面可能不是很好,但这是我现在能想到的最好的。

    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
    

    希望对你有帮助

    【讨论】:

    • 谢谢@samar。我知道我需要动态 sql,但我无法创建这样的查询来返回我想要的数据。那么你能举一个基于我的表结构的动态查询的例子吗?
    • 快乐是我的。 :)
    【解决方案3】:

    为合并 n 行而编辑的答案

    代码

     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
    

    【讨论】:

    • @ritu:我试过了,但它不起作用。它以逗号分隔给出表名和列名。但我想要以逗号分隔的值。
    • @ChandniShah:我得到的输出是 column1 qwer asdff zxcvb。那是table1的column1的值。您使用的是哪个数据库?
    • 在您的表格中,只有一行这就是您获得输出的原因。添加更多行并尝试此解决方案。它不会起作用。
    猜你喜欢
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多