看起来你需要引用到Description
表。每个引用将使用外键列中的一个加入。
例如:
SELECT o.objID AS `ID`
, d.description AS `Description`
, l.description AS `Location`
FROM Object o
JOIN Description d
ON d.descID = o.objDescID
JOIN Description l
ON l.descID = o.objLocID
我们给予短期别名d
来我们从Description
价值的源泉。
我们将短别名l
分配给源,我们从中得到Location
值。
我们使用短别名而不是表名引用每个表中的列。
从本质上讲,尽管它是真正的同一个表,但是它的表格的引用实际上是两个不同的表格。
请注意,我们必须为描述的至少一个引用指定一个别名,以便我们可以区分它们。 (否则,MySQL不会知道我们在谈论如果我们刚才说Description.description
其中之一。)
注意,如果外键列objDescID
或objLocID
有一个NULL值,或匹配值不存在被引用的表,查询将不会返回来自Object的行。
为了确保即使未找到匹配值,您也可以从Object中获得一行,可以通过包含LEFT
关键字来使用OUTER
连接操作。
例如:
只有一个别名是实际需要
SELECT o.objID AS `ID`
, d.description AS `Description`
, l.description AS `Location`
FROM Object o
LEFT
JOIN Description d
ON d.descID = o.objDescID
LEFT
JOIN Description l
ON l.descID = o.objLocID
注意,但我倾向于分配短的别名在查询所有的行来源。这使得语句更易于辨认,而且如果我以后需要为已经使用的表添加另一个引用,或者需要用不同的表名或内联视图(或子查询)替换其中一个表名, ,我可以使别名保持不变,并更改行源。其他别名在语句的实际执行中没有任何区别,它们就在那里,因为我遵循相同的模式来进行简单的查询,以适应更复杂的查询。
不工作?有些错误? –
你最后的'AND'条款需要修复 – SoulTrain
Joe Meyer指出你正确的方向。他的回答基本上与我的一样。您需要**两个单独的引用来描述表。一个引用查询objDesc,另一个查找objLoc。在描述表的引用之一需要别名的情况下,可以区分它们。 – spencer7593