как получить столбец из таблицы в приоритете - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть три таблицы, которые имеют приоритет для столбца выбора в операторе SELECT.

Предположим, таблица A имеет несколько столбцов, таких как:

Таблица A:

A_ID     |name
---------|-------
1        |name1

Таблица B:

purchase |A_ID |type | market | group | rate    |   max  |   min
---------|-----|-----|--------|-------|---------|--------|---------
    1    |  1  |  1  |   1    |   1   |  0.12   |  1000  |   500
    1    |  1  |  2  |   1    |   1   |  0.3    |  2000  |   1500
    0    |  1  |  3  |   1    |   1   |  0.2    |  5000  |   800
    0    |  1  |  4  |   1    |   1   |  0.6    |  8000  |   2800
    0    |  1  |  6  |   1    |   1   |  0.7    |  null  |   2800

Таблица C:

purchase |A_ID |type | market | group | rate    |   max  |   min
---------|-----|-----|--------|-------|---------|--------|---------
    1    |  1  |  1  |   1    | null  |  0.2    |  null  |   null
    1    |  1  |  2  |   1    | null  |  null   |  5000  |   3000
    0    |  1  |  3  |   1    | null  |  0.5    |  3000  |   1000
    0    |  1  |  5  |   1    | null  |  0.4    |  3800  |   2000
    0    |  1  |  6  |   1    | null  |  null   |  null  |   3000

Желаемый результат:

purchase |A_ID |type | market | rate    |   max  |   min
---------|-----|-----|--------|---------|--------|---------
    1    |  1  |  1  |   1    |  0.2    |  1000  |   500
    1    |  1  |  2  |   1    |  0.3    |  5000  |   3000
    0    |  1  |  3  |   1    |  0.5    |  3000  |   1000
    0    |  1  |  5  |   1    |  0.4    |  3800  |   2000
    0    |  1  |  4  |   1    |  0.6    |  8000  |   2800
    0    |  1  |  6  |   1    |  0.7    |  null  |   3000

Правила получения значений из столбцов:

1- Table C имеет более высокий приоритет, чем Table B, это означает, что, если они оба имеют значение в одном и том же столбце, результат выбирается из Table C, за исключением случаев, когда значение равно нулю

2- Результатможет быть GROUP BY on purchase, type, market

3- Result Has FULL JOIN, это означает, что если строка имеет эквивалентную строку на другой стороне, используйте приоритет для получения значения, если не весь ряд пришел в результате

4 - Приоритет выбора значения для столбцов (скорость | макс. / Мин.):

  • Если значение имеет столбец rate в TABLE C, без учета значения в TABLE B==> Выбор результата из TABLE C
  • Если столбец rate в TABLE C равен null, но имеет значение в TABLE B ==> Выбор результата из TABLE B

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Используйте функцию coalesce (), которая всегда возвращает первое ненулевое значение в списке

select coalesce(b.purchase,a.purchase) purchase,
       coalesce(b.A_ID,a.A_ID) A_ID,
       coalesce(b.[type],a.[type]) [type],
       coalesce(b.market,a.market) market,
       coalesce(b.rate,a.rate) rate,
       coalesce(b.[max],a.[max]) [max],
       coalesce(b.[min],a.[min]) [min]
from tableB a full outer join tableC b
on a.purchase=b.purchase and a.[type]=b.[type]
0 голосов
/ 28 сентября 2018

Это использует синтаксис сервера sql, я уверен, что вы можете изменить при необходимости:

Сначала настройте пример данных:

declare @a table(purchase int,A_ID int,[type] int,market int,[group] int,rate decimal(5,2),[max] int,[min] int)
insert @a values (1,1,1,1,1,0.12,1000,500)
,(1,1,2,1,1,0.3,2000,1500)
,(0,1,3,1,1,0.2,5000,800)
,(0,1,4,1,1,0.6,8000,2800)
,(0,1,6,1,1,0.7,null,2800)

declare @b table(purchase int,A_ID int,[type] int,market int,[group] int,rate decimal(5,2),[max] int,[min] int)
insert @b values 
(1,1,1,1,null,0.2,null,null)
,(1,1,2,1,null,null,5000,3000)
,(0,1,3,1,null,0.5,3000,1000)
,(0,1,5,1,null,0.4,3800,2000)
,(0,1,6,1,null,null,null,3000)

Затем запрос:

select coalesce(b.purchase,a.purchase) purchase,
    coalesce(b.A_ID,a.A_ID) A_ID,
    coalesce(b.[type],a.[type]) [type],
    coalesce(b.market,a.market) market,
    coalesce(b.rate,a.rate) rate,
    coalesce(b.[max],a.[max]) [max],
    coalesce(b.[min],a.[min]) [min]
from @a a
full outer join @b b on b.purchase=a.purchase and b.[type]=a.[type] and b.market=a.market
order by rate

Добавьте любую сортировку по вашему требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...