如何在代码中创建一个“硬编码”的小 SQL 连接表?

Posted

技术标签:

【中文标题】如何在代码中创建一个“硬编码”的小 SQL 连接表?【英文标题】:How to create a "hard-coded" small SQL join table in code? 【发布时间】:2021-03-30 23:01:37 【问题描述】:

上下文:我无法创建/更新/编辑相关表格。

我尝试通过 Tableau 中的手动 SQL 查询加入两个表。每个表中都有一个列可以用来将表链接在一起,但我需要第三个表(不存在)来链接它们。

我只想链​​接 6 个值,我希望有一些方法可以在 SQL 中声明一个“内存中”表或类似的表来连接这些表。

例如 - 我想将这两个表连接在一起:

表 1

name value
place 1 14
place 2 10
place 3 100

表 2

identifier property
superstore awesome
hospital bad
port great

我可以以某种方式将以下“表”硬编码到 SQL 代码中以加入它们吗?

硬编码表

name identifier
place 1 hospital
place 2 port
place 3 superstore

应该产生以下结果:

name identifier value property
place 1 hospital 14 bad
place 2 port 10 great
place 3 superstore 100 awesome

如果我可以使用上面的链接创建一个新表,我会的,但我不能。

如果相关 - 这是使用 Oracle 数据库。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以使用SELECT ... FROM DUALUNION ALL 创建数据。

它可以进入子查询分解 (WITH) 子句:

WITH hard_coded_table ( name, identifier ) AS (
  SELECT 'place 1', 'hospital' FROM DUAL UNION ALL
  SELECT 'place 2', 'port' FROM DUAL UNION ALL
  SELECT 'place 3', 'superstore' FROM DUAL
)
SELECT t1.*,
       t2.*
FROM   Table1 t1
       INNER JOIN hard_coded_table h
       ON ( t1.name = h.name )
       INNER JOIN table2 t2
       ON ( t2.identifier = h.identifier );

或者只是作为一个子查询:

SELECT t1.*,
       t2.*
FROM   Table1 t1
       INNER JOIN (
        SELECT 'place 1' AS name, 'hospital' AS identifier FROM DUAL UNION ALL
        SELECT 'place 2', 'port' FROM DUAL UNION ALL
        SELECT 'place 3', 'superstore' FROM DUAL
       ) h
       ON ( t1.name = h.name )
       INNER JOIN table2 t2
       ON ( t2.identifier = h.identifier );

其中,对于您的示例数据:

CREATE TABLE Table1 ( name, value ) AS
SELECT 'place 1',  14 FROM DUAL UNION ALL
SELECT 'place 2',  10 FROM DUAL UNION ALL
SELECT 'place 3', 100 FROM DUAL;

CREATE TABLE Table2 ( identifier, property ) AS
SELECT 'superstore', 'awesome' FROM DUAL UNION ALL
SELECT 'hospital',   'bad' FROM DUAL UNION ALL
SELECT 'port',       'great' FROM DUAL;

两个输出:

姓名 |价值 |标识符 |财产 :-------- | ----: | :--------- | :-------- 地点 3 | 100 |超市|惊人的 地点 1 | 14 |医院|坏的 地点 2 | 10 |港口|伟大的

db小提琴here

【讨论】:

非常感谢您!我显然不知道这是一件事。我将对其进行测试并尽快将其标记为已回答。出于好奇,Postgres 中是否存在类似于dual 的内容? @Brandon 是的,只需删除 FROM DUAL 并使用 SELECT 而不使用表 db<>fiddle。大多数 RDBMS 中都存在类似的情况。 我希望我能不止一次地支持你。英雄。

以上是关于如何在代码中创建一个“硬编码”的小 SQL 连接表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在最终的 TreeSet 中创建硬编码的不区分大小写的值,以便只有“香蕉”而不是“香蕉”作为另一个值 [重复]

从 Python Lambda 函数连接 Athena SQL 查询中的变量

如何在 MySQL 中创建链接表或镜像表

在SQL Server中创建标识表和开发项目表

在 SQL 中创建连接函数

如何使用多个 for 循环在 php 中创建 sql 语句