2012-05-14 93 views
2

我的數據庫中的表1和單(可選)記錄的所有記錄,我有表有一對多(可選)關係1....0,*左連接選擇從表2

Table1: 
+--+---------+ 
|id| name | 
+--+---------+ 
| 1| user1 | 
| 2| user2 | 
| 3| user3 | 
+--+---------+ 


Table2 
+--+------+-------+ 
|id|tb1_ID|city | 
+--+------+-------+ 
| 1| 1 | a | 
| 2| 1 | b | 
| 3| 2 | c | 
+--+------+-------+ 

現在我想要表1的所有現有記錄和表2的前1個元素(對於每個表1行)

+----+------+----+--------+---------+ 
|p.id|p.name|c.id|c.tb1_ID|c.city | 
+----+------+----+--------+---------+ 
| 1 | user1| 1 | 1 | a | 
| 2 | user2| 3 | 2 | c | 
| 3 | user3|null| null | null | 
+----+------+----+--------+---------+ 

如何???

+0

table1和table2之間的連接是什麼 - 列連接和如何連接? – Bohemian

+0

在您的例子,你用什麼規則來接'b''「在'a''」爲'city'分配給''user1''? – MatBailie

+0

ID在表1的主鍵和tb1_ID是外鍵 – RollerCosta

回答

-1

假設你有一個1對多的關係,你想使用LEFT OUTER JOIN

SELECT p.id, p.name, c.id, c.tb1_ID, c.city 
FROM Table1 p 
LEFT OUTER JOIN Table2 c 
ON p.id = c.tb1_ID 

如果你有很多很多,你需要決定你是如何限制表2.

+0

在OP的例子'User1'涉及到兩個記錄表2中*(市'「a''和'」 b'')*,但是OP只想要回1記錄*(城市''a'')*。這個答案沒有解決這個問題。 – MatBailie

+0

這會給我的所有相關行從表2 – RollerCosta

2

例如本WITH common_table_expressionROW_NUMBER功能:

WITH cte AS(
    SELECT t1.id AS t1ID 
    ,  t1.name 
    ,  t2.id AS t2ID 
    ,  t2.tb1_ID 
    ,  t2.city 
    ,  ROW_NUMBER()OVER(Partition By t1.id Order By t2.id)AS t1RowNum 
    FROM Table1 t1 LEFT OUTER JOIN Table2 t2 ON t1.id=t2.tb1_ID 
) 
SELECT cte.* 
FROM cte 
WHERE t1RowNum = 1 
+1

+1:其實選秀權在T1 *每條記錄T2(其中其他答案在這裏選擇忽略...)*一個記錄。它是否我預計是最快的:) *的方式* – MatBailie

1

你將不得不使用與OUTER子查詢適用於該單列隔離右表。

select t1.*, t2.* 
from table1 t1 
outer apply 
(
    select top 1 * 
    from table2 
    where tb1_id = t1.id 
    order by id 
) as t2 
+0

+1 [假設合適的索引。]:其實挑選一條記錄在T1 *每條記錄T2(它在這裏其他的答案選擇忽略...)* 。但我會比較和對比'ROW_NUMBER()= 1'的選擇。 – MatBailie

+0

這是一個好主意,如果需要特定行訂購子查詢。 – bendataclear

+0

@bendataclear - 是的,但不幸的是,OP留下了一部分,只有指定TOP 1 –