2017-03-02 70 views
0

下面的查询有效。我想用列名P0.TLKP_Parent替换最内层查询中的字面值“2”。当我这样做,我得到一个语法错误:执行关联的正确方法

错误代码:1054未知列“P0.TLKP_Parent_PK”在“where子句”

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 

如何解决这一问题? 有没有更好的方法来写这个查询?

谢谢。 注: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

子表中没有数据!?!? – Strawberry

+0

@Strawberry,我编辑了这个问题来添加一些数据。谢谢。 – NoChance

+1

您可以将3个值插入2列。这是如何运作的? – Strawberry

回答

1

我不能真的看到你的查询和这个之间的区别:

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

非常感谢您花时间提供简洁易读的解决方案。确实非常优雅! – NoChance

1

的问题是,该表P0SELECT无法识别,因为它不是inner join的一部分,试试这个:

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

非常棒,非常感谢! – NoChance

+0

@NoChance可能是非常出色和聪明的,可能还有进一步的改进空间。 – Strawberry

+0

@Strawberry,任何想法都会很棒。你是否建议我在新问题中要求优化? – NoChance