Sql 为父表中的每一行从子表中选择单行

Sql 为父表中的每一行从子表中选择单行,sql,ms-access,Sql,Ms Access,我试图从子表中为每个包含子字段的父行仅获取一行,我一直在尝试使用GROUP BY,但没有成功: 这是我最初的选择 SELECT pID, lastname FROM parent LEFT JOIN (SELECT cID, pID, phone, company, title FROM child) as child ON parent.pID = child.pID 这是桌子的结构 CREATE TABLE parent ( pID Counter(1,1

我试图从子表中为每个包含子字段的父行仅获取一行,我一直在尝试使用GROUP BY,但没有成功: 这是我最初的选择

SELECT pID, lastname 
 FROM parent 
  LEFT JOIN 
   (SELECT cID, pID, phone, company, title FROM child) as child 
   ON parent.pID = child.pID
这是桌子的结构

CREATE TABLE parent (
    pID Counter(1,1) PRIMARY KEY,
    firstname VarChar(24) DEFAULT '',
    lastname VarChar(20) DEFAULT ''
);

CREATE TABLE child (
    cID Counter(1,1) PRIMARY KEY,
    pID int DEFAULT '0',
    phone VarChar(16) DEFAULT '',
    company VarChar(24) DEFAULT '',
    title VarChar(24) DEFAULT '',
    address TEXT
);

你得换个新的

SELECT cID, pID, phone, company, title FROM child
每个pid只返回一行。正确的选择取决于您的需求。simples按以下方式分组:


但是不同的列将来自不同的行,因此您可能需要类似于“第一行”的内容,这取决于您使用的RDBMS,因此请将该信息添加到您的问题中。

您没有说明您的DBMS,因此这是一个标准的ANSI解决方案:

SELECT pID, lastname 
FROM parent 
  LEFT JOIN (
         SELECT pID, 
                row_number() over (partition by pid order by cid) as rn
         FROM child
         ) as child 
         ON parent.pID = child.pID and child.rn = 1
定义为第一行的行由您决定。除非您对行进行排序,否则不存在第一行,这是partition子句中part order by cid所做的。因此,如果您希望第一行有所不同,您需要更改它

顺便说一句:如果不使用子表中的所有列,则无需选择它们

对于每个包含子字段的父行,只从子表中获取一行

SELECT cID ChildID, 
       pID ParentID, 
       phone, 
       company, 
       title, 
       (SELECT lastname FROM parent WHERE id = ParentID) as LastName
FROM child
GROUP BY ParentID
听起来,对于相同的pID值,子表可以有多行。每个pID只需要一个子行

再次通过查询将该组连接回子表,以检索每个目标cID值的其他列。将此查询另存为qryChild


最后,要包含lastname值,请将父表连接到qryChild。

您使用的数据库引擎是什么?请输入表的结构,并更清楚地告诉我们您真正想要的是什么工作方式,但它不接受备注字段!选择pID,parent.*从parent LEFT JOIN中选择mincID,pID,minphone,mincompany,mintitle,minaddress FROM child group by cID AS child ON parent.pID=child.pID were[address]是备注字段!MS Access不支持此JOIN子句@meYnot:MS Access不是符合ANSI标准的DBMS。下次请说明您的数据库管理系统。如果你提到我是这里的初学者,我也不会回答,我确实尝试过获取更多的标签,但我不认识[ms access]tho!谢谢Raheel,我对access不太熟悉,虽然这看起来很完美,但即使在第一次选择中将[as]添加到cid和pid中,它也不会以ParentID的形式工作!好的,技术是如果你在外部查询中选择了某个东西,你可以在子查询中使用它。或者,我已经将Group by CID更改为PID,这是我的错误。再次检查它将是完美的。谢谢Raheel,错误在[select lastname FROM parent,其中PID=ParentID as lastname]ParentID无法识别我修改了查询您是对的子查询中应该是id而不是ParentID
SELECT cID ChildID, 
       pID ParentID, 
       phone, 
       company, 
       title, 
       (SELECT lastname FROM parent WHERE id = ParentID) as LastName
FROM child
GROUP BY ParentID
SELECT pID, Min(cID) AS MinOfcID
FROM child
GROUP BY pID;
SELECT
    c.pID,
    c.cID,
    c.phone,
    c.company,
    c.title,
    c.address
FROM
    (
        SELECT pID, Min(cID) AS MinOfcID
        FROM child
        GROUP BY pID
    ) AS map
    INNER JOIN child AS c
    ON c.cID = map.MinOfcID;