【问题标题】:SQL Query: Join (or select) 2 columns from 1 table with 1 column from another table for a view without extra join columnsSQL 查询:将 1 个表中的 2 列与另一个表中的 1 列连接(或选择)以获得没有额外连接列的视图
【发布时间】:2020-10-13 03:38:17
【问题描述】:

这是我在 Stackoverflow 上的第一篇文章,如果我的问题格式不正确,我深表歉意。我用我的头撞墙,我确信这是一个简单的问题。我有一张包含一堆事件信息的表格,大约有 10 列:

表:event_info

date        location_id   lead_user_id   colead_user_id   attendees   start   end   <and a few more...>
------------------------------------------------------------------------------------------------
2020-10-10       1           3             1                  26       2100    2200     .
2020-10-11       3           2             4                  18       0600    0700
2020-10-12       2           5             6                  6        0800    0900

还有一张包含用户信息的表格:

表:用户

user_id      user_name     display_name     email     phone     city
----------------------------------------------------------------------
1            Joe S           goofball        ...
2            John T          schmoofball     ...
3            Jack U          aloofball       ...
4            Jim V           poofball        ...
5            Joy W           tootball        ... 
6            George A        boring          ...

我想创建一个只包含信息子集的视图,而不是完整的表连接。事件表lead_user_idcolead_user_id 列都引用users 表中的user_id 列。

我想创建一个这样的视图:

date         Location      Lead Name      CoLead Name     attendees
---------------------------------------------------------------------
2020-10-10      1           Jack U          Joe S           26
2020-10-11      3           John T          Jim V           18
2020-10-12      2           Joy W           George A        6

我已经尝试了以下和几次类似的迭代都无济于事......

SELECT 
    E.date, E.location, 
    U1.display_name AS Lead Name, 
    U2.display_name AS CoLead Name. 
    E.attendees
FROM
    users U1, event_info E
INNER JOIN 
    event_info E ON U1.user_id = E.lead_user_id
INNER JOIN 
    users U2 ON U2.user_id = E.colead_user_id

我得到了可怕的

您的 SQL 语法有错误

消息。我并不感到惊讶,因为我真的只在单列或嵌套选择语句上使用过连接......这两个指向一个的列让我陷入循环。救命!

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格式作为代码输入。 How to Ask 暂停整体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。
  • PS 你有一个语法错误。阅读语法和手册。显示组成子表达式是可以的。当确定这将是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。
  • 你使用同一个别名两次,例如
  • Mixing implicit and explicit JOINs 的可能重复逗号表示交叉连接,但优先级低于关键字 JOIN。因此,首先完成 JOIN ON 并且在那里不知道逗号的左表。所以不要将逗号与关键字连接混合使用。 (如果你砍掉你的代码,你会得到 select * from u1 ,ea join eb on c。现在看看重复的标题。)
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用。并且混合这两种样式 - 在逗号分隔的FROM 中有两个表格,而两个更合适的JOIN s - 真的 是一种非常糟糕的做法!跨度>

标签: sql join select view


【解决方案1】:

对此事的正确查询

SELECT 
    E.date, E.location, 
    U1.display_name AS Lead Name, 
    (select display_name from users  where user_id=E.colead_user_id) AS CoLead Name, 
    E.attendees
FROM
    event_info E
INNER JOIN 
     users U1 ON U1.user_id = E.lead_user_id

【讨论】:

  • 谢谢@Iman。我大大简化了上面的示例问题,但您的回答正是我需要弄清楚的。
  • 您的威康,请点击真实答案图标回答
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 2021-09-22
  • 2019-06-22
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多