当前位置: 首页 > 面试题库 >

搜索多个表,并在结果行中显示表名

阚正真
2023-03-14
问题内容

如何构造一个SQL语句以跨多个平面无关表运行,并显示结果以及选择结果和结果的表名。

这种情况是这样的,我有几个表,每个表具有相同的列名。这是我从外部各方收到的数据,它们原样存储在不同的表中。

相同的表如下所示:

Table 1: pid, parent_name, student_name, student_number, class_name, columnN
Table 2: pid, previous_school, previous_school, student_number, columnN
Table 3: pid, student_name, student_number, parent_name, column4, columnN
Table 14: pid, student_number, parent_name, column4, columnN
Table N: pid, previous_school, parent_name, column4, columnN

我需要一个SQL语句,该语句可student_name在所有表中使用伪代码进行搜索:for each table, find a student named john doe and return to me the row where you got the result and the table where you found the result

在以下演示文稿中给出结果:

john doe, Table 1, pid
john doe, Table 9, pid

更复杂的是,该列student_name可能不在所有表中,因此,如果在该表中找不到该列,则需要仔细进行查询。


问题答案:

您正在寻找动态SQL。从系统目录中自动组装您的查询:

SELECT string_agg('SELECT student_name, '''
                   || c.oid::regclass || ''' AS tbl, pid FROM '
                   || c.oid::regclass
                   || $$ WHERE student_name = 'John Doe'$$
                 , E'\nUNION ALL\n')
FROM   pg_namespace n
JOIN   pg_class     c ON c.relnamespace = n.oid
WHERE  n.nspname = 'public'         -- schema name where your tables lie
AND    c.relname LIKE 't%'          -- and / or filter table names
AND    EXISTS (
   SELECT 1 FROM pg_attribute 
   WHERE  attrelid = c.oid
   AND    attname = 'student_name'  -- make sure column exists
   AND    NOT attisdropped          -- and is alive
   );

产生查询字符串

SELECT student_name, 'tbl1' AS tbl, pid FROM tbl1 WHERE student_name = 'John Doe'
UNION ALL
SELECT student_name, 'tbl2' AS tbl, pid FROM tbl2 WHERE student_name = 'John Doe'
UNION ALL
SELECT student_name, 'tbl3' AS tbl, pid FROM tbl3 WHERE student_name = 'John Doe'
...

然后在第二个调用中运行它,或者使用来使用PL /
pgSQL函数完全自动化它EXECUTE。示例:
从表中选择一组动态列,并获取每个列的总和

该查询生成带有经过清理的标识符的 安全
代码,以防止SQL注入。
oid::regclass这里的解释。)

还有更多相关答案。使用搜索。

顺便说一句,LIKEstudent_name LIKE 'John Doe'没有意义。如果没有通配符,请使用=



 类似资料:
  • 问题内容: 如何突出显示使用php的mysql查询的搜索结果? 这是我的 [修改] 代码: 问题答案: 您可以使用preg_replace();,当它在文本中找到匹配项时,您可以在匹配词周围放置一个带有突出显示类别的div。然后,您可以向突出显示类添加背景颜色和边框,以使其突出显示 preg_replace期望3个参数; 第一个是您要寻找的 第二个是应该更改为 他应从中搜索并替换的文本字符串 例如

  • 问题内容: 我正在使用ui-bootstrap typeahead。效果很棒!但是,我想知道是否有可能在结果列表中显示多个属性甚至HTML。典型问题:搜索返回多个具有相同值的对象。例如,搜索“令人惊叹的宽限期”返回[“令人惊叹的宽限期”,“令人惊叹的宽限期”],其中一个是电影,一个是歌曲。我希望结果列表更像: …,以便用户确切知道他们在选择什么。更好的是标题旁边的图标。换句话说,列表中的每个结果都

  • 我已经花了很多时间弄清楚为什么我的搜索在我定制的模板中不起作用。到目前为止,我已经知道了如何包含searchform。php文件在我的头,创建搜索。php文件目前是空的(因此,当我搜索某个内容时,我会被重定向到一个空白页面,我想我肯定需要search.php文件中的某些内容才能使其正常工作),我阅读了Wordpress codex的所有内容,但找不到解决方案,我找到的唯一有用信息是这个。 http

  • 问题内容: 我需要能够使用一个简单的搜索来搜索数据库的SQL查询。这是我的表格现在的样子: 我将如何去做呢?这是我尝试过的一些SQL查询,但是我的问题是它返回了大量数据。例如,如果我搜索像Snoop Dogg这样的艺术家,即使没有专辑名称,它也会为他所拥有的每张专辑和每首歌曲返回一行。 编辑: 这是一个示例数据库; 因此,我想搜索“ snoop”以仅返回艺术家“ Snoop Dogg”。但随后进行

  • 当跨多个索引进行搜索时,elasticsearch的“多重匹配”查询将返回搜索结果中的索引名称。 响应包含字段,该字段告诉结果来自的索引 spring-data-elasticsearch中用于的类是和具有字段、、用于获取与elasticsearch查询相似的数据。但它不包含用于存储字段信息的相关字段。 还支持吗?我需要根据哪个客户端应用程序将生成一些URL发送搜索命中类型(name)。 这是我使

  • 我使用Elastic5.4,想要查询包含多种类型文档的索引。(类型a和类型b)。下面是索引中的示例文档: 文件: 映射: 我的查询是在任何类型的任何字段中搜索所有包含“John”的文档,并突出显示找到匹配的字段。这个查询是按照弹性文档构造的。我的模式映射将ngram_analyzer配置为分析器,而不是模式中所有字符串类型字段的默认分析器。 如何在结果中返回高亮显示?