связь между двумя таблицами - PullRequest
1 голос
/ 17 июня 2019

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

TableA, которая содержит описание всех продуктов:

codeProduct   description

    1              ok
    2              yes

TableB содержит иерархию между продуктами только с кодами:

level_1 level_2 level_3 level_4
1       2       23      75
1       2       53      85

Как я могу получить финальную таблицу, которая содержит описание каждого уровня

level_1 description_1 level_2 description_2 level_3 description_3 level_4 description_4

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

Попробуйте это:

CREATE TABLE #TABLEA
(
  CODEPRODUCT INT NOT NULL
, DESCRIPTION VARCHAR (100) NOT NULL
);

INSERT INTO #TABLEA VALUES (1, 'ok') ;
INSERT INTO #TABLEA VALUES (2, 'yes');

CREATE TABLE #TABLEB
(
  LEVEL_1 INT NOT NULL
, LEVEL_2 INT NOT NULL
, LEVEL_3 INT NOT NULL
, LEVEL_4 INT NOT NULL
);

INSERT INTO #TABLEB VALUES(1, 2, 23, 75) , (1, 2, 53, 85);

SELECT #TABLEB.LEVEL_1
     , TA_L1.DESCRIPTION AS DESCRIPTION1
     , #TABLEB.LEVEL_2
     , TA_L2.DESCRIPTION AS DESCRIPTION2
     , #TABLEB.LEVEL_3
     , TA_L3.DESCRIPTION AS DESCRIPTION3
     , #TABLEB.LEVEL_4
     , TA_L4.DESCRIPTION AS DESCRIPTION4
FROM #TABLEB
LEFT JOIN #TABLEA TA_L1
ON #TABLEB.LEVEL_1 = TA_L1.CODEPRODUCT
LEFT JOIN #TABLEA TA_L2
ON #TABLEB.LEVEL_2 = TA_L2.CODEPRODUCT
LEFT JOIN #TABLEA TA_L3
ON #TABLEB.LEVEL_3 = TA_L3.CODEPRODUCT
LEFT JOIN #TABLEA TA_L4
ON #TABLEB.LEVEL_4 = TA_L4.CODEPRODUCT;

Результат:

LEVEL_1, DESCRIPTION1, LEVEL_2, DESCRIPTION2, LEVEL_3, DESCRIPTION3, LEVEL_4, DESCRIPTION4
    1   ok  2   yes 23  NULL    75  NULL
    1   ok  2   yes 53  NULL    85  NULL
2 голосов
/ 17 июня 2019

Вам нужно использовать tableA несколько раз каждый раз, когда вам нужно значение для столбца в таблице B

select b.level_1
    , a1.description description_1
    , b.level_2
    , a2.description description_2
    , b.level_3
    , a3.description description_3
    , b.level_4 
    , a4.description description_4 
from  TableB b 
left join  TableA a1 on a1.codeProduct = b.level_1 
left join  TableA a2 on a2.codeProduct = b.level_2 
left join  TableA a3 on a3.codeProduct = b.level_3 
left join  TableA a4 on a4.codeProduct = b.level_4  

использовать левое соединение, если не все совпадают значения между двумя таблицами, или INNER JOIN, если у вас есть всеЗначения

select b.level_1
    , a1.description description_1
    , b.level_2
    , a2.description description_2
    , b.level_3
    , a3.description description_3
    , b.level_4 
    , a4.description description_4 
from  TableB b 
INNER join  TableA a1 on a1.codeProduct = b.level_1 
INNER join  TableA a2 on a2.codeProduct = b.level_2 
INNER join  TableA a3 on a3.codeProduct = b.level_3 
INNER join  TableA a4 on a4.codeProduct = b.level_4  
...