I have a query
SELECT
d.GUID, w.word
FROM
dictionary d
JOIN
word w ON w.ID = d.ID_word
WHERE
w.id_language = #ID#;
if #ID# = 1 it returns table
GUID | word ----------- 1 | A 2 | B 3 | C1 3 | C2 4 | D1 4 | D2 5 | E
if #ID# = 2 it returns table
GUID | word ----------- 1 | AA 2 | BB1 2 | BB2 3 | CC 4 | DD1 4 | DD2 6 | FF
Now I want merge these two tables/queries to get a table which looks like that:
GUID | word1 | word2 -------------------- 1 | A | AA 2 | B | BB1 2 | B | BB2 3 | C1 | CC 3 | C1 | CC 4 | D1 | DD1 4 | D1 | DD2 4 | D2 | DD1 4 | D2 | DD2
So basically it is a table of the Cartesian product of the rows with the same GUID
Advertisement
Answer
You don’t need subqueries:
SELECT d1.GUID, w1.word, w2.word
FROM dictionary d1 JOIN
word w1
ON w1.ID = d1.ID_word JOIN
dictionary d2
ON d2.GUID = d.GUID JOIN
word w2
ON w2.id = d2.ID_word
WHERE w1.id_language = ? AND
w2.id_language = ?;
I think this is more readable using CTEs:
WITH dw AS (
SELECT d.GUID, w.word, w.id_language
FROM dictionary d JOIN
word w
ON w.ID = d.ID_word
)
SELECT dw1.GUID, dw1.word, dw2.word
FROM dw dw1 JOIN
dw dw2
ON dw1.GUID = dw2.GUID
WHERE dw1.id_language = ? AND
dw2.id_language = ?;
In both these examples (and what is implied by your question) GUIDs with only one word are filtered out. These can be included by tweaking the queries.