是否可以编写这样的通用查询?通用我的意思是我不需要键入作为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;
仅适用于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
其中#n
- 外键的数量及其引用的表格因每个表而异。
答案 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
:
NATURAL
是USING
列表的简写,提及了所有列中的列 两个具有相同名称的表。
制作非常简单的代码:
SELECT *
FROM worker
NATURAL JOIN department
但是,我几乎没用过这个。如果稍后更改表列并引入意外匹配,可能会成为陷阱。如果你的情况不能发生,那就去吧。
至少你可以使用更简单的JOIN语法和USING
:
SELECT *
FROM worker
JOIN department USING (department_id)