【问题标题】:Multiple INNER JOIN from the same table来自同一个表的多个 INNER JOIN
【发布时间】: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=?

看来我做错了。请帮忙。

【问题讨论】:

  • 你不能有多个同名的别名。
  • 你想达到什么目的?

标签: sql sqlite join inner-join


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2015-02-14
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        相关资源
        最近更新 更多