Более эффективный способ написать запрос - PullRequest
0 голосов
/ 27 декабря 2018

Вот мой рабочий запрос:

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 Server, My 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

Что я должен изменить в своем первом запросе, чтобы что-то подобное?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Первое, что вы хотите сделать, это избавиться от всех этих шумных кавычек вокруг идентификаторов.В стандартном SQL идентификаторы считаются нечувствительными к регистру (и по умолчанию в верхнем регистре), поэтому эти 3 (не заключенные в кавычки) синтаксически эквивалентны:

... as FOO
... as foo
... as FoO

Кавычечные идентификаторы должны использоваться, когда смешанные регистры действительнотребуется или когда идентификаторы конфликтуют с зарезервированными ключевыми словами.

Проблема в вашем случае использования заключается в том, что вы не можете удалить кавычки из запроса, потому что ваши таблицы изначально были созданы с (цитируемыми) идентификаторами camelCase , например:

CREATE TABLE T1 (
    "Id"    INT,
    "Name"  VARCHAR(100)
);

Вам нужно RENAME эти столбцы к чему-то без кавычек:

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
0 голосов
/ 27 декабря 2018

Слово public - это SHEMA имя.Если это схема БД по умолчанию, вы можете пропустить это в запросах.Просто напишите так: T1.Id, он должен работать нормально.

Если эта схема не по умолчанию, вы можете изменить ее для какого-то пользователя БД и работать с ним Изменить схему по умолчанию для пользователя

...