【问题标题】:Select a bunch of data given a list of key给定键列表选择一堆数据
【发布时间】:2021-01-12 10:01:49
【问题描述】:

我刚开始学习SQL,遇到了一个问题。我对 SQL 完全陌生,我什至不知道用 Google 搜索哪些关键字来解决这个问题。

我有两张桌子:

  1. 表格
id | name
01 | abc
02 | ahb
03 | aen
04 | aev
05 | aca
06 | aee
07 | abc
08 | ahr

还有第二个:

  1. 表b
group | name_id
A     |    01
A     |    02
A     |    03
A     |    04
A     |    05
A     |    06
B     |    07
B     |    08

假设我想选择所有属于 A 组的名称。

我写了以下代码:

SELECT name FROM tablea WHERE id = (SELECT name_id from tableb WHERE group = "A");

但是,结果只给了我一行。

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: sql select subquery inner-join where-clause


【解决方案1】:

您必须使用IN 而不是=

SELECT name FROM tablea WHERE id IN (SELECT name_id from tableb WHERE group = "A");

【讨论】:

    【解决方案2】:

    对于您的示例数据,查询应该出错 - 因为子查询返回多于一行,这在此处不是预期的,因为您使用的是 =

    如果name_idtableb 中的唯一列,则join 是合适的:

    select a.name
    from tablea a
    inner join tableb b on b.name_id = a.id
    where b.group = 'A'
    

    否则,我会推荐exists

    select a.name 
    from tablea a
    where exists (select 1 from tableb b where b.name_id = a.id and b.group = 'A')
    

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2020-03-04
      • 2011-05-13
      相关资源
      最近更新 更多