Sim, você pode fazer isso. O truque que você precisa é o conceito de que existem duas maneiras de tirar as mesas do servidor de mesa. Uma maneira é..
FROM TABLE A
A outra maneira é
FROM (SELECT col as name1, col2 as name2 FROM ...) B
Observe que a cláusula select e os parênteses em torno dela são uma mesa, uma mesa virtual.
Então, usando seu segundo exemplo de código (estou supondo as colunas que você espera recuperar aqui):
SELECT a.attr, b.id, b.trans, b.lang
FROM attribute a
JOIN (
SELECT at.id AS id, at.translation AS trans, at.language AS lang, a.attribute
FROM attributeTranslation at
) b ON (a.id = b.attribute AND b.lang = 1)
Observe que sua tabela real
attribute
é a primeira tabela nesta junção, e que esta tabela virtual eu chamei de b
é a segunda mesa. Essa técnica é especialmente útil quando a tabela virtual é uma tabela de resumo de algum tipo. por exemplo.
SELECT a.attr, b.id, b.trans, b.lang, c.langcount
FROM attribute a
JOIN (
SELECT at.id AS id, at.translation AS trans, at.language AS lang, at.attribute
FROM attributeTranslation at
) b ON (a.id = b.attribute AND b.lang = 1)
JOIN (
SELECT count(*) AS langcount, at.attribute
FROM attributeTranslation at
GROUP BY at.attribute
) c ON (a.id = c.attribute)
Veja como isso vai? Você gerou uma tabela virtual
c
contendo duas colunas, juntou-se às outras duas, usou uma das colunas para o ON
cláusula e retornou a outra como uma coluna em seu conjunto de resultados.