我有一个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;
然而,这是不工作,请有人能指出我在正确的方向?
如果我理解正确的话,您想为同一对象两次加入Description表。试一试,看看它是否能让你得到你想要的:
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,这样,如果其中一个是空的,它不会保持整个记录显示
试着运行这个(可能需要稍作调整):
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;
看起来您需要两个对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
我们为获取Description
值的源指定短别名d
。
我们为获取Location
值的源指定短别名l
。
我们使用短别名而不是表名来引用每个表中的列。
从本质上讲,可以把对Description
表的引用看作是两个不同的表,尽管它们实际上是同一个表。
注意,我们必须为Description的至少一个引用分配别名,以便我们可以区分它们。(否则,如果我们只说Description.description
, MySQL将不知道我们在谈论哪个。)
请注意,如果外键列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
注意,实际上只需要一个别名,但我倾向于为查询中的所有行源分配短别名。这使语句更易于理解,并且在以后需要向已使用的表添加另一个引用时,或者需要用不同的表名或内联视图(或子查询)替换其中一个表名时,确实很有帮助,我可以保持别名不变,只更改行源。其他别名在语句的实际执行中没有任何区别,它们只是在那里,因为我对简单查询遵循的模式与对更复杂查询遵循的模式相同。