gpt4 book ai didi

mysql - 通过主查询访问子查询中的表名

转载 作者:行者123 更新时间:2023-11-29 07:16:51 26 4
gpt4 key购买 nike

有一个表questions,其列service_table包含数据库中的另一个表名称。
我需要在子查询中访问此表名称:

SELECT * FROM `questions` AS `q` 
WHERE EXISTS
(SELECT *
FROM
`q`.`service_table` AS `ent1`
WHERE ent1.user_id = q.user_id)

运行此查询会导致错误:

table q.service_table does not exist

问题表架构:

id       user_id  service_type    service_id    title   description  
------ ------- -------------- ------------ ------ -----------
1 83 translates 1 nana hi there

翻译表(问题相关服务之一)架构:

  id      user_id  context
------ ------- --------------
1 83 something

最佳答案

i need to access this table name in a subquery

不可能。

在 SQL 的所有方言中,对于服务器在最初解析查询时必须理解的事物,都有一个明确定义的边界。它们不能“稍后”提供(例如,从行数据)。对象标识符就是其中之一——模式/表/列名称是在检查任何行之前建立的。

这里有一个替代方案,如果它看起来很粗略,那么这是因为您的设计非常规。

SELECT q.*
FROM questions q
WHERE CASE q.service_table
WHEN 'translates'
THEN EXISTS (SELECT * FROM translates x WHERE x.user_id = q.user_id)
WHEN 'typings'
THEN EXISTS (SELECT * FROM typings x WHERE x.user_id = q.user_id)
WHEN 'theses'
THEN EXISTS (SELECT * FROM theses x WHERE x.user_id = q.user_id)
ELSE NULL END;

更正确的设计是一个表,例如“service”,其中每个服务都有一个 id 和一个名称,以及一个表,例如“user_has_service”,其中有 user_id 和 service_id,两者都是主键。

然后在“问题”表中,使用 service_id。

SELECT * 
FROM question q
JOIN user_has_service h
ON h.user_id = q.user_id
AND h.service_id = q.service_id;

更简单,不是吗?这将表现更好,更容易维护,符合关系数据库设计的原则,并且您不需要为每个单独的服务单独的表。

关于mysql - 通过主查询访问子查询中的表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37686866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com