为另一个SELECT选择列名-可能



我有一个表t1与'foo'列,和记录包含'bar'和'baz'列'foo'。我也有一个表t2列'bar', 'baz'和'quux'。我想做如下的事情:

SELECT (SELECT foo from t1) FROM t2;

,即从t1中获取两个列名,并查询t2的这些列。如果我尝试这样做与MonetDB,我得到一个错误消息:

cardinality violation (2>1)

  • 是否有其他方法来做到这一点与MonetDB?
  • 在MySQL中是可能的吗?其他dbms吗?

示例查询(或非查询指令后面跟着查询)是受欢迎的。

首先你需要选择列到一个变量中,然后使用该变量来获取表

类似以下内容(这不是实际实现)

声明@colname varchar(250)

select @colname=foo from t1

select @colname from t2

这是在SQL Server中如何实现的

-- Create #T1 which contains names of columns and #T2 which contains the actual columns
CREATE TABLE #T1(colname nvarchar(max))
INSERT INTO #T1 (colname) VALUES ('b')
INSERT INTO #T1 (colname) VALUES ('c')
CREATE TABLE #T2(a int IDENTITY(1,1), b DATETIME DEFAULT GETDATE(), c NVARCHAR(max) DEFAULT 'blah')
INSERT INTO #T2 DEFAULT VALUES
INSERT INTO #T2 DEFAULT VALUES
INSERT INTO #T2 DEFAULT VALUES
--@dSQL will contain the actual SQL string to be executed
DECLARE @dSQL nvarchar(max) = ' '
SELECT @dsql = CONCAT(@dsql,'[',colname,'],') FROM #T1
SELECT @dsql = CONCAT('SELECT',LEFT(@dsql,LEN(@dsql)-1),' FROM #T2')
--You can see the SQL query being executed
PRINT @dsql
--Actually execute it
exec sp_executesql @dsql

MS Sql动态Sql示例。

create table t1(foo varchar(100))
insert t1(foo)
values('bar,baz');
create table t2(bar int, baz int)
insert t2 (bar, baz)
values
  (1,100),
  (3,300);
declare @cmd varchar(max);
select @cmd= 'select '+ (select top(1) foo from t1) + ' from t2';
EXEC (@cmd);
结果

    bar baz
1   1   100
2   3   300

或者foo在不同的行中包含列名,不完全清楚您的问题。

create table t1(foo varchar(100))
insert t1(foo)
values('bar'),('baz');
create table t2(bar int, baz int)
insert t2 (bar, baz)
values
  (1,100),
  (3,300);
declare @cmd varchar(max);
select @cmd= 'select '+ stuff((select ','+  foo from t1 for xml path('')),1,1,'') + ' from t2';

EXEC (@cmd);

相关内容

  • 没有找到相关文章

最新更新