2015-04-03 49 views
4

如何將連接兩個表,從第二個表中只選擇第一行? first match如何在SQL Server中將第一行左連接

我的問題是一個跟進:我使用的查詢 SQL Server: How to Join to first row 在該線程建議。

CREATE TABLE table1(
    id INT NOT NULL 
); 
INSERT INTO table1(id) VALUES (1); 
INSERT INTO table1(id) VALUES (2); 
INSERT INTO table1(id) VALUES (3); 
GO 

CREATE TABLE table2(
    id INT NOT NULL 
, category VARCHAR(1) 
); 
INSERT INTO table2(id,category) VALUES (1,'A'); 
INSERT INTO table2(id,category) VALUES (1,'B'); 
INSERT INTO table2(id,category) VALUES (1,'C'); 
INSERT INTO table2(id,category) VALUES (3,'X'); 
INSERT INTO table2(id,category) VALUES (3,'Y'); 
GO 

------------------ 
SELECT 
table1.* 
,FirstMatch.category 
FROM table1 

CROSS APPLY (
    SELECT TOP 1 
    table2.id 
    ,table2.category 
    FROM table2 
    WHERE table1.id = table2.id 
    ORDER BY id 
    ) 
    AS FirstMatch 

但是,通過此查詢,我得到了內連接結果。我想要獲得左側加入結果。所需結果中的tabel1.id應該具有NULL的「2」。怎麼做?

+6

變化CROSS應用到OU TER APPLY – 2015-04-03 09:06:59

+3

@ t-clausen.dk爲什麼你的大代表人在評論中放棄了答案,而不是在答案中?然後像我這樣的小代表可以將其標記爲爲其他用戶所接受。謝謝,效果很好! – 2015-04-03 09:11:59

回答

4

使用row_numberleft join

with cte as(

select id, 
     category, 
     row_number() over(partition by id order by category) rn 
     from table2 
) 
select t.id, cte.category 
from table1 t 
left outer join cte 
on t.id=cte.id and cte.rn=1 

OUTPUT:

id category 
1 A 
2 (null) 
3 X 

SQLFIDDLE DEMO

+0

Nop,它不會產生預期的結果。自己檢查一下。 – 2015-04-03 09:14:49

+0

我剛纔看到有問題的圖片,讓我再次檢討它 – jfun 2015-04-03 09:15:44

+0

@PrzemyslawRemin請再次檢查它,你怎麼說它沒有給出正確的結果,有一個錯過了逗號糾正,請再次檢查並給出反饋 – jfun 2015-04-03 09:21:41

3
select table1.id, 
(SELECT TOP 1 category FROM table2 WHERE table2.id=table1.id ORDER BY category ASC) AS category 
FROM table1 
+0

這一個也正常工作 – 2015-04-03 09:20:08

+2

不,這不會工作,如果類別不排序 – jfun 2015-04-03 09:24:23

+0

感謝您的評論兄弟。但在「否」之後添加「IF」根本沒有任何意義;) – VincentPzc 2015-04-03 09:29:01

1
SELECT table1.id ,table2.category 
FROM table1 Left join table2 
on table1.id = table2.id 
where table2.category = (select top 1 category from table2 t where table1.id = t.id) 
OR table2.category is NULL 
+0

這個方法也實現了目標。謝謝。 – 2015-04-03 10:55:33

+0

一個神祕的解決方案,不保證獲得最低ID的類別。如果表2中存在重複的類別,那麼對於某些類別,這可能會返回不同數量的行 – 2015-04-03 11:04:07

+0

當您有可用整數時,加入varchar不是很好的做法 – 2015-04-03 11:44:43