在标准 MySQL 数据库上使用一些代码,我遇到了以下语句:
SELECT * FROM foo LEFT JOIN bar USING ('bar_id') WHERE foo_id = 1
Run Code Online (Sandbox Code Playgroud)
让我困惑的是:USING它是为了什么,它有什么作用?
我的第一个假设是它涉及使用外键或可能的索引,但 DB 模式没有任何外键或索引的指示,期间。
我的 googlefu 使我失败了,可能是因为USING在网站上的大多数文本中都是如此常见的词。因此,我想知道在我修改此代码和此代码中的多个其他查询之前,DB 专家听到的是否可以阐明它的作用。
假设我有以下查询:
SELECT *
FROM AppDetails, AppTags
WHERE AppDetails.AppID = '1'
AND AppDetails.AppID = AppTags.AppID
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
AppID AppName AppType Tag
1 Application1 Utility Test1
1 Application1 Utility Test2
1 Application1 Utility Test3
Run Code Online (Sandbox Code Playgroud)
如何修改查询以返回如下内容:
AppID AppName AppType Tags
1 Application1 Utility Test1,Test2,Test3
Run Code Online (Sandbox Code Playgroud) 我有一个数据仓库,里面有很多用 SSMS 视图设计器内置的视图。查看语法,FROM我无法理解这些子句,因为ON语句没有紧跟在相关的JOIN <table>. 通常RIGHT连接查询的主表并在FROM. 所以我有这样的情况:
SELECT *
FROM tableC
LEFT JOIN TableB
RIGHT JOIN TableA
ON TableA.ID = TableB.ID
ON TableB.TypeID = TableC.TypeID
WHERE ....
Run Code Online (Sandbox Code Playgroud)
将各种JOINandON子句的顺序更改为我手写的内容会以意想不到的方式改变结果。似乎大多数 SQL 美化者都对这种丑陋的语法感到窒息,而 SSMS 则不然。我一直无法找到押韵、原因或文档来帮助解开正在发生的事情。
请提供任何建议或链接以找出和修复视图设计器查询?
早期版本的 SQL-Server 不推荐使用分号来终止 sql 语句。
从 sql-server-2008 示例开始,现在 Microsoft 建议以分号结尾。
有一些格式化工具可以格式化 sql 查询并添加分号。我认为基本功能在 SMO 的某个地方。
唯一的问题是这些工具会删除所有注释。
任何想法如何保留所有评论以及如何添加所有推荐分号?
我有一个表示一组标志的 tinyint 列。假设我想知道是否设置了特定位,我如何在存储过程中执行按位 AND/OR 操作?
我创建了一个自定义类型:
CREATE TYPE my_type as(name text, street text, location text);
Run Code Online (Sandbox Code Playgroud)
初始化这样的类型很容易:
SELECT ROW('a', 'b', 'c')::my_type;
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种简单的方法可以部分初始化类型,这意味着所有未提及的列都隐式设置为 null。在伪代码中,类似于:
SELECT ROW('a', 'c')::my_type(name, location);
Run Code Online (Sandbox Code Playgroud)
另外,当列未按正确顺序提及时,是否还有一种初始化类型的方法?在伪代码中,类似于:
SELECT ROW('c', 'a', 'b')::my_type(location, name, street);
Run Code Online (Sandbox Code Playgroud) 我已使用以下语法在我们的一台服务器上运行sp_WhoIsActive:
sp_whoisactive @get_plans = 1, @show_sleeping_spids = 0, @get_outer_command = 1, @get_locks = 1
Run Code Online (Sandbox Code Playgroud)
并用sql_command(显示的列@get_outer_command设置为1)找到了一个spid,如下所示
(@p1 int,@p2 int)
Exec MyDatabase.MyProc @p1 @p2
Run Code Online (Sandbox Code Playgroud)
当我尝试在我的测试 Adventureworks 数据库上使用此语法运行查询时:
(@be int)
SELECT *
FROM Person.Person
WHERE BusinessEntityID = @be
Run Code Online (Sandbox Code Playgroud)
我收到错误
消息 1050,级别 15,状态 1,第 1 行 此语法仅适用于参数化查询。消息 137,级别 15,状态 2,第 4 行 必须声明标量变量“@FN”。
所以这似乎与参数化查询有关。这是有道理的,因为变量 @be 永远不会被设置为一个值
这里发生了什么?
在 PostgreSQL 中,我一直在使用类似的语法
TABLE example1
UNION ALL
TABLE example2
Run Code Online (Sandbox Code Playgroud)
我理解这相当于
SELECT * FROM example1
UNION ALL
SELECT * FROM example2
Run Code Online (Sandbox Code Playgroud)
但是一位同事问了我这个问题,我找不到任何关于这个语法的 PostgreSQL 文档。(“TABLE”不是一个有用的搜索短语。)我在哪里可以找到有关它的文档?
它是 ANSI SQL 标准吗?
编辑:它目前显然甚至混淆了 StackExchanges 的语法突出显示。
我有一个查询,当一个键冲突时,只有在其他列之一发生更改时才会向上插入 Postgres(以避免不必要的插入和返回的行,但实际上没有任何更改):
INSERT INTO public.test_upsert (some_id, a, b, note)
VALUES
('c', 1, true, 'asdf')
ON CONFLICT (some_id)
DO UPDATE SET
a = excluded.a,
b = excluded.b,
note = excluded.note
WHERE
test_upsert.a IS DISTINCT FROM excluded.a OR
test_upsert.b IS DISTINCT FROM excluded.b OR
test_upsert.note IS DISTINCT FROM excluded.note
RETURNING *;
Run Code Online (Sandbox Code Playgroud)
我的问题是:这个有简写吗?我基本上想在插入的任何列与现有列不同时插入新记录更新行。单独写出每一列会变得非常冗长,尽管它更明确。
SQL-92 标准的第 5.6 节包含规则 10...13,其中未加引号的标识符应大写,因此foo变为FOO但"foo"仍然是foo。
例如,Oracle、IBM DB2、Snowflake和ksqlDB遵守这些规则,但Postgres 、MySQL 或 SQLite 则不遵守这些规则。
问题是,为什么?根据我的理解,在具有大量关键字的语言中可选地引用标识符是有意义的。标识符一致的区分大小写或不区分大小写也是有意义的。但让它依赖于被引用的标识符看起来并不合理。
我缺少什么?
syntax ×10
postgresql ×3
sql-server ×3
cast ×1
datatypes ×1
join ×1
mysql ×1
parameter ×1
sql-standard ×1
ssms ×1
t-sql ×1
update ×1
upsert ×1
view ×1