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)
答案 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 )
);
希望这有帮助。