2013-06-14 6 views
1

Как создать оператор выбора sql, где имена столбцов выбора являются значениями в строках другой таблицы (я использую postgresql)? У меня есть таблица языка с кодами языков:SQL: выбор столбцов на основе строк другой таблицы

language 
======== 
id code name 
------------------- 
1  en English 
2  fr French 
3  it Italian 

country 
======= 
id en fr it other_columns 
------------------------------------ 
1  ... 
2  ... 

Я хочу, чтобы выбрать идентификатор и все языковые столбцы из таблицы страны, и они перечислены в таблице языка. Что-то вроде:

SELECT id, (SELECT code FROM language) FROM country 

так что я фактически в конечном итоге с:

SELECT id, en, fr, it from country 

Спасибо!

ответ

3

Это известно как «опорная точка» или «кросс-таблица», и для SQL это, как известно, плохо. PostgreSQL предлагает расширение, которое помогает немного, хотя использовать его не красиво - посмотрите на crosstab function in the tablefunc extension.

Поиск тегов или вместе с тегом найдет вас больше. Например:

0

Это частичный ответ. Следующая строка дает вам SQL, который вы ищете. Возможно, EXECUTE PL/pgSQL может запустить его для вас.

SELECT 'SELECT id, ' 
    || (SELECT array_to_string(array_agg(code),', ') FROM LANGUAGE) 
    || 'FROM country'; 

Некоторые тестовые данные:

CREATE TABLE country (id integer, en text, fr text, it text, es text, de text); 
INSERT INTO country (id, en, fr, it, es, de) 
VALUES (1, 'Hello', 'Bonjour', 'Buon giorno', 'Buenas dias', 'Guten Tag'); 

CREATE TABLE language (id integer, code text, name text); 
INSERT INTO language (id, code, name) 
VALUES (1, 'en', 'English'), (2, 'fr', 'French'), (3, 'it', 'Italian'); 
Смежные вопросы