来自同一个表的多个 INNER JOIN

Posted

技术标签:

【中文标题】来自同一个表的多个 INNER JOIN【英文标题】:Multiple INNER JOIN from the same table 【发布时间】:2012-03-11 08:13:57 【问题描述】:

我有一张金属表

MetalID    integer
MetalName  text
MetalCode  text

物品表

ItemID     integer
ItemName   text
...
Metal1     int Ref.-> metals.metalID
Metal2     int Ref.-> metals.metalID
Metal3     int Ref.-> metals.metalID

我正在尝试选择三个 MetalCodes

SELECT m.MetalCode as 'Metal1', m.MetalCode as 'Metal2',m.MetalCode as 'Metal3'
FROM Item as k
INNER JOIN Metals AS m ON m.metalID=k.metal1 
INNER JOIN Metals AS m ON m.metalID=k.metal2
INNER JOIN Metals AS m ON m.metalID=k.metal3
WHERE k.ItemID=?

看来我做错了。请帮忙。

【问题讨论】:

你不能有多个同名的别名。 你想达到什么目的? 【参考方案1】:

您应该为您的表格指定不同的别名。你都叫他们m。

SELECT m1.MetalCode as 'Metal1', m2.MetalCode as 'Metal2',m3.MetalCode as 'Metal3'
FROM Item as k
INNER JOIN Metals AS m1 ON m1.metalID=k.metal1 
INNER JOIN Metals AS m2 ON m2.metalID=k.metal2
INNER JOIN Metals AS m3 ON m3.metalID=k.metal3
WHERE k.ItemID=?

【讨论】:

很好,我们在完全相同的时间编写了完全相同的示例代码。应该是双胞胎。 +1,事实上:) 还是有问题。我得到结果 -> Zn,Zn,Zn 虽然有不同的金属 @Nathan 考虑到我们在没有测试的情况下在几秒钟内写下了这些答案,这是极有可能的。不过,这些示例应该能让您朝着正确的方向前进。 您的数据可能有问题,请检查 k.metail1,k.metal2,k.metal3 是否具有相同的值? 是的,那是真正的答案。几秒钟内有 7 个答案。【参考方案2】:

嗯,没有完全错。 ;)

无论您在哪里使用“INNER JOIN Metals AS m”,m 都必须是独一无二的(而不是每次都是 m)。

尝试这样的事情(未测试):

SELECT m1.MetalCode as 'Metal1', m2.MetalCode as 'Metal2', m3.MetalCode as 'Metal3'
FROM Item as k
INNER JOIN Metals AS m1 ON m1.metalID=k.metal1 
INNER JOIN Metals AS m2 ON m2.metalID=k.metal2
INNER JOIN Metals AS m3 ON m3.metalID=k.metal3
WHERE k.ItemID=?

【讨论】:

【参考方案3】:

试试这个:

SELECT m.MetalCode as 'Metal1', n.MetalCode as 'Metal2'o.MetalCode as 'Metal3'
FROM Item as k INNER JOIN Metals AS m ON m.metalID=k.metal1 
        INNER JOIN Metals AS n ON n.metalID=k.metal2
        INNER JOIN Metals AS o ON o.metalID=k.metal3
WHERE k.ItemID=?

【讨论】:

【参考方案4】:
SELECT m1.MetalCode as 'Metal1', m2.MetalCode as 'Metal2',m3.MetalCode as 'Metal3'
FROM Item as k
INNER JOIN Metals AS m1 ON m1.metalID=k.metal1 
INNER JOIN Metals AS m2 ON m2.metalID=k.metal2
INNER JOIN Metals AS m3 ON m3.metalID=k.metal3
WHERE k.ItemID=?

或更简单,但每行获取一个金属代码

SELECT MetalCode
FROM Item
WHERE metalID = metal1 OR metalID = metal2 OR metalID = metal3

【讨论】:

以上是关于来自同一个表的多个 INNER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

多个INNER JOIN子查询sql

来自第二个表的 MySQL INNER JOIN (TOP10)

C# SqlDataAdapter 与来自多个数据库的表的 JOIN

C# SqlDataAdapter 与来自多个数据库的表的 JOIN

SQL_连接(Join),内部连接(INNER JOIN),左连接(LEFT JOIN ),右连接(RIGHT JOIN)完整外部连接(FULL OUTER JOIN),自连接(Self JOIN)(

外连接(left join、full join、right join)与内连接(inner join)的区别