如何去除Left Join查询结果中的重复项

问题描述 投票:0回答:2

看看这些表格:

餐桌招聘:

image of table hirings with columns id, user_id, company_id, title

表技能_招聘:

image of table skill_hiring with columns id, hiring_id, skill_id

我想展示与招聘相关的技能。可以看到,表

skill_hirings
中有3条记录
hiring_id = 3
。因此,当我使用左连接查询时,它返回 3 条相同的记录。

所以我想删除重复记录,并通过

id_hiring
仅返回唯一记录。

我读了一些 StackOverflow QnA,他们建议使用

GROUP BY
子句,但我仍然无法弄清楚。

查询:

SELECT id_hiring, company_id, title, status, start_salary, end_salary, 
viewer, open, close, expired 
 FROM (
    SELECT h.id id_hiring, * FROM hirings h 
    LEFT JOIN skill_hirings sh ON sh.hiring_id = h.id 
    LEFT JOIN skills s ON s.id = sh.skill_id 
    WHERE title ILIKE '%'
) RESULT

查询及结果:

enter image description here

注意:查询中的通配符

%
将替换为变量

第3方编辑

sqliteonline.com

的一些示例

image of left join hirings with skill_hiring

SQL for 创建示例表和记录。请注意 OP 正在使用

DROP TABLE IF EXISTS hirings;
DROP TABLE IF EXISTS skill_hiring;
CREATE TABLE hirings (
    id INTEGER PRIMARY KEY,
    user_id INTEGER NOT NULL,
    company_id INTEGER NOT NULL,
    title TEXT NOT NULL
);

CREATE TABLE skill_hiring (
    id INTEGER PRIMARY KEY,
    hiring_id INTEGER NOT NULL,
    skill_id INTEGER NOT NULL,
    FOREIGN KEY (hiring_id) REFERENCES hirings (id)
);

-- Insert data into hirings table
INSERT INTO hirings (id, user_id, company_id, title) VALUES 
(1, 101, 201, 'Software Engineer'), 
(2, 102, 202, 'Data Scientist'),
(3, 103, 203, 'Product Manager');

-- Insert data into skill_hiring table
INSERT INTO skill_hiring (id, hiring_id, skill_id) VALUES 
(1, 1, 301), (10, 1, 301), 
(2, 1, 302), (20, 2, 302), 
(4, 2, 303), (40, 2, 303),
(5, 3, 304); -- Skills

SELECT skill_hiring.skill_id, hirings.title
FROM hirings
LEFT JOIN skill_hiring ON hirings.id = skill_hiring.hiring_id;

sql postgresql left-join
2个回答
0
投票

在写这个答案时,我们仍然不知道哪些字段来自哪些表。根据当前的解释,尚不清楚为什么以下内容无法满足您的需求(尽管它可能根本无法运行,具体取决于任何必填字段是否确实来自我所拥有的

skill_hirings
skills table
不包括在内)。

SELECT
    h.id as id_hiring,
    h.company_id,
    h.title,
    h.status,
    h.start_salary,
    h.end_salary, 
    h.viewer,
    h.open,
    h.close,
    h.expired 
FROM
    hirings h 
WHERE
    h.title ILIKE '%'

0
投票

一个快速而肮脏的解决方案是执行两次相同的查询,并将它们与

UNION
放在一起。它删除重复的行。

可能不是最优化的解决方案,但应该可行。

© www.soinside.com 2019 - 2024. All rights reserved.