在SQL查询中使用表值

时间:2015-07-29 07:31:21

标签: sql sql-server sql-server-2008 tsql

我有一张下表

+------------------------+
| Column1        Column2 |
+------------------------+
|   101          A_TABLE |
|                        |
|   103          B_TABLE |
+------------------------+

我想运行一个查询:

if my column1 row 1 has 101 then select * from A_TABLE
If my column1 row 2 has 103 then select * from B_TABLE
and so on

我非常感谢您的投入。

4 个答案:

答案 0 :(得分:1)

你需要做这样的事情:

declare @SQL varchar(max) = ''

select @SQL = @SQL + 'select * from ' + Column2 + ' union all '
from table1

set @SQL = left(@SQL, len(@SQL) - 10)

exec (@SQL)

这将从column2中获取所有表,并从中创建union all子句。

答案 1 :(得分:0)

您可以使用sql server cursor:

DECLARE @column1 VARCHAR(50) 
DECLARE @column2 VARCHAR(50)
DECLARE @sql VARCHAR(250)

DECLARE db_cursor CURSOR FOR  
SELECT Column1, Column2
FROM Your_table 

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @Column1, @Column2   

WHILE @@FETCH_STATUS = 0   
BEGIN  
      --dynamic match between columns 
      @sql = 'select * from ' + @Column2  
      EXEC(@sql)
      FETCH NEXT FROM db_cursor INTO @Column1, @Column2   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

答案 2 :(得分:0)

您可以使用while循环:

DECLARE     @Max_Value INT ,@Min_Value INT ,@SQL VARCHAR (1000) =''
SELECT @Max_Value = MAX(Column1) , @Min_Value = MIN(Column1) FROM [Your_Table]
WHILE (@Min_Value <= @Max_Value)
BEGIN
    SET @SQL= ( SELECT 'SELECT * FROM '+table_name FROM [Your_Table] WHERE Column1=@Min_Value)
    EXEC(@SQL)  
    SELECT  @Min_Value = MIN(Column1) FROM [Your_Table] WHERE Column1 > @Min_Value
END

答案 3 :(得分:-1)

SELECT CASE Column1 WHEN 101 THEN (SELECT * FROM A_Table)
                    WHEN 103 THEN (SELECT * FROM B_Table)
                    ELSE END
FROM table

A_Table和B_Table是否包含您可以加入的密钥,因为这会使这更容易?

如果是这样,你可以简单地做

SELECT * FROM table T
INNER JOIN A_Table A on T.Column1 = A.Column1
INNER JOIN B_Table B on T.Column1 = B.Column1
WHERE T.Column1 IN (101,103)

第二种选择最适合性能,但不确定这是否是您所追求的输出。请你能提供表A和B的结构,以及表A,B,...,Z如何链接到&#34;表&#34;通过任何钥匙?目标结果输出也很方便。谢谢!