大学 SQL 课程,使用 John J. Patrick 所著的“SQL Fundamentals”一书。在第三章中,他谈到使用“常量表”向 select 语句添加列,其中所有行都具有相同的值。
例如,如果您有表“字符”,如下所示:
first_name last_name dept_code
----------- ---------- -------------------
Fred Flintstone ROCKS
Barney Rubble ROCKS
Wilma Flintstone FACEPALMING_AT_FRED
Run Code Online (Sandbox Code Playgroud)
并且您想要一个 SELECT 向所有行添加值为“BEDROCK”的列“hometown”,他建议在数据库中创建第二个表“temp”,
hometown
--------
BEDROCK
Run Code Online (Sandbox Code Playgroud)
然后做
SELECT first_name, last_name, dept_code, hometown FROM characters, temp
Run Code Online (Sandbox Code Playgroud)
这个想法是避免将字符串常量放在 SELECT 语句中,并且如果您有很多需要相同常量的 SELECT,更新一个表比更新 50 个查询更容易。
问题是,过去 15 年来我一直在使用 SQL 数据库,但我从未见过这种结构。它是我刚刚错过的完全常见的东西,还是在这个任务结束后我可以从我的记忆中抹去的东西?
Joe Celko 在他的几本书中提到了常量表。
他建议,如果使用添加了检查约束的表,以确保该表最多包含一行。
CREATE TABLE Constants
(
lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY CHECK (lock = 'X'),
pi FLOAT DEFAULT 3.142592653 NOT NULL,
e FLOAT DEFAULT 2.71828182 NOT NULL,
phi FLOAT DEFAULT 1.6180339887 NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
或者,视图可以用于类似的目的。
CREATE VIEW Constants
AS
SELECT *
FROM
(VALUES(3.142592653,
2.71828182,
1.6180339887)) V(pi,e,phi)
Run Code Online (Sandbox Code Playgroud)
不是我自己经常使用的东西,如果有的话,但总是值得考虑其他可能的技术。
您问题中的具体用例不是我会考虑的常量表。TBH 为每个人硬编码相同的“家乡”似乎是一个荒谬的要求。