2016-07-18 2 views
-2

は1 postidについてSQLの2つのテーブル間に1対多の関係を表示する方法は?複数CategoryImageURL assigned.Iがあります私は2つのテーブルAとB.</p> <p>表は</p> <pre><code>postid,postname,CategoryURl </code></pre> <p>と</p> <p>Bテーブルが含まれている必要があり

postid,CategoryImageURL 

が含まれていたいですそのCategoryImageURLを表Aに表示するが、1つのpostidにはCategoryImageURL1が、CategoryImageURL2にはそのようにすべきである。

私は1つのpostidのために1対多の関係を達成したいと思いますが、どのロジックがSQL関数で返されるべきですか?

+0

は否決 - タイトルを変更することを検討してください。タイトルには問題の簡単な説明が含まれていて、「こんにちは私は新しいです...」 –

+0

あなたはasp.netを初めて使っていますが、この質問はそれに関連していません。 – Imad

+0

これはプレゼンテーションレベルに属し、そこではplsが処理します。 – dean

答えて

0

あなたは間違った種類の質問をしています。これは正規化に関するものです。

冗長性はありますか?各postnameとcategoryURLはIDフィールドで表されます。

どのような理由でも、テーブルはCategoryImageUrlを独自のテーブルに分け、これをpostnameとcategoryURLの各セットにリンクしました。

リレーションが実際に各ポスト名のIDである場合、最初のテーブルにCategoryImageUrl列を追加することによってテーブルを非正規化することができます。

Postid、postname、CategoryURL、CategoryImageUrl

それとも、正規化を保持したい場合には、そのように自分のテーブルにフィールドのように組み合わせる:

--TableA: 
Postid, postname, <any other field dependent on postname > 
--TableA 
Postid, CategoryURL, CategoryImageUrl 

は今、このグループが一緒にCategoryURLが、冗長性を使用しています複数のCategoryURLを存在させる必要があります。ただし、PostididにはCategoryUrlが1つしかありません。

-- Post Table 
Postid, postname 

-- Category table 
CategoryID, CategoryURL, <any other info dependent only on CategoryURL> 

-- Fact Table 
Postid, CategoryID, CategoryImageURL 

免責事項は:当然のことながら、私はあなたのデータの側面を仮定し、オフになる場合もあり

は、私たちがこのよう Star Schema戦略を使用することができ、私たちのテーブルにこの冗長性を削除します。しかし、正規化の戦略はまだ同じです。

また、覚えておいてください。SQLはリレーショナルであり、一連のデータを処理します。継承は、リレーショナルセット理論と互換性がありません。すべてのテーブルは、本の中のすべてのページと章が本の一部として扱われるように、前方と後方に照会することができます。私たちは本から独立した章を見ていないでしょう。

1

私の目には、セカンダリテーブルの関連するすべてのCategoryImageURLを区切り記号(カンマ)で1行に表示したいと思われるようです。 次に、そこに再帰的な操作が必要です。たぶんCTE(Common Table Expression)がこのトリックを行うかもしれません。下記参照。 2番目のテーブルのすべての行が最初のテーブルの対応する行のために処理されているかどうかをチェックするために、別のキーを2番目のテーブルに追加しました。

たぶんこのことができます:

with a_cte (post_id, url_id, name, list, rrank) as 
(
    select 
     a.post_id 
     , b.url_id 
     , a.name 
     , cast(b.urln + ', ' as nvarchar(100)) as list 
     , 0 as rrank 
    from 
     dbo.a 
    join dbo.b 
     on a.post_id = b.post_id 
union all 
    select 
     c.post_id 
     , a1.url_id 
     , c.name 
     , cast(c.list + case when rrank = 0 then '' else ', ' end + a1.urln as nvarchar(100)) 
     , c.rrank + 1 
    from a_cte c 
    join ( select 
       b.post_id 
       , b.url_id 
       , a.name 
       , b.urln 
      from dbo.a 
      join dbo.b 
      on a.post_id = b.post_id 
        ) a1 
    on c.post_id = a1.post_id 
    and c.url_id < a1.url_id -- ==> take care, that there is no endless loop 
) 
select d.name, d.list 
from 
    (
    select name, list, rank() over (partition by post_id order by rrank desc) 
    from a_cte 
    ) d (name, list, rank) 
where rank = 1 
関連する問題

 関連する問題