Как связать две несвязанные таблицы через одну таблицу с общими значениями? - PullRequest
2 голосов
/ 24 марта 2019

Я добавляю столбец процентов комиссии к существующему запросу.Тем не менее, данные комиссии находятся в таблице, не связанной с основной таблицей (A), используемой в запросе.Тем не менее, эти две таблицы имеют общие столбцы / значения с таблицей B.

У меня есть три таблицы, A, B и C ниже

Table A     
Reference   Value_Name  Renewal_Code
1           A           N
2           A           R
3           B           N
4           A           R
4           A           N

Table B     
Reference   Value_Name  Prod_Code
1           A           0016
2           A           0027
4           A           0032
4           A           0032

Table C     
A_Prod_Code      A_Tans_Code    **Commission_Percent**
0016             Renewal        5
0027             Renewal        5
0032             New            10
0032             Renewal        5

Мне нужно получить Commission_Percent из Table C относительно соответствующего Renewal_Code из Table A.Это то же самое, что A_Tans_Code из Table C, за исключением того, что Table C излагает Renewal или New и Table A использует только R или N.

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

Я также попытался использовать оператор декодирования, чтобы связать Renewal_code/A_Trans_Code столбцы от Tables A and C.

( 
    SELECT 
          distinct c.commision_percent 
    FROM 
          TableA a 

          JOIN TableB b ON a.reference = b.reference 
            AND b.value_name = 'A' 
          JOIN TableC c ON b.prod_code = c.a_prod_code 
            AND b.value_name = 'A' 
          JOIN TableC c  ON a.renewal_code = decode(c.a_trans_code, 'Rewnal','R','New','N')          
  ) Commission_Percent

Мне нужны правильные commission_percent для Renewal и New бизнеса, чтобы пройти для каждой ссылки.Пока что я получаю NULLs только потому, что мне трудно связать столбцы Tables A и C's Renewal_code и A_prod_code.

Любая помощь очень ценится!

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Это создает воспроизводимое тестирование путем очистки временных таблиц и повторной вставки данных. И может быть моделью для других решений.

SQL "Select ..." соединяется с одним TableC, который состоит из двух частей с условием ON - prod_code и renewal_code (вместо двух объединений). Просто удалите «. *», Чтобы использовать его в вашем sql. (функция декодирования была изменена для использования нижнего индекса первого символа A_Trans_Code).

IF OBJECT_ID('tempdb..#TableA') IS NOT NULL DROP TABLE #TableA
GO
CREATE TABLE #TableA
    (     Reference          INTEGER 
        , Value_Name         VARCHAR(10)
        , Renewal_Code       VARCHAR(10)    )

    INSERT INTO #TableA VALUES( 1, 'A', 'N'   );
    INSERT INTO #TableA VALUES( 2, 'A', 'R'   );
    INSERT INTO #TableA VALUES( 3, 'B', 'N'   );
    INSERT INTO #TableA VALUES( 4, 'A', 'R'   );
    INSERT INTO #TableA VALUES( 4, 'A', 'N'   );

IF OBJECT_ID('tempdb..#TableB') IS NOT NULL DROP TABLE #TableB
GO
CREATE TABLE #TableB
    (     Reference          INTEGER 
        , Value_Name         VARCHAR(10)
        , Prod_Code          VARCHAR(10)    )

    INSERT INTO #TableB VALUES( 1, 'A', '0016'   );
    INSERT INTO #TableB VALUES( 2, 'A', '0027'   );
    INSERT INTO #TableB VALUES( 4, 'A', '0032'   );
    INSERT INTO #TableB VALUES( 4, 'A', '0032'   );

IF OBJECT_ID('tempdb..#TableC') IS NOT NULL DROP TABLE #TableC
GO
CREATE TABLE #TableC
    (     Prod_Code          VARCHAR(10)
        , A_Trans_Code        VARCHAR(10)
        , Commission_Percent INTEGER    )

    INSERT INTO #TableC VALUES( '0016', 'Renewal', 5   );
    INSERT INTO #TableC VALUES( '0027', 'Renewal', 5   );
    INSERT INTO #TableC VALUES( '0032', 'New',     10   );
    INSERT INTO #TableC VALUES( '0032', 'Renewal', 5   );



