1

同僚から、SQLServerデータベースからのデータの取得について質問がありました。

サンプルデータセットがあります

[ID],[TOWN],[PERSON]
[1],[BELFAST],[JAMES]
[2],[NEWRY],[JOHN]
[3],[BELFAST],[SIMON]
[4],[LARNE],[ALAN]

ここから、ビューに基づいて別のテーブルを返すSQLデータセットを返します。

基本的にコードでは、町で明確な情報を取得してから、町でSQLフィルタリングをループさせることができます。しかし、SQLでこれを行う方法はありますか?

(3)ビューを取り戻す場所(2ベルファスト、1ニューリー、1ラーン)

基本的に私はそれが戻るだろう

[ID],[Town],[Person]
[1],[Belfast],[James]
[3],[Belfast],[Simon]

次に、別のビューが「ラーン」に戻り、最後のビューがニューリーに戻ります。基本的に、SQLは、検出した各町のビューを作成し、各町のレコードを返します。

4

3 に答える 3

1

ビューを取り戻すことはできません。ビューを自分で定義する必要があります。

たとえば、ベルファストに1つのビュー、ニューリーに2つ、ラーンに3つが必要な場合は、関連する都市名に一致する行のみを返す3つのビューを作成する必要があります。

 CREATE VIEW BelfastView 
 AS 
    SELECT ID, Town, Person
    FROM dbo.Towns
    WHERE Town = 'Belfast'

 CREATE VIEW LarneView 
 AS 
    SELECT ID, Town, Person
    FROM dbo.Towns
    WHERE Town = 'Larne'

 CREATE VIEW NewryView 
 AS 
    SELECT ID, Town, Person
    FROM dbo.Towns
    WHERE Town = 'Newry'

現在、特定のユーザーはからデータを選択することのみが許可されている可能性があるためBelfastView、基になるテーブルから他のデータ行が表示されることはありません。

ただし、ビューはテーブルやストアドプロシージャなどのデータベースオブジェクトです。それらを作成し、維持し、不要になったときに投げる必要があります。

于 2012-10-12T12:27:30.677 に答える
1

編集

更新された質問に基づいて、フィルタリングする町ごとにビューを作成する必要があります。

CREATE VIEW BelfastView AS

SELECT    ID,
          Town,
          Person
FROM      YourTable
WHERE     Town = 'BELFAST'

あなたは私たちにあなたのデータの小さなサンプルを与えただけですが、あなたが求めていることはほとんど決して良い考えではありません。DBに50の新しい町があるとどうなりますか?町ごとにビューを作成しますか?これはうまくスケーリングしません(またはまったくスケーリングしません)。

于 2012-10-12T12:21:31.793 に答える
0

基本的に、各アイテムをリストとして返すために、ストアドプロシージャとして実行することにしました。だからこれに沿った何か:

Create Procedure ListTowns
As
declare @towns char(11)

select @towns = (select distinct Town from [Towns])

while @towns is not null <> 0
begin
    select * from [YourTable] where Town = @towns
end
于 2012-10-12T12:39:07.913 に答える