2016-10-05 3 views
0

У меня есть таблица t1 с столбцом «foo» и записи, содержащие «bar» и «baz» в столбце «foo». У меня также есть таблица t2 со столбцами 'bar', 'baz' и 'quux'. Я хочу сделать что-то вроде следующего:Выбор имен столбцов для другого SELECT - возможно?

SELECT (SELECT foo from t1) FROM t2; 

, то есть получить два названия столбцов из t1 и запроса этих столбцов t2. Если я пытаюсь сделать это с MonetDB, я получаю сообщение об ошибке:

cardinality violation (2>1) 

так,

  • есть другой способ сделать это с MonetDB?
  • это возможно в MySQL? другие СУБД?

Примеры запросов (или директив без запроса, за которыми следует запрос) приветствуются.

+2

Для этого вы должны использовать динамический SQL ('prepare' и' execute' в MySQL). –

+0

Нет, это вообще невозможно в СУБД, спецификация SQL включает в себя подзапросы, используемые в списке выбора, и те, которые возвращают данные, а не sg, которые были бы частью внешнего sql-запроса. Большинство RDBMS предлагают некоторую функцию, позволяющую динамически создавать SQL-команды, но разрешая выполнение произвольной строки в виде команды sql. – Shadow

+0

@ Shadow: Ну, дело в том, MonetDB _does_ выполняет внутренний запрос. Мне просто нужно каким-то образом преобразовать вектор в последовательность строк. Я понимаю, что это возможно, но это не потому, что это «вообще» невозможно. – einpoklum

ответ

0

сначала нужно выбрать столбцы в переменную и затем использовать эту переменную, чтобы получить таблицы

что-то вроде следующего (это не фактическая реализация)

объявляют @colname VARCHAR (250)

выберите @ ColName = Foo от t1

выберите @colname от t2

это может быть помощь.

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