postid,CategoryImageURL
が含まれていたいですそのCategoryImageURLを表Aに表示するが、1つのpostidにはCategoryImageURL1が、CategoryImageURL2にはそのようにすべきである。
私は1つのpostidのために1対多の関係を達成したいと思いますが、どのロジックがSQL関数で返されるべきですか?
postid,CategoryImageURL
が含まれていたいですそのCategoryImageURLを表Aに表示するが、1つのpostidにはCategoryImageURL1が、CategoryImageURL2にはそのようにすべきである。
私は1つのpostidのために1対多の関係を達成したいと思いますが、どのロジックがSQL関数で返されるべきですか?
あなたは間違った種類の質問をしています。これは正規化に関するものです。
冗長性はありますか?各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はリレーショナルであり、一連のデータを処理します。継承は、リレーショナルセット理論と互換性がありません。すべてのテーブルは、本の中のすべてのページと章が本の一部として扱われるように、前方と後方に照会することができます。私たちは本から独立した章を見ていないでしょう。
私の目には、セカンダリテーブルの関連するすべての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
は否決 - タイトルを変更することを検討してください。タイトルには問題の簡単な説明が含まれていて、「こんにちは私は新しいです...」 –
あなたはasp.netを初めて使っていますが、この質問はそれに関連していません。 – Imad
これはプレゼンテーションレベルに属し、そこではplsが処理します。 – dean