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

时间:2016-10-05 12:19:44

标签: mysql sql reflection monetdb

我有一张桌子t1,上面有一个' foo'列和包含' bar'的记录和'巴兹'在列#foo'。我还有一个表格t2,其中包含栏目' bar'' baz'和' quux'。我想做类似以下的事情:

SELECT (SELECT foo from t1) FROM t2;

即,从t1获取两个列名并查询t2的那些列。如果我尝试使用MonetDB执行此操作,则会收到错误消息:

cardinality violation (2>1)

所以,

  • 还有其他方法可以使用MonetDB吗?
  • 这在MySQL可能吗?其他DBMS?

欢迎使用示例查询(或查询后面的非查询指令)。

3 个答案:

答案 0 :(得分:0)

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

类似于以下内容(它不是实际的实现)

声明@colname varchar(250)

从t1

中选择@ colname = foo

从t2

中选择@colname

这可能会有所帮助。

答案 1 :(得分:0)

这是您在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

答案 2 :(得分:0)

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);