1

是否可以编写这样一个通用查询?通用是指我不需要键入作为外键的列名,这样我就可以将此查询用于其他表。简单的例子:

[table workers]
ID [PK] | worker | department [FK]
--------+--------+-----------
1       | Smith  | 2

[table departments]
ID [PK] | department
--------+------------+
1       | Paris      |
2       | Oslo       |

查询后SELECT/JOIN会显示为:

ID [PK] | worker | department [FK]
--------+--------+-----------
1       | Smith  | Oslo

但不是写:

SELECT workers.ID, workers.worker, departments.department
FROM workers JOIN departments ON workers.department = departments.ID;

这仅适用于workers并且departments我更喜欢更通用的东西,例如:

SELECT * FROM [tableName] JOIN [referenced table#1], 
[referenced table#2]...[#n] 
ON [tableName].FK#1 = [referenced table#1].[2nd column], 
[tableName].FK#2 = [referenced table#2].[2nd column]...#n

where #n- 外键及其引用表的数量,每个表都不同。

4

1 回答 1

4

不完全是,至少不是没有使用复杂动态 SQL的函数。

但是通过适当的命名约定,您可以按照以下方式简化事情:

[table worker]
worker_id [PK] | worker | department_id [FK]
----------------+--------+-----------
1               | Smith  | 2
[table department]
department_id [PK] | department
---------------------+------------
1                    | Paris
2                    | Oslo

使用id作为列名通常是一个非常糟糕的主意。它不是描述性的。不幸的是,一些 ORM 传播了这种反模式。

现在,如果只有在 JOIN 的左侧和右侧应该有的列具有匹配的名称,那么您可以使用一个很少使用的标准 SQL 功能NATURAL JOIN

NATURALUSING是提及两个表中具有相同名称的所有列的列表的简写。

制作非常简单的代码:

SELECT *
FROM   worker
NATURAL JOIN department

不过,我几乎从不使用这个。如果您稍后更改表列并引入意外匹配,它可能会成为一个陷阱。如果这在你的情况下不能发生,那就去吧。

至少您可以使用更简单的 JOIN 语法USING

SELECT *
FROM   worker     
JOIN   department USING (department_id)

最近在 dba.SE 上有一个密切相关的问题。

于 2013-10-21T16:01:38.297 回答