【问题标题】:Joining vertical and horizontal table连接垂直和水平表
【发布时间】:2022-01-24 20:57:03
【问题描述】:

我怎样才能做一个连接两个表并获得结果表。考虑它有困难,因为我相信一个是水平表,另一个是垂直表。关于 SO 的其他答案对我来说并不清楚,因为我必须在一行中加入一个带有列名的值。我该怎么做?

CREATE TABLE forecast (
   year integer,
   week integer,
   model varchar(50),
   category varchar(50),
   subcategory varchar(50)
);  
insert into forecast (year, week, model, category, subcategory) values (2021, 1, 'AAA', 'CategoryA', 'SubcategoryA');
insert into forecast (year, week, model, category, subcategory) values (2021, 1, 'BBB', 'CategoryA', 'SubcategoryA');
insert into forecast (year, week, model, category, subcategory) values (2021, 1, 'CCC', 'CategoryB', 'SubcategoryB');
insert into forecast (year, week, model, category, subcategory) values (2021, 1, 'DDD', 'CategoryA', 'SubcategoryC');

CREATE TABLE translation (
    type varchar(50),
    name varchar(50),
    translated varchar(50)
); 
insert into translation (type, name, translated) values ('category', 'CategoryA', 'TranslatedCategoryA');
insert into translation (type, name, translated) values ('category', 'CategoryB', 'TranslatedCategoryB');
insert into translation (type, name, translated) values ('subcategory', 'SubcategoryA', 'TranslatedSubcategoryA');
insert into translation (type, name, translated) values ('subcategory', 'SubcategoryB', 'TranslatedSubcategoryB');
insert into translation (type, name, translated) values ('subcategory', 'SubcategoryC', 'TranslatedSubcategoryC');



CREATE TABLE result (
    year integer,
    week integer,
    model varchar(50),
    category varchar(50),
    subcategory varchar(50)
); 


insert into result (year, week, model, category, subcategory) values (2021, 1, 'AAA', 'TranslatedCategoryA', 'TranslatedSubcategoryA');
insert into result (year, week, model, category, subcategory) values (2021, 1, 'BBB', 'TranslatedCategoryA', 'TranslatedSubcategoryA');
insert into result (year, week, model, category, subcategory) values (2021, 1, 'CCC', 'TranslatedCategoryB', 'TranslatedSubcategoryB');
insert into result (year, week, model, category, subcategory) values (2021, 1, 'DDD', 'TranslatedCategoryA', 'TranslatedSubcategoryC');

这个

select * from forecast f
left join translation t
on t.name = f.category or t.name = f.subcategory

一次翻译一个,这是有道理的,但我无法从中得到两列来翻译每一列

【问题讨论】:

    标签: sql tsql join


    【解决方案1】:

    类型和名称的双左连接。
    如果没有翻译,则合并默认为原始名称。

    select f.year, f.week, f.model
    , coalesce(cat.translated, f.category) as category 
    , coalesce(subcat.translated, f.subcategory) as subcategory
    from forecast f
    left join translation cat 
      on cat.name = f.category 
     and cat.type = 'category' 
    left join translation subcat 
      on subcat.name = f.subcategory
     and subcat.type = 'subcategory'
    order by f.year, f.week, f.model;
    
    year week model category subcategory
    2021 1 AAA TranslatedCategoryA TranslatedSubcategoryA
    2021 1 BBB TranslatedCategoryA TranslatedSubcategoryA
    2021 1 CCC TranslatedCategoryB TranslatedSubcategoryB
    2021 1 DDD TranslatedCategoryA TranslatedSubcategoryC

    db小提琴here

    【讨论】:

      【解决方案2】:

      我们必须进行多重连接。每列一个。

      select f.year, f.week, f.model, t.translated as 'category', t2.translated as 'subcategory' 
      from forecast f
      left join translation t
      on t.name = f.category 
      left join translation t2
      on t2.name = f.subcategory 
      

      【讨论】:

      • 旁白:一个好习惯,也是一个值得鼓励的习惯,是分配至少有微弱意义的表别名。 tt2 交流不多。即使tctsc 也会有所改进。