用于合并表并生成结果的SQL查询

时间:2018-04-17 09:59:17

标签: sql oracle

Person_Tbl

PersonID |  Name
------------------
101      |  Stefan
102      |  Andreas

PersonDescription_Tbl

PDId | PersonId |  Desc   | Lang
---------------------------
1    | 101      | Hello  | en
2    | 101      | Hallo  | de 
3    | 102      | Hello  | en
4    | 102      | Hallo  | de 

我正在寻找的输出是比较上面的2个表,并得到类似如下所示的结果:

输出

Name    | Desc_en  | Desc_de
---------------------------
Stefan  | Hello    | Hallo
Andreas | Hello    | Hallo

我尝试了以下SQL子查询,但没有运气。如果有任何查询可以获取与上述类似的信息,请与我们联系。

Select * from Person_Tbl where PersonID in (Select PersonID from PersonDescription_Tbl)

2 个答案:

答案 0 :(得分:4)

使用条件聚合执行joins而不是使用in

select p.Name, max(case when pd.Lang = 'en' then pd.Dec end) as Desc_en,
               max(case when pd.Lang = 'de' then pd.Dec end) as Desc_de   
from Person_Tbl p
inner join PersonDescription_Tbl pd on pd.PersonId  = p.PersonId 
group by p.Name; 

答案 1 :(得分:4)

您需要做的就是加入表格,然后转动数据,您可以使用条件聚合进行数据处理:

SELECT p.name, MAX(CASE WHEN pd.lang = 'en' THEN pd.desc END) AS desc_en
     , MAX(CASE WHEN pd.lang = 'de' THEN pd.desc END) AS desc_de
  FROM person_tbl p INNER JOIN persondescription_tbl pd
    ON p.personid = pd.personid;

如果您不介意使用特定于Oracle的语法,可以使用DECODE()函数并节省一些按键:

SELECT p.name, MAX(DECODE(pd.lang, 'en', pd.desc)) AS desc_en
     , MAX(DECODE(pd.lang, 'de', pd.desc)) AS desc_de
  FROM person_tbl p INNER JOIN persondescription_tbl pd
    ON p.personid = pd.personid;

或使用PIVOT运算符(如果您使用11g或更高版本):

SELECT * FROM (
    SELECT p.name, pd.dec, pd.lang
      FROM person_tbl p INNER JOIN persondescription_tbl pd
        ON p.personid = pd.personid
) PIVOT (
    desc FOR lang IN ('en' AS desc_en, 'de' AS desc_de )
);

希望这有帮助。