Могу ли я использовать псевдоним для нескольких столбцов? Как?

Я использую pyodbc и postgres.

Могу ли я использовать псевдоним для нескольких столбцов?

Вот описание моей проблемы:

Структура данных:

data
id | c1  | c2
-------------
1  | 11  | 12
2  | 21  | 22

Обозначение: c для столбца

dictionary
id | key | value
----------------
1  | k1  | v11
1  | k2  | v12
2  | k1  | v21
2  | k2  | v22

Обозначение: k для ключа, v для значения

Вы можете думать о k1 и k2 как о еще двух столбцах. Структура данных такая, потому что она постоянно меняется. Я не проектировал это, я просто должен идти с этим.

Я не могу понять SQL-запрос, чтобы дать мне что-то вроде следующего (самое главное, для некоторой строки я могу получить доступ к столбцам k1 и k2 по некоторому имени):

data
id | c1  | c2  | k1  | k2
-------------------------
1  | 11  | 12  | v11 | v12
2  | 21  | 22  | v21 | v22

Проблема, с которой я продолжаю сталкиваться, заключается в том, что если я создаю псевдоним для таблиц, то результат sql будет содержать два «ключевых» столбца из таблицы словаря, то есть я не могу контролировать, к какому столбцу я обращаюсь из двух, но если я создаю псевдоним для строк, тогда я не могу контролировать, на какие таблицы ссылаются в инструкции sql.

Я думаю, что исправление состоит в том, чтобы связать два столбца:

SELECT * FROM data
FULL JOIN dictionary AS a1,a2,a3
ON data.id = a1
FULL JOIN dictionary AS a4,a5,a6
ON data.id = a4
WHERE a2 = k1 and a5 = k2

Обозначение: a для псевдонима

Результат этого теоретически будет выглядеть так

data
id | c1  | c2  | a3  | a6 
------------------------- 
1  | 11  | 12  | v11 | v12
2  | 21  | 22  | v21 | v22

Обратите внимание, что технически все a должны быть здесь, но меня интересуют 3 и 6.


person Ricky Moreno    schedule 28.06.2012    source источник
comment
Вы только что придумали новый синтаксис, или это просто псевдоним, который я никогда не использовал?   -  person    schedule 29.06.2012
comment
Я думаю, что ключевое слово здесь — свертка; форма (то есть столбцы) результирующего набора меняется в сценарии, верно? Как правило, SQL плох в этом, и для получения k0...kN столбцов возникают динамические (или одноразовые) запросы...   -  person    schedule 29.06.2012
comment
да, я придумывал синтаксис для описания желаемого поведения (к каким столбцам мне нужно было получить доступ). Ответ Андомара показывает правильный синтаксис.   -  person Ricky Moreno    schedule 29.06.2012


Ответы (1)


Вы можете использовать псевдоним для всей таблицы, например dictionary as d1. Затем обратитесь к именам столбцов в этой таблице как d1.col1. Например:

SELECT  d.id
,       d.c1
,       d.c2
,       d1.value as a3
,       d2.value as a6
FROM    data as d
LEFT JOIN
        dictionary as d1
ON      data.id = d1.id
        and d1.key = 'k1'
LEFT JOIN
        dictionary as d2
ON      data.id = d2.id
        and d2.key = 'k2'
person Andomar    schedule 28.06.2012
comment
Это вызовет одну из двух упомянутых мною проблем, не так ли? (Результирующая таблица будет содержать повторяющиеся имена столбцов.) - person Ricky Moreno; 29.06.2012
comment
Вы можете использовать псевдонимы столбцов после того, как они выбраны, отредактированы в ответе. Немного удивлен, что вы можете написать full join, но не псевдонимы столбцов, хе-хе :) - person Andomar; 29.06.2012
comment
Ага, понятно. Спасибо! Я надеюсь, что это работает! Я просто не знал, как сделать множественное сглаживание. Можно ли сделать что-то вроде SELECT *, d1.value как a3, d2.value как a6...? Поскольку фактических данных много, много столбцов... Где документация по допустимому синтаксису sql? Похоже, это должно быть правильно, но я хочу сопоставить это с документацией для проверки. - person Ricky Moreno; 29.06.2012
comment
Вы можете использовать select d.* для выбора всех столбцов из таблицы с псевдонимом d. - person Andomar; 29.06.2012