Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 编写查询的更有效方法_Sql_Postgresql_Pgadmin - Fatal编程技术网

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