【问题标题】:How many rows can the following SQL query return?下面的 SQL 查询可以返回多少行?
【发布时间】:2020-02-16 20:39:12
【问题描述】:

sql。有一个包含 N 行的 id 字段(可选唯一)的表 T。下面的 SQL 查询可以返回多少行?

select * from T
inner join (
    select count(*) as cnt from T 
    union all select count(*) as cnt from T
) as TA on TA.cnt = T.id
inner join (
    select count(*) as cnt from T 
    union select count(*) as cnt from T
) as TB on TB.cnt = T.id;

我有一些选择:

  • 只有 N 行

  • 从 0 到 N 行

  • 从 2N 到 4N 行

或者你能说出一些其他的选择吗?

【问题讨论】:

  • 如果不知道T表的schéma,没有人可以确定。id是如何生成的......
  • 考虑一下:select * from T inner join (one_row) inner join (two_rows)。现在,如果 假定 T.id 是唯一的.. 那应该达到一些界限。让它“可选地”唯一会改变答案:选择它是否是唯一的。
  • 什么是“TA.cnt = T.id”或“TB.cnt = T.id”?对吗?
  • @db1975 是的
  • 它只能是 0 到 2,因为 ta 和 TB 一样最多有两行,每行都可以匹配 T 中的 id

标签: mysql sql join group-by count


【解决方案1】:

此查询不返回任何行或返回 2 行(所有三列具有相同的值)。

理由:

  • union all 子查询(别名为 TA)返回 2 行,每行包含相同的值,即 T 中的记录数。

  • union 子查询对其结果进行去重并返回一条记录,其中还包含表的行数

  • 接下来会发生什么取决于表中是否存在id 等于该数字的记录。

    • 如果存在这样的记录,则查询返回 2 行:union all 子查询生成的每一行。

    • 如果没有这样的记录,则查询根本不返回任何行。

所以假设这个数据集:

id
--
1
2

表中有两行,id 2 存在,因此查询为您提供了具有该 ID 的两行。

如果我们将其更改为:

id
--
1
2
3
5

有四行但不是id4。查询为空。

【讨论】:

  • 那里有小错误。您说“每个union all 查询”,但只有一个 union all。另一个是一个普通的union,由于两边是一样的,所以总是会返回正好1行。
  • 我仍然得到 4 行。 T 一行,值为 2,子查询 1 乘以 2,子查询 2 乘以 2。
  • 现在我看到了 union [distinct]...是的,它是 2 行。
  • @jarlh:是的,你的 cmets 是对的。 Bohemian 的观点确定了答案并使其与您的测试保持一致。
【解决方案2】:

如果 T.Id 不包含值 2,则为 0 行。 2 行 id T.Id 包含值 2

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多