【发布时间】:2011-06-23 16:36:06
【问题描述】:
我有以下架构:
phrase (in U.S. English): translation: code_value:
---------------------- ----------------------------------------- ------------------------------
| phrase_id | phrase | | phrase_id | translation | language_cd | | code class | code value |
---------------------- ----------------------------------------- ------------------------------
| 1 | cheese | | 1 | fromage | FR | | LANGUAGE_CD | FR |
---------------------- ----------------------------------------- | LANGUAGE_CD | DE |
| LANGUAGE_CD | ES |
------------------------------
这个数据集合的作用是,对于给定的美国英语短语,它将为您提供法语、德语和西班牙语三种语言的相应翻译(至少在我们的网络应用程序的上下文中 - 我们不是想成为谷歌翻译之类的)。
我要做的是获取给定短语的所有翻译列表,如果不存在给定目标语言的翻译,我希望它返回 NULL。
到目前为止我的查询是:
SELECT phrase.phrase_id, phrase.string orig_phrase, code_value.code_value, translation.string as trans_phrase
FROM phrase, translation, code_value
WHERE code_value.code_class = 'LANGUAGE_CD' AND translation.phrase_id = phrase.phrase_id
ORDER BY orig_phrase;
返回:
-------------------------------------------------------
| phrase_id | orig_phrase | code_value | trans_phrase |
-------------------------------------------------------
| 1 | cheese | FR | fromage |
| 1 | cheese | DE | fromage |
| 1 | cheese | ES | fromage |
-------------------------------------------------------
但我打算让它返回的是:
-------------------------------------------------------
| phrase_id | orig_phrase | code_value | trans_phrase |
-------------------------------------------------------
| 1 | cheese | FR | fromage |
| 1 | cheese | DE | <NULL> |
| 1 | cheese | ES | <NULL> |
-------------------------------------------------------
我知道我需要一个 LEFT 或 RIGHT JOIN 来获取 NULL 值,但我似乎无法确切地弄清楚如何编写它。
当这一切都说完了,很明显我们也会有德语和西班牙语的翻译,我需要它们匹配,但 NULL 值的目的是清楚地向我们展示我们使用什么语言尚未翻译给定的短语。
【问题讨论】: