Все из таблицы A и включают строку для каждого набора из таблицы B, даже если в таблице B нет связанных записей - PullRequest
0 голосов
/ 03 ноября 2019

Мне пришлось нелегко описать эту простую проблему ...

Я хочу вернуть ряд точек данных для столбчатой ​​диаграммы с накоплением для каждой метки и столбца стека, независимо от того, существует ли запись дляточка данных Label / Bar - нулевое значение, возвращаемое там, где нет записи данных. «Отсутствующая» метка также должна быть включена:

    Label   Bar  Value
    a       X    99
    a       Y    23
    a       Z    97
    b       X    null
    b       Y    32
    b       Z    null

У меня есть таблица DataLabel, которая содержит метки для каждого типа точки данных в стеке стержней, и таблица DataSeries, которая содержит метки оси X иЗначения оси Y, которые будут рассчитаны для каждой точки данных.

    create table DataLabel
    (id number
    , label varchar2(10));

    Insert into DataLabel values (1, 'a');
    Insert into DataLabel values (2, 'b');

    Create table DataSeries
    (id number
    , DataLabel_id number
    , val number
    , DataSeriesName varchar2(5));

    Insert into DataSeries values (1, 1, 99, 'X');
    Insert into DataSeries values (11, 1, 23, 'Y');
    Insert into DataSeries values (12, 2, 32, 'Y');
    Insert into DataSeries values (21, 1, 97, 'Z');

Проблема возникает в том случае, если таблица DataSeries не содержит соответствующего значения для DataLabel для данной точки данных.

Я управлял неэффективным решением, которое действительно возвращает желаемый результатв SQLfiddle с использованием объединения Union, но есть ли лучшее решение ....?

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

A cross join среди таблиц, содержащих коррелированный подзапрос, может быть опция:

select distinct label, DataSeriesName as bar,
      (select val 
         from DataSeries 
        where DataSeriesName=s.DataSeriesName 
          and DataLabel_id=l.id) as value
  from DataSeries s
 cross join DataLabel l 
 order by label, bar

Демо

1 голос
/ 03 ноября 2019

Используйте cross join для генерации строк и затем left join для ввода значений:

select dl.label, dsn.dataseriesname,
       ds.val
from datalabel dl cross join
     (select distinct dataseriesname from dataseries
     ) dsn left join
     dataseries ds
     on ds.datalabel_id = dl.id and
        ds.dataseriesname = dsn.dataseriesname
order by dl.label, dsn.dataseriesname;

Здесь - это скрипта SQL.

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