Использование нового запроса в качестве псевдонима - PullRequest
1 голос
/ 21 марта 2012

У меня есть 2 таблицы:

Таблица с именами счетчиков (t1):

Counter_ID    Counter_Name 
         1          Apples
         2            Nuts
        ...

И таблица со значениями счетчиков (t2):

Time   Counter_ID_1  Counter_ID_2
12:00            24            43
13:00            64            73  
     ...

Используя SQL, я пытаюсь назвать полученные столбцы из t2, как они названы в t1, чтобы они выглядели так:

Time         Apples          Nuts
12:00            24            43
13:00            64            73  
     ...

Вот мой запрос (не работает):

select
 t2.Time as 'Time',
 t2.Counter_ID_1 as (select Counter_Name from t1 where Counter_ID=1),
 t2.Counter_ID_2 as (select Counter_Name from t1 where Counter_ID=2)
from t2

Есть идеи?

UPD: Я знаю, дизайн БД не очень хорош, но это не моя БД, я просто пользователь RO:)

UPD2: Спасибо вам всем! Я понял, что в моем случае проще не автоматизировать его, а выполнить запрос один раз, как мне нужно, и вручную изменить псевдонимы, если таблица с именами (t1) будет изменена.

Ответы [ 4 ]

1 голос
/ 21 марта 2012

Возвращает имена и идентификаторы в наборе результатов и передает их вызывающему приложению, например,

SELECT
 t2.Time AS 'Time',
 t2.Counter_ID_1, s1.Counter_Name AS Counter_Name_1,
 t2.Counter_ID_2, s2.Counter_Name AS Counter_Name_2
FROM t2
     JOIN t1 AS s1 ON s1.Counter_ID = t2.Counter_ID_1
     JOIN t1 AS s2 ON s2.Counter_ID = t2.Counter_ID_2;
0 голосов
/ 21 марта 2012

вы хотите динамические псевдонимы.SQL Server этого не делает.Что вы можете сделать, за исключением того, что перепроектирование ваших таблиц - это

select
 Time as 'Time',
 Counter_Name as 'Apples'
 Counter_ID_2 'Nuts'
from t2

, но, конечно, это будет работать, только если вы заранее определили, какие столбцы вы будете выбирать.

0 голосов
/ 21 марта 2012

Предполагая, что вы используете SQL Server, следующее создаст исполняемый динамический оператор, который использует t1 в качестве входных данных для имен столбцов для t2

DECLARE @SQLStatement NVARCHAR(MAX)

SELECT  @SQLStatement = 
          ISNULL(@SQLStatement, '') 
          + ', Counter_ID_' 
          + CAST(Counter_ID AS VARCHAR(32)) 
          + ' AS ' + Counter_Name                               
FROM    t1

SELECT  @SQLStatement = 'SELECT TIME ' + @SQLStatement + ' FROM t2'
EXEC sp_ExecuteSQL @SQLStatement

Разбитое

Объявите переменную для хранения исполняемого оператора

DECLARE @SQLStatement NVARCHAR(MAX)

Объедините все возможные псевдонимы в исполняемый оператор, используя t1 в качестве входных данных.Результат этого шага будет иметь вид , Counter_ID_1 AS Apples, Counter_ID_2 AS Nuts

SELECT  @SQLStatement = 
          ISNULL(@SQLStatement, '') 
          + ', Counter_ID_' 
          + CAST(Counter_ID AS VARCHAR(32)) 
          + ' AS ' + Counter_Name                               
FROM    t1

Добавить SELECT и FROM предложение

SELECT  @SQLStatement = 'SELECT TIME ' + @SQLStatement + ' FROM t2'

Выполнить оператор

EXEC sp_ExecuteSQL @SQLStatement
0 голосов
/ 21 марта 2012

Похоже, ваш дизайн может быть ошибочным.Вы не можете смешивать статические данные, такие как имена столбцов / столбцов, с динамическими данными.

Но если вы действительно хотите пойти по этому пути, я думаю, вам, возможно, придется сделать 2 запроса из приложения.Один, чтобы получить имена столбцов, а затем использовать его для динамического построения фактического запроса ..

...