2014-03-27 123 views
0

我有一个Description表,其中包含某些说明以及一个唯一ID。我有另一个包含这个表的两个外键的表。到目前为止,我有以下查询:使用两个外键将两个表连接在一起

SELECT 
Description.description AS Description, 
Object.objID AS ID, 
Description.description AS Location 
FROM 
Object 
INNER JOIN 
Description 
ON 
Object.objDescID=Description.descID 
AND 
Object.objLocID=Description.descID; 

但是,这不工作,请有人指出我在正确的方向吗?

+1

不工作?有些错误? –

+0

你最后的'AND'条款需要修复 – SoulTrain

+1

Joe Meyer指出你正确的方向。他的回答基本上与我的一样。您需要**两个单独的引用来描述表。一个引用查询objDesc,另一个查找objLoc。在描述表的引用之一需要别名的情况下,可以区分它们。 – spencer7593

回答

2

如果我理解正确的,你想加入到说明表两次相同的对象。给这一个镜头,看看它是否让你你以后:

SELECT 
    Object.objID AS ID, 
    od.description AS Description, 
    ld.description AS Location 
FROM Object 
    INNER JOIN Description AS od 
    ON Object.objDescID=od.descID 
    INNER JOIN Description AS ld 
    ON Object.objLocID=ld.descID; 

编辑:一句忠告,如果你允许,你应该使用LEFT空外键JOIN而不是INNER JOIN,即如果其中一个为空,它不会保留整个记录不显示。

+0

+1。我们需要像处理两个**不同的**表一样处理'Description'表;我们从一个获得objDesc,并从另一个获得objLoc。 – spencer7593

+0

我现在得到错误ERROR 1054(42S22):'on子句'中的未知列'Description.descID' – JH95

+0

更新了查询以反映on子句中的别名表名 –

-1

我有一种感觉,那是因为表名

让这个尝试的:

SELECT 
D.description AS `Description`, 
O.objID AS `ID`, 
D.description AS `Location` 
FROM 
`Object` O 
INNER JOIN 
Description D 
ON 
O.objDescID=D.descID 
AND 
O.objLocID=D.descID; 
0

尝试运行这个(可能需要小的调整):

SELECT 
Description.description AS Description, 
Object.objID AS ID, 
Description.description AS Location 
FROM 
Object 
INNER JOIN 
Description AS Object.objDescID=Description.descID 
INNER JOIN 
Description AS Object.objLocID=Description.descID; 
+0

这是无效的语法。这种方法是正确的,我们需要**两个**描述表的引用,但是对查询所做的更改不够充分,对解释为什么进行更改的解释很短。 – spencer7593

0

看起来你需要引用到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其中之一。)

注意,如果外键列objDescIDobjLocID有一个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 

注意,但我倾向于分配短的别名在查询所有的行来源。这使得语句更易于辨认,而且如果我以后需要为已经使用的表添加另一个引用,或者需要用不同的表名或内联视图(或子查询)替换其中一个表名, ,我可以使别名保持不变,并更改行源。其他别名在语句的实际执行中没有任何区别,它们就在那里,因为我遵循相同的模式来进行简单的查询,以适应更复杂的查询。

+0

+1,比我自己的更详细的解释 –