2012-05-23 1 views
3

Это, в основном, вопрос о соединении с базой данных, но для этого требуется использовать компонент сопоставления столбцов-столбцов и столбцов.sql join function

У меня есть несколько обзорных столов; для простоты, допустим, у меня есть два, один с 2010 года (называемый «d2010»), а другой - с 2011 года (называемый «d2011»). Строки соответствуют опросам, а столбцы (которые мы можем считать названными «c1», «c2», «c3», ... «cN») соответствуют ответам на вопросы. Так, «D2010» выглядит как

  id c1 c2 c3 .. cX 
survey 1 
survey 2 
survey 3 
... 
survey N 

в то время как «D2011» выглядит как

  id c1 c2 c3 .. cY 
survey 1 
survey 2 
survey 3 
... 
survey N 

Основная цель состоит в том, чтобы показать, как ответы изменились с 2010 по 2011 год, для конкретного вопроса. В частности, моя цель состоит в том, чтобы создавать команды SQL, которые создают новые таблицы (с тремя столбцами), которая показывает, для конкретного ответа, как опросы отличаются между двумя годами:

  id 2010-response 2011-response 
survey 1 
survey 2 
survey 3 
... 
survey N 

Если имена столбцов были храниться в соответствии , то, что я должен был бы быть что-то же просто, как

select d2011.id, d2010.c1 as 'last year', d2011.c1 'this year' from d2010 join d2011 on d2010.id=d2011.id; 

к сожалению, люди, которые создавали таблицы не держат имена столбцов в соответствии; например,

c1 of 2010 corresponds to c2 of 2011 
c2 of 2010 corresponds to c1 of 2011 
c3 of 2010 corresponds to c3 of 2011 
c4 of 2010 corresponds to c7 of 2011 
... 

Так что я пытался сделать, это ввести что-то вроде

select d2010.id, d2010.c1 as 'last year', d2011.f(c1) 'this year' from d2010 join d2011 on d2010.id=d2011.id; 

где «d2011.f (c1)» указывает на использование функции, которая отображает столбец имена 2010 до тех 2011. отображение не достаточно просто быть выражен с помощью математической формулы, так что я полагаю, мне нужна таблица, которая идет что-то вроде

2010 2011 
    c1 c2 
    c2 c1 
    c3 c3 
    c4 c7 

есть ли способ, чтобы выразить в SQL Соединить РАБОТУ Мне нужно? То есть, с таблицей карт, есть ли способ преобразовать следующее в стандартный SQL (в общем) и SQLite (в частности)?

select d2011.id, f(d2010.c1) as 'last year', d2011.c1 'this year' from d2010 join d2011 on d2010.id=d2011.id;.id; 

Большое спасибо!

ответ

0

Что вы в основном ищете, это способ хранения имен столбцов в таблице и использования этих имен столбцов в будущем запросе. К сожалению, я считаю, что вам нужно будет использовать Dynamic SQL. Пример:

declare @SQL nvarchar(1024) 
set @SQL = 'select * from Table' 
exec sp_executeSQL @SQL 

Таким образом, используя таблицу сопоставления, можно было бы вернуть «отображенный» имя столбца и объявить присоединиться:

declare @SQL nvarchar(1024) 
    declare @mappedColumnName nvarchar(1024) 

    select @mappedColumnName = 2011 from mappedTable where 2010 = 'c1' 

    set @SQL = 'select * 
    from d2010 join d2011 on d2010.id=' + @SQL + ';.id'; 

    exec sp_executeSQL @SQL 

Другой метод я в последнее время используется, если доступны вы являетесь платформой Entity Framework в .NET. Это позволяет использовать отражение для динамического выбора имен столбцов в запросах LINQ.

Оба эти метода чувствуют себя «грязными» для меня, но это отражается на тех, кто проектировал эти эти таблицы. Возможно, лучше всего экспортировать их в Excel для сравнения.

0

Ваш вопрос не совсем ясен. , ,вы можете просто сделать соединение следующим образом:

select d2011.id, d2010.c2 as 'last year', d2011.c1 'this year' 
from d2010 join d2011 on d2010.id = d2011.id 

Невозможно динамически указывать столбец в стандартном sql. Динамический SQL дает вам эту возможность.

Я подозреваю, что то, что вы хотите сделать, проще всего сделать, приведя два списка столбцов таблицы в Excel, поместив их в два столбца бок о бок и построив инструкцию SQL с помощью функций Excel.