2011-08-30 68 views
2

我有一個SQL Join的有趣問題。我有2個表,下面的實施例:SQL加入問題

表1:ID(INT),數值(字符串)
表2:ID(INT),ForeignID(INT),(值)

在表2的字段ForeignID是Table1中ID的外鍵。對於表1給定的條目,我有表2中多個條目如下:

Table1: 
ID, Value 
0, "Hello World" 
1, "Bonjour" 

Table2: 
ID, ForeignID, Value 
0, 0, "First entry" 
1, 0, "Second entry" 
2, 1, "Third entry" 

如果我做一個內部聯接,如

SELECT Table1.Value, Table2. Value FROM 
Table1 INNER JOIN Table2 ON Table1.ID = Table2.ForeignID 

我會得到

Hello world, First entry 
Hello world, Second entry 
Bonjour, Third entry 

有一種只能得到表2中的TOP條目的方法,例如:

Hello world, First entry 
Bonjour, Third entry 

回答

2
SELECT Table1.Value, 
     (SELECT TOP 1 Table2.Value 
      FROM Table2 
     WHERE Table2.ForeignID = Table1.ID) 
FROM Table1 
+0

那簡單嗎?我感覺自己像一個傻子問..謝謝:) –

+0

等等!也許不是那麼簡單。我做了一些編輯。我沒有時間設置你的表結構並自己測試它,但我認爲你可以用TOP和/或子查詢來完成。對不起,我不能更精確。 –

+0

根本不是一個愚蠢的問題,我不確定我的答案更接近。玩一下,你會得到你在找什麼。 –

2
SELECT 
t1.Value, 
( 
    SELECT TOP 1 t2.Value FROM Table2 t2 
    WHERE t2.ForeignID = t1.ID 
    ORDER BY t2.ID ASC 
) 
FROM Table1 t1 
0

這是另一種變體,它可以確保table2在正確的鍵上連接到table1。

SELECT t1.Value, 
     t2.Value 
    FROM Table1 t1 
     INNER JOIN Table2 t2 
     ON t2.ForeignID = (SELECT MIN(sub.ForeignID) 
          FROM Table2 sub WHERE sub.ForeignID = t1.ID) 
0

編輯,實際上,從頭開始。泰米拉的答案對我來說更好。

如果你可以添加一個布爾is_first標誌,以您的表2,然後事情就變得容易得多,這會爲你做的工作:

SELECT table1."value", table2."value" 
FROM table1 
INNER JOIN table2 ON table1.id = table2.foreign_id 
WHERE table2.is_first = true 

我不知道丹尼爾,cgatian的或者Leon兄弟答案將適用於您的數據庫。我在Postgres,它不適合我。

5

這工作太:

SELECT Table1.value 
     , Table2.value 
FROM Table1 
     INNER JOIN Table2 ON Table1.id = Table2.foreignID 
     INNER JOIN ( 
      SELECT MIN(ID) AS ID, ForeignID 
      FROM  Table2 
      GROUP BY ForeignID 
     ) MinID ON Table2.foreignid = MinID.foreignid 
        AND Table2.id = MinID.id 
+0

如果您的DBMS沒有窗口功能,那麼這是一個很好的解決方案。 –

+0

+1在索引良好的表格上,這優於目前所有其他解決方案。 –

1

既然你標記的SQL,這裏是ANSI SQL查詢(應該在SQL Server上運行2005+):

WITH TT (ID, ForeignID, Value, N) AS (
    SELECT ID, ForeignID, Value, 
      ROW_NUMBER() OVER(PARTITION BY ForeignID ORDER BY ID) 
     FROM Table2 
) 
    SELECT T1.Value, T2.Value 
     FROM Table1 T1 
INNER JOIN TT T2 
     ON T1.ID = T2.ForeignID 
     AND T2.N = 1; 

它使用公用表表達式和一個窗口功能。