如何在代码中创建一个“硬编码”的小 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 DUAL
和UNION 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 中创建硬编码的不区分大小写的值,以便只有“香蕉”而不是“香蕉”作为另一个值 [重复]