【问题标题】:SQL - Inner join on two columns from table 1 with one column from table 2?SQL - 表1中的两列与表2中的一列的内部连接?
【发布时间】:2012-10-11 22:20:15
【问题描述】:

我有一个表,它有两列,每列都包含一个成员 ID,它是包含其名称的成员表的外键。我想选择第一个带有名称而不是成员 ID 的表。我不确定这样做的方法。我觉得肯定有一种涉及 INNER JOIN 的方法,但我想不出如何在一个 INNER JOIN 中从一个表中选择两个名称。有什么想法吗?

提前致谢!

匹配表

|------|-------|
| user | match |
|------|-------|
| 1    | 4     |
| 2    | 1     |
| 3    | 2     |
|------|-------|

成员表

|------|-------|
| user | name  |
|------|-------|
| 1    | Joe   |
| 2    | Kyle  |
| 3    | John  |
| 4    | Nate  |
|------|-------|

期望的输出

|------|-------|
| user | match |
|------|-------|
| Joe  | Nate  |
| Kyle | Joe   |
| John | Kyle  |
|------|-------|

【问题讨论】:

  • 不,您不能一次加入。您将需要一个对Match 的引用,以及两个Member 的引用。这给你一个提示吗?

标签: sql inner-join


【解决方案1】:

你应该加入会员表两次。

SELECT M1.NAME , M2.NAME
FROM MEMBERS M1
INNER JOIN MATCH M
   ON M1.USER = M.USER
INNER JOIN MEMBERS M2
   ON M2.USER = M.MATCH

如果您的数据库是 mysql,请注意低位和高位标识符。

【讨论】:

  • 我正在尝试在我目前遇到的问题中使用此示例,但我无法弄清楚所有 Ms 是什么,请您对代码进行更详细的描述吗?
【解决方案2】:

您也可以通过外部应用执行此操作:http://sqlfiddle.com/#!3/8f932/5

SELECT me.name as 'User',
  mem.name as 'Match'
FROM Match m
OUTER APPLY(
  SELECT me.name
  FROM Members me
  WHERE me.id = m.match
)mem
LEFT JOIN Members me on me.id = m.id

或者:http://sqlfiddle.com/#!3/8f932/6

SELECT me.name as 'User',
  mem.name as 'Match'
FROM Match m
LEFT JOIN Members mem on mem.id = m.match
LEFT JOIN Members me on me.id = m.id

【讨论】:

    【解决方案3】:

    你可以做两个连接:

    SELECT u1.name, u2.name
    FROM members u1
    INNER JOIN match m
    ON u1.user = m.user
    INNER JOIN members u2
    ON u2.user = m.match
    

    【讨论】:

      猜你喜欢
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多