多表搜索,带有限制子句和已知结果源表名称
Posted
技术标签:
【中文标题】多表搜索,带有限制子句和已知结果源表名称【英文标题】:Multiple Tables Search, with Limit Clause and Known Result Source Table Names 【发布时间】:2021-12-27 09:04:18 【问题描述】:出现了一种情况,我必须从一个公共 id 中试探性地找出一个表名。这些表具有相同的确切结构,因此我认为 union 或 union all 将按照此处的一些答案的建议工作。问题是,对查询应用 limit 子句 效果不佳。如果我将它应用于多个选择查询,它会失败;如果在一个上,它只会将该表作为主表进行过滤。即使 包装它 如下所示也不会产生所需的结果 - 即:将每个单独查询的返回结果限制为一行。
重申问题:我如何知道已知表的列表是否具有特定值(命名列)?
open 选项将良好的表源作为别名提供,但禁止多个限制;结果可能很多:
SELECT `ID`, `BATCH_NUMBER`, 'TBL1' AS 'table_one' FROM `table_one` WHERE `NAMED_ID` = '123'
UNION ALL
SELECT `ID`, `BATCH_NUMBER`, 'TBL2' AS 'table_two' FROM `table_two` WHERE `NAMED_ID` = '123'
UNION ALL
SELECT `ID`, `BATCH_NUMBER`, 'TBL3' AS 'table_three' FROM `table_three` WHERE `NAMED_ID` = '123'
仅在第一个表结果上找到包装选项过滤器;我们需要所有具有该值的表。
select * from (
SELECT `ID`, `BATCH_NUMBER`, 'TBL1' AS 'table_one' FROM `table_one` WHERE `NAMED_ID` = '123'
UNION ALL
SELECT `ID`, `BATCH_NUMBER`, 'TBL2' AS 'table_two' FROM `table_two` WHERE `NAMED_ID` = '123'
UNION ALL
SELECT `ID`, `BATCH_NUMBER`, 'TBL3' AS 'table_three' FROM `table_three` WHERE `NAMED_ID` = '123'
) as resutl_table
LIMIT 1
【问题讨论】:
minimal reproducible example 会让事情变得更清晰。你想要什么结果? “失败”是什么意思? 您只想要包含表中行或整行的表名吗? @jarlh;这是我的第一个问题,我认为这个问题已经足够冗长了。它在这里失败意味着 mysql 将抱怨在具有连续限制子句的行附近存在语法错误。 @forpas,只有一个包含表列表的数组;仅限表名。 这个问题已经被@forpas解决了,如下图;第一个选项经过测试并且工作正常。谢谢大家。 【参考方案1】:如果您只需要表名,那么您的每个查询都应该只返回第一列:
SELECT 'TBL1' AS table_name FROM `table_one` WHERE `NAMED_ID` = '123'
UNION
SELECT 'TBL2' AS table_name FROM `table_two` WHERE `NAMED_ID` = '123'
UNION
SELECT 'TBL3' AS table_name FROM `table_three` WHERE `NAMED_ID` = '123'
或者,以逗号分隔的字符串形式获取结果:
SELECT GROUP_CONCAT(table_name) AS table_names
FROM (
SELECT 'TBL1' AS table_name FROM `table_one` WHERE `NAMED_ID` = '123'
UNION
SELECT 'TBL2' AS table_name FROM `table_two` WHERE `NAMED_ID` = '123'
UNION
SELECT 'TBL3' AS table_name FROM `table_three` WHERE `NAMED_ID` = '123'
) t
UNION
将过滤掉重复项。
【讨论】:
我刚刚测试了第一个选项并且它有效;正是我过去 6 个小时一直在寻找的东西。非常感谢。以上是关于多表搜索,带有限制子句和已知结果源表名称的主要内容,如果未能解决你的问题,请参考以下文章
不使用带有 order 子句和更大限制 MariaDB 的索引的简单 SQL 查询