如何在SQL中显示两个表之间的一对多关系?

时间:2016-07-18 05:59:44

标签: sql sql-server

我有两张桌子A和B.

包含

的表格
jmp

B表包含

postid,postname,CategoryURl

对于一个postid,分配了多个CategoryImageURL。我想在表A中显示CategoryImageURL但是对于一个postid应该有CategoryImageURL1,CategoryImageURL2应该是那个。

我想为一个postid实现一对多的关系然后在sql函数中应该返回什么逻辑?

2 个答案:

答案 0 :(得分:1)

在我看来,您似乎想要在一行中显示第二个表的所有相关CategoryImageURL,并使用分隔符(在本例中为逗号)? 然后你需要在那里进行递归操作。也许CTE(Common Table Expression)可以解决问题。见下文。我已经在第二个表中添加了另一个键,以便能够检查第二个表的所有行是否已经为第一个表中的相应行处理。

也许这会有所帮助:

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

答案 1 :(得分:0)

你问的是错误的问题。这是关于正常化的。

目前,您有冗余吗?每个postname和categoryURL由ID字段表示。

无论出于何种原因,这些表将CategoryImageUrl分隔为自己的表,并将其链接到每组postname和categoryURL。

如果关系实际上是每个帖子名的一个id,那么您可以通过将ColumnImageUrl列添加到第一个表来对表进行非规范化。

Postid,postname,CategoryURL,CategoryImageUrl

或者,如果您希望保持规范化,请将类似字段组合到自己的表中,如下所示:

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

现在,它将CategoryURL组合在一起,但使用存在多个CategoryURL的冗余。但是,Postid只有一个CategoryUrl。

要在表格中删除此冗余,我们可以使用Star Schema策略,如下所示:

-- Post Table
Postid, postname

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

-- Fact Table
Postid, CategoryID, CategoryImageURL

免责声明:当然,我假设您的数据方面可能已关闭。但是,规范化的策略仍然是一样的。

另外,请记住 SQL是关系型的,并处理数据集。继承与关系集理论不相容。每个表都可以向前和向后查询,就像书中每个页面和章节被视为书的一部分一样。在任何时候我们都不会看到一本独立于一本书的章节。