gpt4 book ai didi

sql - 为什么不在 SQL 中使用 JOIN ON 关键字来搜索并强制每条记录最多有一个匹配项?

转载 作者:行者123 更新时间:2023-12-05 07:52:23 25 4
gpt4 key购买 nike

我在写 SQL 的时候经常遇到这种情况。我有两个表,它们之间是一对一的关系,我希望我可以在查询中轻松断言这一事实​​。例如,简化查询:

SELECT Person.ID, Person.Name, Location.Address1
FROM Person
LEFT JOIN Location ON Person.LocationID = Location.ID

当我读到这个查询时,我在想,如果 Location 表未能在其 ID 列上强制执行唯一性怎么办?突然之间,您可能会在结果集中多次出现同一个人。当然,我可以查看架构以确保它是独一无二的,这样一切都会好起来的,但是为什么我不能简单地将它放在我的查询中,a la:

SELECT Person.ID, Person.Name, Location.Address1
FROM Person
LEFT JOINONE Location ON Person.LocationID = Location.ID

不仅像这样的关键字(由“JOINONE”组成)使阅读此查询的人 100% 清楚我们保证为每个 Person 记录准确获取一行,而且它让数据库引擎优化其执行计划,因为它知道每个匹配项不会超过一个,即使外键关系未在架构中定义。

这样做的另一个好处是数据库引擎可以强制执行它,因此如果数据确实有多个匹配项,则可能会抛出错误。这已经发生在子查询上,例如:

SELECT Person.ID, Person.Name
, (
SELECT Location.Address1
FROM Location
WHERE Location.ID = Person.Location
) AS Address1
FROM Person

这很好,很漂亮,人类读者 100% 清楚,可以巧妙地优化,并由数据库引擎强制执行。事实上,出于所有这些原因,我经常以这种方式结束做事​​。问题是,除了令人分心的语法之外,您只能通过这种方式选择一个字段。 (如果我也想要 City、State 和 Zip 怎么办?)如果您可以将此表与您的其余 JOIN 一起流动并从中选择您希望在 SELECT 子句中的任何字段,就像其他所有字段一样,那该有多好你的 table 。

我在 StackOverflow 周围找不到任何其他类似的问题,尽管我确实发现了很多重复的接近问题:人们想要选择一条记录。接近但确实是一种完全不同的目标,在我看来意义不大。

我发布这个问题是为了看看 SQL 语言中是否已经存在某种我遗漏的机制,或者是否有人提出了有效的解决方法。一对一与一对多关系的概念是关系数据库设计的基础,我对缺少这种语言元素感到非常惊讶。

最佳答案

SQL 是两种语言的结合。使用 SQL 中的数据定义语言 (DDL) 设置约束,包括唯一性约束。这是数据操作语言 (DML) 之上的一层,其中存在 SELECT 语句,并且可以理解,在 DDL 中发出的语句可能会使 DML 中的语句无效。

查询无法阻止某人执行 ALTER TABLE 命令并更改查询在查询运行之间引用的字段的名称。

并且没有更多的方法可以针对不确定的约束来防御性地编写查询;如果您需要向某人询问数据库环境之外的信息来解决这个问题,那也没关系。该信息也可能在环境中可用;在大多数引擎中,您可以通过查询数据字典来获取它。这是 INFORMATION_SCHEMA in MySQL ,例如。

关于sql - 为什么不在 SQL 中使用 JOIN ON 关键字来搜索并强制每条记录最多有一个匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716591/

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