2012-05-07 115 views
3

我想從子表中爲每個父行包含子字段只有一行,我一直嘗試用GRUOP BY但沒有成功:( Here是我最初的選擇從父表中爲每一行從子表中選擇單行

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 
); 
+0

您使用的是哪種數據庫引擎? –

+0

把你的表的結構,並更清楚地告訴我們你真正想要什麼 –

+0

Microsoft Access MDB文件! – meYnot

回答

5

「得到子表中只有一個行,並與孩子每場父行列入」

這聽起來像child表可以有多個行對同一pID值。而且每個pID只需要一個child行。

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

+0

輝煌,謝謝,像一個魅力! :) – meYnot

0

你就必須更換

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

每個pid只返回一行。正確的選擇取決於你的要求。該simples是group by

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

但不同的列將來自不同行,所以你可能要像「第一行」如何實現這取決於你所使用的RDBMS,所以請添加信息你的問題。

+0

謝謝你的作品,但它不接受備忘錄字段! (cID),pID,min(電話),min(公司),min(標題),min(地址)FROM子組)通過cID)AS孩子 ON parent.pID = child.pID [address]是備忘錄字段! – meYnot

3

你不說出你的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在分區子句中的作用。所以如果你想要一些與「第一」行不同的東西,你需要改變它。

順便說一句:如果你不使用它們,沒有必要從子表中選擇所有列。

+0

MS Access不支持這個JOIN子句! – meYnot

+0

@meYnot:MS Access不是ANSI兼容的DBMS。請在下次說明您的DBMS。如果您剛纔提到過,我不會回答 –

+0

我是初學者,我確實試圖獲得更多標籤,但我沒有認出[ms-access] tho! – meYnot

0
SELECT cID ChildID, 
     pID ParentID, 
     phone, 
     company, 
     title, 
     (SELECT lastname FROM parent WHERE id = ParentID) as LastName 
FROM child 
GROUP BY ParentID 
+0

感謝Raheel,我不熟悉訪問,雖然這看起來很完美,但即使在第一個SELECT中將[AS]添加到cid和pid時,它也不能識別ParentID! – meYnot

+0

以及技術是,如果你選擇外部查詢中的某些東西,你可以在子查詢中使用它 –

+0

對不起,我已經改變了組的CID PID是我的錯誤再次檢查它將是完美的 –

相關問題