簡體   English   中英

具有3個表和在同一表上的子查詢的SQL查詢

[英]SQL Query with 3 tables and a subquery on same table

我有3張桌子,看起來像這樣:

Personne

Id_Personne | Prenom_personne | Nom_personne

11          | Jean | Dupont

13          | Albert | Martin

Relation_personne

Id_Personne | Id_Relation | Id_Personne_Famille

11          | 5           | 13

13          | 3           | 11

關系

Type_relation | ID_Relation

Fils de       | 5

Père de       | 3

我試圖獲得這個:

Id_Personne | Prenom_personne | Nom_personne | Parenté

11          | Jean            | Dupont       | Fils de Albert Martin

13          | Albert          | Martin       | père de Jean Dupont

這是我現在的SQL查詢:

CREATE TABLE Vue_personne
SELECT Personne.Id_personne, Personne.Nom_personne AS Nom, Personne.Prenom_personne AS Prenom,
CONCAT (Relation.Type_relation,' ', Personne.Nom_personne = 
(SELECT Personne.Prenom_personne FROM Personne 
WHERE Personne.Id_Personne = Relation_Personne.Id_Personne_Famille),' ', 
Personne.Nom_personne = (SELECT Personne.Prenom_personne FROM Personne 
WHERE Personne.Id_Personne = Relation_Personne.Id_Personne_Famille)) AS Parenté
FROM Personne
LEFT JOIN Relation_Personne ON Relation_Personne.Id_Personne_Famille = Personne.Id_Personne
LEFT JOIN Relation ON Relation.Id_Relation = Relation_Personne.Id_Relation

GROUP BY Personne.Id_personne

感謝您的任何建議。

Personne一起使用join

 select p2.Id_Personne, p2.Prenom_personne,p2.Nom_personne
 ,p1.Prenom_personne||' '||p1.Nom_personne||' '||r.Type_relation from     
 Relation_personne rp join 
 Relation r on rp.ID_Relation=r.ID_Relation
 join Personne p1 on p1.Id_Personne =rp.Id_Personne_Famille
 join Personne p2 on  p2.Id_Personne=rp.Id_Personne

您需要來自Personne兩個(可能)不同記錄中的值。 因此,您需要在同一查詢中兩次使用Personne ,並進行適當的聯接,每個聯接都有一個別名以區分它們。

SELECT
    p.id_personne,
    p.prenom_personne,
    p.nom_personne,
    (
        r.type_relation || ' ' || op.prenom_personne || ' ' || op.nom_personne
    ) AS parenté
FROM personne AS p
    INNER JOIN relation_personne AS rp USING (id_personne)
    INNER JOIN relation AS r USING (id_relation)
    INNER JOIN personne AS op ON (rp.id_personne_famille = op.id_personne)
;

用您的示例數據:

CREATE TABLE personne (
    id_personne integer PRIMARY KEY,
    prenom_personne varchar,
    nom_personne varchar );
INSERT INTO personne ( id_personne, prenom_personne, nom_personne ) VALUES
    ( 11, 'Jean', 'Dupont' ),
    ( 13, 'Albert', 'Martin' );
CREATE TABLE relation (
    type_relation varchar,
    id_relation integer PRIMARY KEY );
INSERT INTO relation ( id_relation, type_relation ) VALUES
    ( 5, 'Fils de' ),
    ( 3, 'Père de' );
CREATE TABLE relation_personne (
    id_personne integer
        REFERENCES personne (id_personne),
    id_relation integer
        REFERENCES relation (id_relation),
    id_personne_famille integer
        REFERENCES personne (id_personne) );
INSERT INTO relation_personne ( id_personne, id_relation, id_personne_famille ) VALUES
    ( 11, 5, 13 ),
    ( 13, 3, 11 );

上面的查詢返回:

 id_personne | prenom_personne | nom_personne |        parenté        
-------------+-----------------+--------------+-----------------------
          11 | Jean            | Dupont       | Fils de Albert Martin
          13 | Albert          | Martin       | Père de Jean Dupont

符合您想要的結果集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM