多表搜索,带有限制子句和已知结果源表名称

Posted

技术标签:

【中文标题】多表搜索,带有限制子句和已知结果源表名称【英文标题】:Multiple Tables Search, with Limit Clause and Known Result Source Table Names 【发布时间】:2021-12-27 09:04:18 【问题描述】:

出现了一种情况,我必须从一个公共 id 中试探性地找出一个表名。这些表具有相同的确切结构,因此我认为 unionunion 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 查询

oracle中group by用法

《网站数据分析》8.8 使用TOP子句限制结果集

OutPut子句的使用限制

从带有 HAVING 子句的 MySQL 视图中选择返回空结果集

谷歌大查询限制子句返回太多行