【问题标题】:How to use nested SELECT statements in sql?如何在 sql 中使用嵌套的 SELECT 语句?
【发布时间】:2016-10-22 23:48:08
【问题描述】:

我有两张桌子

+------+--------------+--------+----------+
| bkey | bname        | nochap | b_id     |
+------+--------------+--------+----------+
|    1 | Let Us C     |     17 | luc13    |
|    2 | OOP with C++ |     17 | oopwcpp6 |
+------+--------------+--------+----------+

luc13

+------+-----------------+---------+
| cnum | cname           | c_id    |
+------+-----------------+---------+
|    1 | Getting Started | luc13gs |
|    2 | C Instructions  | luc13ci |
+------+-----------------+---------+

所以,你可以看到第二个表的表名(luc13)是第一个表book的元素。所以在显示第二个表时,我不想指定它的名称,所以我写了查询

SELECT * FROM (SELECT b_id FROM book WHERE bkey = 1)

并显示错误,

错误 1248 (42000):每个派生表都必须有自己的别名

于是我搜索了一下,又写了一次查询

SELECT * FROM (SELECT b_id FROM book WHERE bkey = 1 AS custom)

现在错误已消除,但输出仍然是

+-------+
| b_id  |
+-------+
| luc13 |
+-------+

所以我认为只有SELECT b_id FROM book WHERE bkey = 1 被执行。 那么有什么方法可以显示我的表 luc13 而无需直接指定其名称?

【问题讨论】:

  • 是的。我读了所有这些。我还是不知道你想要什么。
  • 我想显示我的第二个表而不直接指定它的名称,这意味着它的名称应该来自表 1,通过使用嵌套的 SELECT 语句,但它没有工作
  • 是的,动态 SQL 是您的最佳选择。
  • 你能告诉我查询吗

标签: mysql alias derived-table nested-select


【解决方案1】:

您必须为此使用prepared statement

SET @s := CONCAT('SELECT * FROM ', (SELECT b_id FROM book WHERE bkey = 1));

PREPARE stmt FROM @s;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

【讨论】:

  • 感谢 Betsos,它运行良好,但我仍然想了解一些知识,这是字符变量 @s 吗?,您存储了查询。这些语句是动态 sql 的一部分还是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多