【问题标题】:SQL query to select columns from subquery从子查询中选择列的 SQL 查询
【发布时间】:2020-11-16 17:48:33
【问题描述】:

我正在尝试开始使用到目前为止我不需要的子查询。如果我有这些表:

Books
--Id (Primary Key)
--Title (string)
--GenreId (Foreign Key)

Genre
--Id (Primary Key)
--Name (string)

我知道如果我想检索 Title 和 Name,那么我可以运行这个查询:

select b.Title, g.Name from Books b
join Genre g on b.GenreId=g.Id

我想做的是理解那和这之间的区别:

select b.Title from Books b
join (
    select g.Id, g.Name from Genre g
)
as ge
on b.GenreId=ge.Id
go

我想知道为什么第二个查询只给我 Books 中的 Title 列而不是 Genre 中的 Id 或 Name 列?我的问题实际上是如何将第一个查询变成子查询并检索相同的结果?我想要 Books 中的 Title 和 Genre 中的 Name。

【问题讨论】:

  • “我想知道为什么第二个查询只给了我 Books 中的 Title 列,而不是 Genre 中的 Id 或 Name 列” 你还能期望什么 @ 987654325@... 如果我让你从桌子上拿起“书”,那里有书、笔和纸本,然后问你“为什么不拿起笔和纸”你责备自己没有这样做?
  • 我期待这些结果来自内部的 select 语句。这就是问题的原因。
  • 我明白你在说什么,但是如果你说“拿起书,然后拿起笔和纸”,而我只是拿起了书,我们会想为什么我没有不要也拿起笔和纸。这就是我的问题和误解的重点。
  • 但这不是我问的,也不是你问的。
  • 我问为什么我的问题中的第二个查询没有给我所有的列。

标签: sql sql-server


【解决方案1】:

第二个查询只给你标题,因为这就是你所要求的。

最外面的select 描述了你得到的结果集。其他selects 用于处理逻辑,但不影响返回的列。

【讨论】:

  • 好的,我可以做同样的事情,但将第二个表中的列放在外部选择中吗?我还假设子查询的目的是使用 where 或其他某种逻辑?如果是这样,那么这个子查询的例子就没什么用了。
  • 根据这些信息,我解决了我的问题。谢谢。
【解决方案2】:

试试这个。

  select G.name, B.title from Books B left join Genre G On G.ID = B.GenreId

【讨论】:

  • 另一个答案解决了我的误解。我现在知道只有外部选择会获取列,而内部选择用于逻辑。我试图更好地理解子查询。
猜你喜欢
  • 2019-04-04
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多