2012-06-26 20 views
1

我要加入2個表格(table1table2)。左連接2個表格,僅返回出現在第二個表格上的記錄

第一個表格包含每個記錄的唯一globalcid,第二個表格包含相同的多個出現globalcid。注意:globalcid是table2到table1的引用字段。

table1的

globalcid/itemdesc 
1  /item 1 
2  /item 2 
3  /item 3 
4  /item 4 
5  /item 5 

表2

globalcid /recordcid 
1   /1 
1   /2 
2   /1 
3   /1 
3   /2 
3   /3 
5   /1 

我希望查詢以在[表2] Group返回僅從[表1]紀錄以記錄由表2 .globalcid,但會返回每個globalcid的最後一條記錄

在它上面的例子應該返回

globalcid/itemdesc/table2.globalcid 
1  /item 1 /2 
2  /item 2 /1 
3  /item 3 /3 
5  /item 5 /1 

回答

3
SELECT 
    a.*, 
    MAX(b.recordcid) AS maxcid 
FROM 
    table1 a 
INNER JOIN 
    table2 b ON a.globalcid = b.globalcid 
GROUP BY 
    a.globalcid 

如果你只關心recordcid,並不需要從表中的任何其他列,那麼這應該是罰款。但是,如果有表中的其他列像這樣:

globalcid /recordcid /othercolumn 
------------------------------------------ 
1   /1   /bertrand 
1   /2   /centipede 
2   /1   /yarn 
3   /1   /obviate 
3   /2   /hyper 
3   /3   /fish 
5   /1   /larry 

...那麼MAX()值沒有對應的行數據在othercolumn排隊,而是中,必須用最大的選擇像這樣子查詢:

SELECT 
    a.*, 
    c.recordcid, 
    c.othercolumn 
FROM 
    table1 a 
INNER JOIN 
    (
     SELECT globalcid, MAX(recordcid) AS maxcid 
     FROM table2 
     GROUP BY globalcid 
    ) b ON a.globalcid = b.globalcid 
INNER JOIN 
    table2 c ON b.globalcid = c.globalcid AND b.maxcid = c.recordcid 

,導致:

globalcid /itemdesc /recordcid /othercolumn 
--------------------------------------------------------- 
1   /item1  /2   /centipede 
2   /item2  /1   /yarn 
3   /item3  /3   /fish 
5   /item5  /1   /larry 
+0

我需要包含來自[table2]的另一個字段 –

+0

太棒了!然後,您必須使用我發佈的第二個解決方案,並將「c.othercolumn」替換爲您希望選擇的列。確保保留列名前面的別名「c」。您也可能希望調整表格模式以包含這些列,因爲這會對已發佈的解決方案產生影響。 –

1

你應該能夠做到這一點使用內部聯接和聚合:

SELECT table1.globalcid, itemdesc, MAX(recordcid) 
FROM table1 INNER JOIN table2 on table1.globalcid = table2.globalcid 
GROUP BY table1.globalcid, itemdesc 

內部聯接排除所有記錄在表2,在表1中沒有匹配的ID。 MAX/GROUP BY將爲每個globalcid提取最大值recordid

+0

這並不選擇每個項目的最後一個記錄,它會選擇一日一 –

相關問題