J'ai une requête
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
si # ID # = 1 elle renvoie la table
GUID | word ----------- 1 | AA 2 | BB1 2 | BB2 3 | CC 4 | DD1 4 | DD2 6 | FF
si # ID # = 2 il renvoie la table
GUID | word ----------- 1 | A 2 | B 3 | C1 3 | C2 4 | D1 4 | D2 5 | E
Maintenant, je veux fusionner ces deux tables / requêtes pour obtenir une table qui ressemble à ça: p>
SELECT
d.GUID, w.word
FROM
dictionary d
JOIN
word w ON w.ID = d.ID_word
WHERE
w.id_language = #ID#;
Il s'agit donc essentiellement d'un tableau du produit cartésien des lignes avec le même GUID
3 Réponses :
select *
from
( -- if #ID# = 1 it returns table
SELECT
d.GUID, w.word
FROM
dictionary d
JOIN
word w ON w.ID = d.ID_word
WHERE
w.id_language = 1
) as t1
join
( -- if #ID# = 2 it returns table
SELECT
d.GUID, w.word
FROM
dictionary d
JOIN
word w ON w.ID = d.ID_word
WHERE
w.id_language = 2
) as t2
-- Cartesian product of the rows with the same GUID
on t1.guid = t2.guid
Vous pouvez simplement REJOINDRE vos deux requêtes sur GUID:
SELECT q1.GUID, q1.word AS word1, q2.word AS word2
FROM (
SELECT
d.GUID, w.word
FROM
dictionary d
JOIN
word w ON w.ID = d.ID_word
WHERE
w.id_language = 1
) q1
JOIN (
SELECT
d.GUID, w.word
FROM
dictionary d
JOIN
word w ON w.ID = d.ID_word
WHERE
w.id_language = 1
) q2 ON q2.GUID = q1.GUID
Vous n'avez pas besoin de sous-requêtes:
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 = ?;
Je pense que c'est plus lisible en utilisant les CTE:
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 = ?;
Dans ces deux exemples ( et ce qu'implique votre question) Les GUID avec un seul mot sont filtrés. Ceux-ci peuvent être inclus en peaufinant les requêtes.