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

4nkexdtk  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(351)

我有一个t1表,表中有一个'foo'列,记录中有'bar'和'baz'列'foo'。我还有一个t2表,表中有“bar”、“baz”和“qux”列。我想做如下事情:

SELECT (SELECT foo from t1) FROM t2;

也就是说,从t1获取两个列名并查询t2的那些列。如果我尝试使用monetdb执行此操作,会收到一条错误消息:

cardinality violation (2>1)

所以,
有没有其他的方法来处理monetdb?
这在mysql中是可能的吗?其他数据库?
欢迎使用示例查询(或后跟查询的非查询指令)。

rvpgvaaj

rvpgvaaj1#

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

flvlnr442#

这就是如何在SQLServer中完成的

-- 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
ao218c7q

ao218c7q3#

首先需要将列选择到变量中,然后使用该变量获取表
类似于以下内容(不是实际实现)
声明@colname varchar(250)
从t1中选择@colname=foo
从t2中选择@colname
这也许会有帮助。

相关问题