可以为联接表设置限制吗?

时间:2019-10-25 05:30:57

标签: sql postgresql

是否可以通过某种方式为联接表limit 1设置masters,但仍不会对查询进行太多更改?

SELECT "rep_4hours"."hour_id", 
    "rep_4hours"."report_date", 
    "rep_4hours"."createdAt", 
    "rep_4hours"."updatedAt", 
    "rep_4hours"."teams_id", 
    "team"."team_id" AS "team.team_id", 
    "team"."full_name" AS "team.full_name", 
    "team"."is_active" AS "team.is_active", 
    "team"."createdAt" AS "team.createdAt", 
    "team"."updatedAt" AS "team.updatedAt", 
    "team->masters"."master_id" AS "team.masters.master_id", 
    "team->masters"."full_name" AS "team.masters.full_name", 
    "team->masters"."comment" AS "team.masters.comment", 
    "team->masters"."date_work" AS "team.masters.date_work", 
    "team->masters"."createdAt" AS "team.masters.createdAt", 
    "team->masters"."updatedAt" AS "team.masters.updatedAt", 
    "team->masters"."teams_id" AS "team.masters.teams_id" 
    FROM "rep_4hours" AS "rep_4hours" 
    INNER JOIN "teams" AS "team" ON "rep_4hours"."teams_id" = "team"."team_id" 
    INNER JOIN "masters" AS "team->masters" ON "team"."team_id" = "team->masters"."teams_id"
    WHERE ("report_date" >= "date_work") ORDER BY "team->masters"."date_work" DESC LIMIT 10 OFFSET 0;

3 个答案:

答案 0 :(得分:2)

您可以创建derived tablesub-query)来限制masters数据-

SELECT "rep_4hours"."hour_id", 
    "rep_4hours"."report_date", 
    "rep_4hours"."createdAt", 
    "rep_4hours"."updatedAt", 
    "rep_4hours"."teams_id", 
    "team"."team_id" AS "team.team_id", 
    "team"."full_name" AS "team.full_name", 
    "team"."is_active" AS "team.is_active", 
    "team"."createdAt" AS "team.createdAt", 
    "team"."updatedAt" AS "team.updatedAt", 
    "team->masters"."master_id" AS "team.masters.master_id", 
    "team->masters"."full_name" AS "team.masters.full_name", 
    "team->masters"."comment" AS "team.masters.comment", 
    "team->masters"."date_work" AS "team.masters.date_work", 
    "team->masters"."createdAt" AS "team.masters.createdAt", 
    "team->masters"."updatedAt" AS "team.masters.updatedAt", 
    "team->masters"."teams_id" AS "team.masters.teams_id" 
    FROM "rep_4hours" AS "rep_4hours" 
    INNER JOIN "teams" AS "team" ON "rep_4hours"."teams_id" = "team"."team_id" 
    INNER JOIN (SELECT * FROM "masters" LIMIT 1) AS "team->masters" ON "team"."team_id" = "team->masters"."teams_id"
    WHERE ("report_date" >= "date_work") ORDER BY "team->masters"."date_work" DESC LIMIT 10 OFFSET 0;

答案 1 :(得分:0)

您可以尝试使用LIMIT进行横向连接:

SELECT
    r.hour_id,
    r.report_date,
    r.createdAt,
    r.updatedAt,
    r.teams_id,
    t.team_id,
    t.full_name,
    t.is_active,
    t.createdAt,
    t.updatedAt,
    m.master_id,
    m.full_name,
    m.comment,
    m.date_work,
    m.createdAt,
    m.updatedAt,
    m.teams_id,
FROM rep_4hours r
INNER JOIN teams t
    ON r.teams_id = t.team_id
INNER JOIN LATERAL
(
    SELECT m1.*
    FROM masters m1
    WHERE m1.teams_id = t.team_id
    ORDER BY <some_col>   -- LIMIT only makes sense with an ORDER BY clause
    LIMIT 1
) m
    ON TRUE
WHERE
    report_date >= date_work
ORDER BY
   m.date_work DESC
LIMIT 10 OFFSET 0;

请注意,横向LIMIT子查询实际上需要具有ORDER BY子句才能使限制有意义。否则,不清楚哪个您想要的第一条记录。

答案 2 :(得分:0)

这是您的查询。使用subquery限制您的主人,别忘了包含order by

SELECT "rep_4hours"."hour_id", 
    "rep_4hours"."report_date", 
    "rep_4hours"."createdAt", 
    "rep_4hours"."updatedAt", 
    "rep_4hours"."teams_id", 
    "team"."team_id" AS "team.team_id", 
    "team"."full_name" AS "team.full_name", 
    "team"."is_active" AS "team.is_active", 
    "team"."createdAt" AS "team.createdAt", 
    "team"."updatedAt" AS "team.updatedAt", 
    "team->masters"."master_id" AS "team.masters.master_id", 
    "team->masters"."full_name" AS "team.masters.full_name", 
    "team->masters"."comment" AS "team.masters.comment", 
    "team->masters"."date_work" AS "team.masters.date_work", 
    "team->masters"."createdAt" AS "team.masters.createdAt", 
    "team->masters"."updatedAt" AS "team.masters.updatedAt", 
    "team->masters"."teams_id" AS "team.masters.teams_id" 
FROM "rep_4hours" AS "rep_4hours" 
INNER JOIN "teams" AS "team" ON "rep_4hours"."teams_id" = "team"."team_id" 
INNER JOIN 
        (SELECT * FROM "masters" ORDER BY "date_work" DESC LIMIT 10) AS "team->masters" ON "team"."team_id" = "team->masters"."teams_id"
WHERE ("report_date" >= "date_work");