2012-02-07 40 views
1

我有兩個表,我會打電話給表A和表BT-SQL:發現在不同的錶行,而不加入

表A:

StartNumber EndNumber Country 

1   10  USA 
11   20  USA 
21   30  Canada 
31   40  France 
41   50  France 
51   60  Germany 

表B:

SomeNumber 
5 
15 
55 
22 
35 
46 
49 

對於TableB中的每個數字,我想找到TableA中相應的行,其中數字在StartNumber和EndNumber之間,並返回國家的名稱。然後,我想將這些結果分組到國家/地區欄中,並返回每個國家出現的次數。所以結果看起來是這樣的:

Country Occurrences 
USA  2 
Germany 1 
Canada 1 
France 3 

不知道該怎麼做。

+0

你是什麼意思與「不加入」? – vstrien 2012-02-07 09:10:01

回答

2

在這裏查詢。

Select A.Country, count(*) as Occurrences 
from 
tableA A 
    inner join 
tableB B 
    on B.someNumber between a.startnumber and b.endnumber 
group by A.country 
+0

我在猜測(我猜你也是這樣),「無連接」是對連接的誤解(例如,它們總是基於平等或1-1),而不是實際的要求。 – 2012-02-07 09:11:58

+0

這不起作用。它沒有返回結果。另外,你有一個錯誤,b.endnumber應該是a.endnumber。 – AndroidDev 2012-02-07 09:12:17

+0

@AndroidDev - 用你已經注意到的修正(a.endnumber),並使用你的樣本數據,它會產生你的樣本結果,所以任何不工作的東西都不是你向我們展示的東西的一部分。 – 2012-02-07 09:19:04

0

這應該做的伎倆(但使用連接):

declare @TableA table (StartNumber int, EndNumber int, Country varchar(16)); 
insert into @TableA (StartNumber, EndNumber, Country) 
select 1, 10, 'USA' union 
select 11, 20, 'USA' union 
select 21, 30, 'Canada' union 
select 31, 40, 'France' union 
select 41, 50, 'France' union 
select 51, 60, 'Germany'; 

declare @TableB table (SomeNumber int); 
insert into @TableB (SomeNumber) 
select 5 union 
select 15 union 
select 55 union 
select 22 union 
select 35 union 
select 46 union 
select 49; 

select 
    a.Country, count(*) Occurrences 
from 
    @TableA a inner join 
    @TableB b on b.SomeNumber between a.StartNumber and a.EndNumber 
group by 
    a.Country; 
+0

在發佈代碼時,請將其標記 - 可以通過4個空格縮進來手動標記,也可以突出顯示代碼塊並使用「{}」按鈕或CTRL-K – 2012-02-07 09:23:32