Sql 编写查询的更有效方法
以下是我的工作查询:Sql 编写查询的更有效方法,sql,postgresql,pgadmin,Sql,Postgresql,Pgadmin,以下是我的工作查询: 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" FR
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"
我想用别名以更易读的方式写它,但别名是never acknowledge 我对postgresql非常了解,但我对SQL Server、我的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
是name。如果这是默认的DB模式,那么在查询中可能会错过它。就像这样写T1.Id
它应该可以正常工作
如果此模式不是默认模式,那么您可以为某个db用户更改它并与他一起工作您要做的第一件事是除去标识符周围所有这些嘈杂的引号。在标准SQL中,标识符被视为不区分大小写(默认为大写),因此这3个(不带引号)限定符在语法上是等价的:
... as FOO
... as foo
... as FoO
当确实需要混合情况或标识符与保留关键字冲突时,可以使用带引号的标识符
用例中的问题是您无法从查询中删除引号,因为您的表最初是使用(引号)camelCase标识符创建的,如:
您需要创建一个不带引号的内容:
ALTER TABLE T1 RENAME "Id" TO id;
ALTER TABLE T1 RENAME "Name" TO name;
要替换camelCase符号中的大小写分隔符,我建议使用下划线字符:
ALTER TABLE T2 RENAME "StuffId" TO stuff_id;
正确重命名所有表列后,可以运行以下查询:
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
“但是对于别名是never acknowledge”--您能解释一下这是什么意思吗?我的意思是第二个查询不起作用。您可以做的第一件事是省略
public
,它是defauilt schema name。其次,您可以避免使用“MixedCaseNames”
,因此不需要引用标识符。顺便说一句:ON public.T2.“Id”=public.T2.“ThingId”
在您的第一个查询中看起来像一个输入错误。您所说的-您可以避免“混合案例名称”是什么意思?我不能选择数据表名称好的,我可以不使用public这个词,但我不能写这个T1.Id,我只能写“T1”。“Id”你可以,但不能使用附录C.SQL关键字。您当前的第二个查询中有一个词Any是错误的,非常感谢,因为这些表是在我加入这个项目之前很久创建的,我不能确定,但这听起来像是一个真正的解释:“用例中的问题是您无法从查询中删除引号,因为您的表最初是使用(引用的)camelCase标识符创建的。”
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