显示外键是来自引用表的第二列的值的表

时间:2013-10-21 15:17:48

标签: sql postgresql database-design join naming-conventions

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

[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;

仅适用于workersdepartments我更喜欢更通用的内容:

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

其中#n - 外键的数量及其引用的表格因每个表而异。

1 个答案:

答案 0 :(得分:4)

不完全,至少没有使用复杂dynamic 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传播了这种反模式。

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

  

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

制作非常简单的代码:

SELECT *
FROM   worker
NATURAL JOIN department
但是,我几乎没用过这个。如果稍后更改表列并引入意外匹配,可能会成为陷阱。如果你的情况不能发生,那就去吧。

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

SELECT *
FROM   worker     
JOIN   department USING (department_id)

有一个closely related question on dba.SE recently.