2014-02-03 6 views
1

Таблица 1:Выбор значений из другой таблицы на основе столбцов хранится в виде значения на столе

--------------------------------------- 
    Column_A    Column_B 
--------------------------------------- 
    Test A     name 
    Test B     address 
    Test C     phone 

Таблица 2:

------------------------------------------------------------------- 
    name  address   email  country   phone   
------------------------------------------------------------------- 
    Kush  KTM    [email protected]   NP   98545 

второй таблицы временной таблицы и будет содержать только одну строку , требуется

Выход:

--------------------------------------- 
    Column_A    Val 
--------------------------------------- 
    Test A     Kush 
    Test B     KTM 
    Test C     98545 

Я попытался поворотное 2-й стол, но так как это собиралось быть таблица с динамическим числом столбцов, это будет сложно.

Есть ли другая альтернатива?

ответ

0

Это не имеет смысла!

Вам необходимо создать связь между таблицами A и B на одном значении PK (первичный ключ) или нескольких значениях (композитный ключ). Таблица 1 будет иметь PK для FK (внешний ключ).

Column_A    Column_B 
--------------------------------------- 
Test A     name 
Test B     address 
Test C     phone 
Test D     name 


name  address   email  country   phone   
------------------------------------------------------------------- 
Kush  KTM    [email protected]   NP   98545 
Bush  BTM    [email protected]   NP   98545 

Какой выход теперь, когда А и В имеют имя в качестве значения?

Вы в основном нарушаете законы нормальности.

См. Ниже, базы данных обычно находятся в 3-й нормальной форме.

http://en.wikipedia.org/wiki/Database_normalization#Normal_forms

Лучшее решение состоит в следующем.

Таблица 1

Test  Description  Surrogate 
--------------------------------------- 
Test A  name    1 
Test B  address   2 
Test C  phone   3 
Test D  name    4 

Таблица 2

Surrogate Value 
--------------------------------------- 
1   Kush 
2   Bush 

Используйте суррогатный ключ в таблице 1 (тест/описание) относиться к (значений) в таблице 2.

http://en.wikipedia.org/wiki/Surrogate_key

Есть и другие способы сделать это, но без письменных бизнес-правил, это o ne way.

+0

второй таблицы временной таблицы и будет содержать только одну строку. – hsuk

3

Простой случай с фиксированным числом столбцов в Table2nd могут быть решены с UNPIVOT:

SELECT a.Column_A, b.colVal 
FROM 
Table1st a 
INNER JOIN 
(
    SELECT 
     * 
    FROM 
     Table2nd 
    unpivot (
    colVal 
    for Col in (name, address, email, country, phone) 
    ) unpvt 
) b 
ON a.Column_B = b.col; 

Fiddle here

Общий случай, когда вы не закрепили столбцы Table2nd должны быть адресуется через динамический sql, но с тем же самым univot. Посмотрите на bluefeet's answer here, как это сделать.

Вы можете получить динамические столбцы для Table2nd несколькими способами, например.через sys.columns, или если предположить, что столбцы, указанные в Table1st всегда существуют, то из Table1st:

DECLARE @cols NVARCHAR(100); 
SET @cols = STUFF((SELECT distinct ',' + Column_B 
      FROM Table1st 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 

Несколько предостережений:

  • Для того, чтобы UNPIVOT работать, типам столбцы, не привязанные друг к другу, все должны быть одинаковыми. Попробуйте лить через NVARCHAR, если нет.
  • Если вам нужно использовать QUOTENAME, вам нужно будет сделать это с обеих сторон соединения.
0

Вы можете попробовать динамический SQL так же, как:

declare @query varchar(500) = (select stuff(
(SELECT ',' + B.NAME 
from sys.tables A 
inner join syscolumns B 
    on A.[object_id] = B.id 
where A.name = 'Table2' 
FOR XML PATH('')),1,1,'') A) 

set @query = 'select Column_A, Value from Table2 unpivot (Value for V in (' + @query + ')) B  
inner join Table1 on Table1.Column_B = B.V' 

exec sp_sqlexec @query 
Смежные вопросы