2017-03-02 7 views
0

Die folgende Abfrage funktioniert. Ich möchte den Literalwert "2" in der innersten Abfrage durch den Spaltennamen P0.TLKP_Parent ersetzen. Wenn ich dies tun bekomme ich einen Syntaxfehler:Korrekte Art, Korrelation durchzuführen

Fehlercode: 1054 Unknown column 'P0.TLKP_Parent_PK' in 'where clause'

SELECT p0.*,x.nm 
From t_child P0 
, 
(
    SELECT p1.nm 
    FROM mydb.tlkp_parent P1 
    where p1.lang_cd="FR" 
    AND 
    p1.CORE_VAL= 
    (
     select CORE_VAL 
     FROM mydb.tlkp_parent P2 WHERE 
     (p2.PK =2) '<== want the '2' to be replaced with P0.TLKP_Parent 
    ) 
) as x 
where P0.TLKP_Parent_PK=2 

Wie dieses Problem beheben? Gibt es eine bessere Möglichkeit, diese Abfrage zu schreiben?

Danke. Hinweis: Die DDL:

DROP TABLE IF EXISTS t_child; 

CREATE TABLE t_child (
    Seq_id int(11) NOT NULL AUTO_INCREMENT, 
    SomeData varchar(45) DEFAULT NULL, 
    TLKP_Parent_PK int(11) NOT NULL, 
    PRIMARY KEY (Seq_id), 
    KEY fk_t_Child_TLKP_Parent_idx (TLKP_Parent_PK) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 

DROP TABLE IF EXISTS tlkp_parent; 

CREATE TABLE tlkp_parent (
    PK int(11) NOT NULL, 
    Core_Val int(11) DEFAULT NULL, 
    Lang_Cd char(2) DEFAULT NULL, 
    nm varchar(45) DEFAULT NULL, 
    PRIMARY KEY (PK) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO tlkp_parent 
(PK, Core_Val, Lang_Cd, nm) VALUES 
(1,100,'EN', 'A in English'), 
(2,101,'EN', 'B in English'), 
(3,102,'EN', 'C in English'), 
(4,100,'FR', 'A in French'), 
(5,101,'FR', 'B in French'), 
(6,102,'FR', 'C in French'); 

INSERT INTO `t_child` 
(Seq_id, `SomeData`, `TLKP_Parent_PK`) VALUES 
(1, 'some data for Bed',2), 
(2, 'some data for Couch',2); 
+1

Es gibt keine Daten in der Child-Tabelle!?!? – Strawberry

+0

@Strawberry, Ich habe die Frage bearbeitet, um einige Daten hinzuzufügen. Vielen Dank. – NoChance

+1

Sie fügen 3 Werte in 2 Spalten ein. Wie funktioniert das? – Strawberry

Antwort

1

kann ich nicht sehen Sie wirklich den Unterschied zwischen Ihrer Abfrage und diesem:

SELECT c.* 
    , y.nm 
    FROM t_child c 
    JOIN tlkp_parent x 
    ON x.pk = c.tlkp_parent_pk 
    JOIN tlkp_parent y 
    ON y.core_val = x.core_val 
WHERE y.lang_cd = 'FR'; 
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, eine prägnante und leicht verständliche Lösung zu finden. Sehr elegant in der Tat! – NoChance

1

Das Problem ist, dass die Tabelle P0 nicht in den SELECT erkannt wird, da sie nicht Teil der inner join ist, dies versuchen:

SELECT p0.*, (SELECT p1.nm 
    FROM mydb.tlkp_parent P1 
    where p1.lang_cd="FR" 
    AND 
    p1.CORE_VAL= 
    (
     select CORE_VAL 
     FROM mydb.tlkp_parent P2 WHERE 
     (p2.PK =P0.TLKP_Parent_PK) 
    )) as nm 
    FROM t_child P0 
where P0.TLKP_Parent_PK=2 
+1

Ausgezeichnet und clever, vielen Dank! – NoChance

+0

@NoChance Vorzüglich und schlau, vielleicht gibt es noch weitere Verbesserungsmöglichkeiten. – Strawberry

+0

@Strawberry, Jede Idee wäre in der Tat groß. Schlagen Sie vor, ich frage nach Optimierung in neuer Frage? – NoChance

Verwandte Themen