编写查询的更有效方法
More efficient way to write a query
这是我的工作查询:
SELECT
public."T1"."Id" AS "StuffId",
public."T1"."Name" AS "StuffName",
public."T3"."Id" AS "ThingId",
public."T3"."Name" AS "ThingName",
public."T4"."Id" AS "AnyId",
public."T4"."Name" AS "AnyName"
FROM public."T1"
INNER JOIN public."T2"
ON public."T1"."Id" = public."T2"."StuffId"
INNER JOIN public."T3"
ON public."T2"."Id" = public."T2"."ThingId"
INNER JOIN public."T4"
ON public."T4"."Id" = public."T2"."AnyId"
我想用别名以更易读的方式编写它,但因为别名永远不会被承认。
我对 postgresql 非常了解,但我非常了解 SQL 服务器、我的 SQL 和 Oracle。
这就是我想要的:
SELECT
Stuff.Id AS "StuffId",
Stuff.Name AS "StuffName",
Thing.Id AS "ThingId",
Thing.Name AS "ThingName",
Any.Id AS "AnyId",
Any.Name AS "AnyName"
FROM public."T1" AS Stuff
INNER JOIN public."T2" AS Link
ON Stuff.Id = Link.StuffId
INNER JOIN public."T3" AS Thing
ON Thing.Id = Link.ThingId
INNER JOIN public."T4" AS Any
ON Any.Id = Link.AnyId
我应该在我的第一个查询中更改什么以获得类似的东西?
单词public
是SHEMA名字。如果这是默认的数据库模式,那么您可能会在查询中错过它。就这么写T1.Id
应该没问题
如果此模式不是默认模式,那么您可以为某些数据库用户更改它并与他一起工作
您要做的第一件事就是去掉标识符周围所有这些嘈杂的引号。在标准 SQL 中,标识符被认为是不区分大小写的(并且默认为大写),因此这 3 个(未加引号的)限定符在语法上是等效的:
... as FOO
... as foo
... as FoO
当确实需要混合大小写或标识符与保留关键字冲突时,可以使用带引号的标识符。
您的用例中的问题是您无法从查询中删除引号,因为 您的 table 最初是使用(引用的)驼峰标识符创建的,喜欢 :
CREATE TABLE T1 (
"Id" INT,
"Name" VARCHAR(100)
);
您需要 RENAME
these columns 不带引号的内容 :
ALTER TABLE T1 RENAME "Id" TO id;
ALTER TABLE T1 RENAME "Name" TO name;
要替换驼峰命名法中的大小写分隔符,我建议使用下划线字符:
ALTER TABLE T2 RENAME "StuffId" TO stuff_id;
一旦所有 table 列被正确重命名,您就可以 运行 以下查询:
SELECT
Stuff.Id AS Stuff_Id,
Stuff.Name AS Stuff_Name,
Thing.Id AS Thing_Id,
Thing.Name AS Thing_Name,
Any.Id AS Any_Id,
Any.Name AS Any_Name
FROM
T1 AS Stuff
INNER JOIN T2 AS Link ON Stuff.Id = Link.Stuff_Id
INNER JOIN T3 AS Thing ON Thing.Id = Link.Thing_Id
INNER JOIN T4 AS Any ON Any.Id = Link.Any_Id
这是我的工作查询:
SELECT
public."T1"."Id" AS "StuffId",
public."T1"."Name" AS "StuffName",
public."T3"."Id" AS "ThingId",
public."T3"."Name" AS "ThingName",
public."T4"."Id" AS "AnyId",
public."T4"."Name" AS "AnyName"
FROM public."T1"
INNER JOIN public."T2"
ON public."T1"."Id" = public."T2"."StuffId"
INNER JOIN public."T3"
ON public."T2"."Id" = public."T2"."ThingId"
INNER JOIN public."T4"
ON public."T4"."Id" = public."T2"."AnyId"
我想用别名以更易读的方式编写它,但因为别名永远不会被承认。
我对 postgresql 非常了解,但我非常了解 SQL 服务器、我的 SQL 和 Oracle。
这就是我想要的:
SELECT
Stuff.Id AS "StuffId",
Stuff.Name AS "StuffName",
Thing.Id AS "ThingId",
Thing.Name AS "ThingName",
Any.Id AS "AnyId",
Any.Name AS "AnyName"
FROM public."T1" AS Stuff
INNER JOIN public."T2" AS Link
ON Stuff.Id = Link.StuffId
INNER JOIN public."T3" AS Thing
ON Thing.Id = Link.ThingId
INNER JOIN public."T4" AS Any
ON Any.Id = Link.AnyId
我应该在我的第一个查询中更改什么以获得类似的东西?
单词public
是SHEMA名字。如果这是默认的数据库模式,那么您可能会在查询中错过它。就这么写T1.Id
应该没问题
如果此模式不是默认模式,那么您可以为某些数据库用户更改它并与他一起工作
您要做的第一件事就是去掉标识符周围所有这些嘈杂的引号。在标准 SQL 中,标识符被认为是不区分大小写的(并且默认为大写),因此这 3 个(未加引号的)限定符在语法上是等效的:
... as FOO
... as foo
... as FoO
当确实需要混合大小写或标识符与保留关键字冲突时,可以使用带引号的标识符。
您的用例中的问题是您无法从查询中删除引号,因为 您的 table 最初是使用(引用的)驼峰标识符创建的,喜欢 :
CREATE TABLE T1 (
"Id" INT,
"Name" VARCHAR(100)
);
您需要 RENAME
these columns 不带引号的内容 :
ALTER TABLE T1 RENAME "Id" TO id;
ALTER TABLE T1 RENAME "Name" TO name;
要替换驼峰命名法中的大小写分隔符,我建议使用下划线字符:
ALTER TABLE T2 RENAME "StuffId" TO stuff_id;
一旦所有 table 列被正确重命名,您就可以 运行 以下查询:
SELECT
Stuff.Id AS Stuff_Id,
Stuff.Name AS Stuff_Name,
Thing.Id AS Thing_Id,
Thing.Name AS Thing_Name,
Any.Id AS Any_Id,
Any.Name AS Any_Name
FROM
T1 AS Stuff
INNER JOIN T2 AS Link ON Stuff.Id = Link.Stuff_Id
INNER JOIN T3 AS Thing ON Thing.Id = Link.Thing_Id
INNER JOIN T4 AS Any ON Any.Id = Link.Any_Id