SELECT distinct a.*,  c.commission_percent 
          FROM #TableA a
          JOIN #TableB b ON a.reference = b.reference 
            AND a.value_name = b.value_name 
          JOIN #TableC c ON b.prod_code = c.prod_code 
           AND a.renewal_code = SUBSTRING(c.a_trans_code,1,1) 

Результаты -

Reference   Value_Name  Renewal_Code    commission_percent
2           A           R               5
4           A           N               10
4           A           R               5 

Код для размещения в вашем sql

   ( SELECT distinct  c.commission_percent 
              FROM TableA a
              JOIN TableB b ON a.reference = b.reference 
                AND a.value_name = b.value_name 
              JOIN TableC c ON b.prod_code = c.prod_code 
               AND a.renewal_code = SUBSTRING(c.a_trans_code,1,1) 
    ) Commission_Percent
0 голосов
/ 25 марта 2019
 WITH table_a AS (

      SELECT 1 AS reference, 'A' AS value_name, 'N' AS renewal_code FROM DUAL UNION ALL
      SELECT 2 AS reference, 'A' AS value_name, 'R' AS renewal_code FROM DUAL UNION ALL
      SELECT 3 AS reference, 'B' AS value_name, 'N' AS renewal_code FROM DUAL UNION ALL
      SELECT 4 AS reference, 'A' AS value_name, 'R' AS renewal_code FROM DUAL UNION ALL
      SELECT 4 AS reference, 'A' AS value_name, 'N' AS renewal_code FROM DUAL

      ),
      table_b AS (

      SELECT 1 AS reference, 'A' AS value_name, '0016' AS prod_code FROM DUAL UNION ALL
      SELECT 2 AS reference, 'A' AS value_name, '0027' AS prod_code FROM DUAL UNION ALL
 /*     SELECT 4 AS reference, 'A' AS value_name, '0032' AS prod_code FROM DUAL UNION ALL duplicate row excluded */
      SELECT 4 AS reference, 'A' AS value_name, '0032' AS prod_code FROM DUAL

      ),
      table_c AS (

      SELECT '0016' AS a_prod_code, 'Renewal'   AS a_tans_code,  5 AS commission_percent FROM DUAL UNION ALL
      SELECT '0027' AS a_prod_code, 'Renewal'   AS a_tans_code,  5 AS commission_percent FROM DUAL UNION ALL
      SELECT '0032' AS a_prod_code, 'New'       AS a_tans_code, 10 AS commission_percent FROM DUAL UNION ALL
      SELECT '0032' AS a_prod_code, 'Renewal'   AS a_tans_code,  5 AS commission_percent FROM DUAL

      )

          SELECT a.reference AS ref_a,
                 a.value_name AS value_name_a,
                 b.reference AS ref_b,
                 b.value_name AS value_name_b,
                 a.renewal_code,
                 b.prod_code,
                 c.commission_percent
            FROM table_a a
 LEFT OUTER JOIN table_b b
                  ON a.value_name = b.value_name
                 AND a.reference = b.reference
 LEFT OUTER JOIN table_c c
                  ON SUBSTR(c.a_tans_code, 1, 1) = a.renewal_code
                 AND c.a_prod_code = b.prod_code
 ;

Общее табличное выражение (CTE) просто для создания тех же значений, которые вы разместили (CTE - это деталь, использующая конструкцию WITH).

Результаты:

      REF_A VALUE_NAME_A         REF_B VALUE_NAME_B    RENEWAL_CODE    PROD_CODE    COMMISSION_PERCENT
 ---------- --------------- ---------- --------------- --------------- ---------- --------------------
          2 A                        2 A               R               0027                          5
          4 A                        4 A               N               0032                         10
          4 A                        4 A               R               0032                          5
          1 A                        1 A               N               0016                           
          3 B                                          N                                              

Возможно, вам придется проверить значения в опубликованных вами строках, которые не приводят к объединению. Это также предполагает отсутствие кодов: отношения code_name, которые нарушают правило первой буквы имени кода = code.

...