2016-10-05 9 views
0

私は 'foo'列を持つ表t1を持ち、 'foo'列に 'bar'と 'baz'を含むレコードを持っています。私はまた、列 '棒'、 'baz'と 'quux'のテーブルt2を持っています。 T1から2列名を取得し、T2のこれらの列を照会し、ある別のSELECTの列名を選択することは可能ですか?

SELECT (SELECT foo from t1) FROM t2; 

:私は次のような何かをしたいです。私はMonetDBでこれを行うにしようとすると、私はエラーメッセージが表示されます:

cardinality violation (2>1) 

ので、

  • はMonetDBでこれを行うには他のいくつかの方法がありますか?
  • これはMySQLで可能ですか?他のDBMS?

例クエリ(またはクエリに続くクエリ以外のディレクティブ)は歓迎されます。

+2

これを実行するには、動的SQLを使用する必要があります(MySQLでは 'prepare'と' execute')。 –

+0

いいえ、これはRDBMSでは一般的に不可能です.SQL仕様には、選択リストで使用されるサブクエリと、外部SQL問合せの一部であるsgではない戻りデータが含まれます。ほとんどのRDBMSは、sqlコマンドを動的に作成できるようにするが、sqlコマンドとして任意の文字列を実行できるようにする機能を提供しています。 – Shadow

+0

@ Shadow:そうです、MonetDB _does_は内部クエリを実行します。私は何とかベクトルを一連の文字列に変換する必要があります。私はそれが不可能かもしれないことを理解していますが、それは "一般的に"不可能ではないからではありません。 – einpoklum

答えて

0

は、最初は、変数に列を選択して、(それが実際の実装ではありません)以下の

宣言@colnameのVARCHAR(250)

よう

何かのテーブルを取得するには、その変数を使用する必要があります

これは助けかもしれT2

からT1

選択@colnameからCOLNAME = fooの@を選択します。

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 
[email protected] 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 
+0

動的SqlにはパラメータがありませんEXEC(@dsql)で十分です。ケースに 'sp_executesql'の利点を示すために、あなたの例にパラメータを追加したいかもしれません。 – Serg

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); 
関連する問題