PL-SQL如何在同一个表上进行两次内部联接



我正试图创建一个查询,该查询出于语言目的两次联接一个表。

但是SQL Developer总是抛出一个错误

SELECT 中的无效标识符

当我尝试使用表的ALIAS时(表2无效(

SELECT
table1.code Code,
table2.descr DescrFr,
table3.descr_en DescrEn
FROM
main_table table1
INNER JOIN 
descr_table table2 ON table1.code = table2.code 
AND table2.lang = 'fr'
INNER JOIN
descr_table table3 ON table1.code = table3.code 
AND table3.lang = 'en'

我没有发现任何对我的案件有帮助的东西,可以告诉我我的查询出了什么问题。

编辑

用户要求进行测试,但出现此错误

错误SQL:ORA-00904:";表3"代码":非有效识别器

SELECT 
table1.code AS Code, 
table2.descr AS DescrFr, 
table3.descr AS DescrEn 
FROM main_table table1 
INNER JOIN descr_table table2 ON (table1.code = table2.code) 
INNER JOIN descr_table table3 ON (table1.code = table3.code) 
WHERE (table2.lang = 'fr' AND table3.lang = 'en');

回答

结果是一个手掌。。。初始查询正在工作。。我只是在descr_table中使用了错误的列名。。。

我不知道您使用的版本,但我想您可以尝试SELECT table1.code AS Code,...。我宁愿在sql查询中不使用那么多CCD_ 2,而宁愿使用至少一个CCD_;"主表";其具有最高优先级。

当然,我想是出了问题。这样你的代码就可以了:

SELECT 
table1.code AS Code, 
table2.descr AS DescrFr, 
table3.descr_en AS DescrEn 
FROM 
main_table AS table1 
INNER JOIN 
descr_table AS table2 ON (table1.code = table2.code) 
INNER JOIN 
descr_table table3 ON (table1.code = table3.code) 
WHERE 
(table2.lang = 'fr' AND table3.lang = 'en')

我会完全避免双重联接。

  • 从不使用别名,如table1

这可能是…

SELECT
main.Code,
descr.DescrFr,
descr.DescrEn
FROM
main_table  main
INNER JOIN 
(
SELECT
code,
MAX(CASE WHEN lang = 'fr' THEN descr END)   AS DescrFr,
MAX(CASE WHEN lang = 'en' THEN descr END)   AS DescrEn
FROM
descr_table
WHERE
lang IN ('fr', 'en')
GROUP BY
code
)
descr
ON descr.code = main.code

(即使这样,根据您的描述,您甚至不需要外部联接,因为code存在于descr_table中。(

最新更新