我有一个"子"对象表,每个对象都有一个外键到另一个表中的"父".
我想从每个有"孩子"的"父母"得到一个字段 - 但每个父母只有一次.如果该字段是唯一的,我可以通过以下方式完成:
SELECT DISTINCT parent.slug
FROM parent
INNER JOIN child
ON parent.id = parent_id;
Run Code Online (Sandbox Code Playgroud)
但是,如果我想要的领域不是唯一的呢?如何加入不同的ID,而不是在加入后进行过滤?就像是:
-- this does not actually work
SELECT parent.first_name
FROM parent
INNER JOIN child
ON DISTINCT parent.id = parent_id;
Run Code Online (Sandbox Code Playgroud)
我希望每个父母有一个或多个孩子的单行.如果"John Smith"有五个孩子并且"John Doe"有九个孩子,我应该得到两个"John"行(每个父亲一个).
我想我可以这样做:
SELECT DISTINCT parent.id, parent.first_name
FROM parent
INNER JOIN child
ON parent.id = parent_id;
Run Code Online (Sandbox Code Playgroud)
...但这是最有效的方式,即使每个"父"行在实践中可能有数千个"子"行?
为什么不呢?
SELECT parent.first_name
FROM parent
WHERE EXISTS (
SELECT *
FROM child
WHERE child.parent_id = parent.id
);
Run Code Online (Sandbox Code Playgroud)