5

子フィールドが含まれる親行ごとに子テーブルから1行だけ取得しようとしています.GRUOP BYを試してみましたが、成功しませんでした:(これが私の最初のSELECTです

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
);
4

4 に答える 4

13

「子フィールドが含まれる親行ごとに、子テーブルから1行だけ取得する」

テーブルは同じ値childに対して複数の行を持つことができるようです。そして、それぞれに 1 つの行pIDだけが必要です。childpID

SELECT pID, Min(cID) AS MinOfcID
FROM child
GROUP BY pID;

GROUP BYそのクエリを再度テーブルに結合してchild、各ターゲットcID値の他の列を取得します。このクエリを として保存しますqryChild

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;

最後に、値を含めるために、テーブルをlastnameに結合します。parentqryChild

于 2012-05-07T11:07:11.497 に答える
6

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

どの行を「最初の」行として定義するかは、あなた次第です。行をソートしない限り、「最初の」行などはありません。これorder by cidが、partition 句での部分の動作です。したがって、「最初の」行とは異なるものが必要な場合は、それを変更する必要があります。

ところで:使用しない場合、子テーブルからすべての列を選択する必要はありません。

于 2012-05-07T09:07:29.240 に答える
0

交換する必要があります

SELECT cID, pID, phone, company, title FROM child

pidごとに1行のみを返すものがあります。正しい選択は、要件によって異なります。シンプルはgroup by次のとおりです。

SELECT min(cID), pID, min(phone), min(company), min(title) FROM child group by cID

ただし、異なる列は異なる行から取得されるため、使用しているRDBMSに応じて「最初の行」のような実装方法が必要になる可能性があるため、その情報を質問に追加してください。

于 2012-05-07T09:04:47.283 に答える
0
SELECT cID ChildID, 
       pID ParentID, 
       phone, 
       company, 
       title, 
       (SELECT lastname FROM parent WHERE id = ParentID) as LastName
FROM child
GROUP BY ParentID
于 2012-05-07T09:11:54.990 に答える