gpt4 book ai didi

sql - 显示表,其中外键是引用表第二列的值

转载 作者:行者123 更新时间:2023-11-29 12:38:04 25 4
gpt4 key购买 nike

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

[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 - 外键的数量及其引用的表,每个表都不同。

最佳答案

不完全是,至少不是没有使用复杂的函数 dynamic SQL .

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

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

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

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

NATURAL is shorthand for a USING list that mentions all columns in the two tables that have the same names.

制作非常简单的代码:

SELECT *
FROM worker
NATURAL JOIN department

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

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

SELECT *
FROM worker
JOIN department USING (department_id)

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

关于sql - 显示表,其中外键是引用表第二列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19498400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com