2017-03-17 5 views
0

"From Account"と "To Account"を変数などに格納することで、これを何らかのループで行うことができることは分かっていますが、探しています簡単な方法。SQLクエリ - メインアカウントとすべてのセカンダリアカウントを表示

MainAccountテーブルには明らかにAccountsIntervalテーブルにも格納されている1つのアカウント番号が含まれています。そのテーブルには、範囲(From Account - To Account)があります。ループすることなく、各メインアカウントのすべてのセカンダリアカウントを取得する方法を見つけるのが難しいです。簡単な方法がありますか?

CREATE TABLE #MainAccounts(id INT IDENTITY(1,1) PRIMARY KEY, MainAccount NVARCHAR(20)) 
    INSERT INTO #MainAccounts(MainAccount) VALUES('41000') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('41010') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('41011') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('41999') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('42000') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('42010') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('42015') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('42020') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('42030') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('42080') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('42310') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('42999') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('43999') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('48000') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('48100') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('48199') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('48200') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('48210') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('48220') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('48299') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('48999') 
    INSERT INTO #MainAccounts(MainAccount) VALUES('49999') 

CREATE TABLE #AccountsInterval(id INT IDENTITY(1,1) PRIMARY KEY, MainAccount NVARCHAR(20), FromAccount NVARCHAR(20), ToAccount NVARCHAR(20)) 
INSERT INTO #AccountsInterval(MainAccount, FromAccount, ToAccount) VALUES('41999', '41000', '41999') 
INSERT INTO #AccountsInterval(MainAccount, FromAccount, ToAccount) VALUES('42999', '42000', '42999') 
INSERT INTO #AccountsInterval(MainAccount, FromAccount, ToAccount) VALUES('43999', '41000', '43999') 
INSERT INTO #AccountsInterval(MainAccount, FromAccount, ToAccount) VALUES('48199', '48000', '48199') 
INSERT INTO #AccountsInterval(MainAccount, FromAccount, ToAccount) VALUES('48299', '48200', '48299') 
INSERT INTO #AccountsInterval(MainAccount, FromAccount, ToAccount) VALUES('48999', '48000', '48999') 
INSERT INTO #AccountsInterval(MainAccount, FromAccount, ToAccount) VALUES('49999', '41000', '49999') 

例のアカウントを使用する場合は、 41999、42999、43999 ...私たちは以下の結果を得るべきです。

Main Secondary 
41999 41000 
41999 41010 
41999 41011 
41999 41999 
42999 42000 
42999 42010 
42999 42015 
42999 42020 
42999 42030 
42999 42080 
42999 42310 
42999 42999 
43999 41000 
43999 41010 
43999 41011 
43999 41999 
43999 42000 
43999 42010 
43999 42015 
43999 42020 
43999 42030 
43999 42080 
43999 42310 
43999 42999 
43999 43999 

私は複数のクエリ、サブクエリを試してみましたが、どこにも行きません。

答えて

1
select ai.MainAccount as "Main", mi.MainAccount as "Secondary" 
from #AccountsInterval ai 
join #MainAccounts mi on mi.MainAccount >= ai.FromAccount and mi.MainAccount <= ai.ToAccount 

...または代わりに...

select ai.MainAccount as "Main", mi.MainAccount as "Secondary" 
from #AccountsInterval ai 
cross join #MainAccounts mi 
where mi.MainAccount >= ai.FromAccount and mi.MainAccount <= ai.ToAccount 
+0

感謝。長い金曜日。クロスジョイン。いいね – manderson

1

これを使用すると、1つのクエリで欲しいものを行う必要があります。

Select M.MainAccount As Main, S.MainAccount As Secondary 
From #MainAccounts  M 
Join #AccountsInterval I On M.MainAccount = I.MainAccount 
Join #MainAccounts  S On Convert(Int, S.MainAccount) Between Convert(Int, I.FromAccount) 
                   And  Convert(Int, I.ToAccount) 
Order By Main, Secondary 

の質問にあなたの例に続いて、我々は、ちょうど41999に結果を制限42999、および43999ことができます。

Select M.MainAccount As Main, S.MainAccount As Secondary 
From #MainAccounts  M 
Join #AccountsInterval I On M.MainAccount = I.MainAccount 
Join #MainAccounts  S On Convert(Int, S.MainAccount) Between Convert(Int, I.FromAccount) 
                   And  Convert(Int, I.ToAccount) 
Where M.MainAccount In ('41999', '42999', '43999') 
Order By Main, Secondary 

Main Secondary 
41999 41000 
41999 41010 
41999 41011 
41999 41999 
42999 42000 
42999 42010 
42999 42015 
42999 42020 
42999 42030 
42999 42080 
42999 42310 
42999 42999 
43999 41000 
43999 41010 
43999 41011 
43999 41999 
43999 42000 
43999 42010 
43999 42015 
43999 42020 
43999 42030 
43999 42080 
43999 42310 
43999 42999 
43999 43999 
関連する問題