我今天在运行同事的脚本时看到了上面的“ANSI警告”消息(我不知道许多语句中的哪一个导致显示警告)。
过去我忽略了它:我自己避免空值,所以任何可以消除它们的东西在我的书中都是一件好事!然而,今天“SET”这个词真的对我大喊大叫,我意识到我不知道这个词在这种情况下应该是什么意思。
我的第一个想法是,基于它是大写的事实,它指的是SET
关键字,意思是“赋值”,如
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
Run Code Online (Sandbox Code Playgroud)
根据 SQL Server 帮助,“ANSI 警告”功能基于 ISO/ANSI SQL-92,该规范仅在小节标题中使用了术语“设置操作”,因此在标题大小写中,数据分配部分。但是,在快速搜索错误消息后,我看到了一些示例,这些示例是SELECT
看似不涉及赋值的查询。
根据 SQL Server 警告的措辞,我的第二个想法是隐含了 set 的数学含义。但是,我不认为 SQL 中的聚合严格来说是一种集合操作。即使 SQL Server 团队认为它是一个集合操作,把“集合”这个词放在大写的目的是什么?
在谷歌搜索时,我注意到一条 SQL Server 错误消息:
Table 'T' does not have the identity property. Cannot perform SET operation.
Run Code Online (Sandbox Code Playgroud)
这里同样的情况下的“SET操作”这个词只能指IDENTITY_INSERT
属性的赋值,这让我又回到了最初的想法。
任何人都可以对此事有所了解吗?
请注意,此问题与供应商/版本无关
在我看来,作为英语演讲者(打字员、作家),期望单词的大小写正确但不一定具有正确方向的正确口音是合理的:
当我在香榭丽舍大街餐厅的酒店领班克洛伊 (Chloe the maitre d'hotel) 的茶会上沉思时,一边等着 garcon 拿来我炒过的墨西哥胡椒酱……
你明白了。
所以今天我想我想要一个搜索条件来使用区分大小写但不区分重音的排序规则,但找不到。这是否有充分的理由,或者我的只是一个罕见的用例?
这是我正在查看的一些文档的示例(尽管认为供应商/版本不可知):
我想通过 equi join 从两个表中获取一些人的数据。有些人有地址数据,有些人没有。对于那些没有addresses_id
from 表的人来说persons
是 NULL。
对于所有有地址的人(查询#1):
SELECT p.last_name, p.first_name,
a.street, a.house_nr, a.post_code, a.city
FROM persons AS p, addresses AS a
WHERE p.id=42 AND a.id=p.addresses_id;
Run Code Online (Sandbox Code Playgroud)
对于我所做的所有没有地址数据的人(查询#2):
SELECT p.last_name, p.first_name
FROM persons AS p WHERE p.id=42;
Run Code Online (Sandbox Code Playgroud)
有没有什么顺畅的方法可以将这两个查询合二为一。也许有一个 if 子句?我不想自己检查该addresses_id
字段然后执行 query#1 或 query#2。
我正在将 MySQL 与 InnoDB 引擎一起使用。谢谢。