SQL table 字段中的服务器多项选择 parent table

SQL Server multiple choice in table field to parent table

我有两个 table 合二为一 SQL-database。一个 parent table 调用 dbo.tab_authors 和一个 child table 调用 dbo.tab_articles.

table 是这样定义的:

dbo.tab_authors:
    (PK) ID                 int
         Name               string

dbo.tab_articles:
    (PK) ID                 int
         Title              string
    (FK) Author_first       int
    (FK) Authors_further    int

dbo.tab_articles 中,我想 select 来自 dbo.tab_authors 的相应作者。 Author_first(一篇文章的第一作者)和 Authors_further(所有其余作者)有外键 (FK) 到 dbo.tab_authors 的主键 (FK) ID。但是在 Author_first 中有一个 1:1 关系,在 Authors_furhter 中我想安装一个 1:n 关系到 parent table dbo.tab_authors.

让我们以以下数据集为例

dbo.tab_authors:
    ID            Name
    1             Author the First
    2             Author the Second
    3             Author the Third

dbo.tab_articles
    ID   Title                     Author_first             Authors_further
    1    Important Article         1                        2;3
    2    More Important Article    2                        1;3
    3    Most Important Article    3                        1;2

问题:

如何定义SQL中dbo.tab_articles.Authors_furtherdbo.tab_authors.ID的关系? (我正在使用 MS SQL Server Managment Studio 18.8)

如有任何建议,我将不胜感激!

正如我在评论中提到的,您需要一个桥梁 table 来管理多对多关系。这意味着您的设计看起来像这样:

CREATE TABLE dbo.Author (ID int IDENTITY NOT NULL,
                         [Name] nvarchar(100));
GO
ALTER TABLE dbo.Author ADD CONSTRAINT PK_Author PRIMARY KEY (ID);
GO
CREATE TABLE dbo.Article (ID int IDENTITY NOT NULL,
                          Title nvarchar(50),
                          PrimaryAuthor int);
GO
ALTER TABLE dbo.Article ADD CONSTRAINT PK_Article PRIMARY KEY (ID);
ALTER TABLE dbo.Article ADD CONSTRAINT FK_ArticleAuthor FOREIGN KEY (PrimaryAuthor) REFERENCES dbo.Author (ID);
GO
CREATE TABLE dbo.ArticleSecondaryAuthor (AuthorID int NOT NULL,
                                         ArticleID int NOT NULL);
GO
ALTER TABLE dbo.ArticleSecondaryAuthor ADD CONSTRAINT PK_ArticleSecondaryAuthor PRIMARY KEY (AuthorID,ArticleID);
ALTER TABLE dbo.ArticleSecondaryAuthor ADD CONSTRAINT FK_ArticleSecondaryAuthor_Author FOREIGN KEY (AuthorID) REFERENCES dbo.Author (ID);
ALTER TABLE dbo.ArticleSecondaryAuthor ADD CONSTRAINT FK_ArticleSecondaryAuthor_Article FOREIGN KEY (ArticleID) REFERENCES dbo.Article (ID);

那么您的数据可能如下所示:

INSERT INTO dbo.Author ([Name])
VALUES('John Smith'),('Jane Bloggs'),('Ashley Brown');
GO
INSERT INTO dbo.Article (Title,PrimaryAuthor)
VALUES('How to build a Boat',2),
      ('Relaxing to blues',1),
      ('How I lost my hair and back',1);
GO

INSERT INTO dbo.ArticleSecondaryAuthor (AuthorID,ArticleID)
VALUES(2,2),
      (3,2),
      (3,3);

为了展示您将如何获取数据,您可以按照以下方式之一进行操作:

--Multiple Joins to Author
SELECT A.Title,
       AA.[Name],
       STRING_AGG(SA.Name,', ') WITHIN GROUP (ORDER BY SA.ID) AS SecondaryAuthors
FROM dbo.Article A
     JOIN dbo.Author AA ON A.PrimaryAuthor = AA.ID
     LEFT JOIN dbo.ArticleSecondaryAuthor ASA ON A.ID = ASA.ArticleID
     LEFT JOIN dbo.Author SA ON ASA.AuthorID = SA.ID
GROUP BY A.ID, --Just in case of articles with the same name
         A.Title,
         AA.Name;
GO
--Conditional Aggregation
SELECT A.Title,
       MAX(CASE A.PrimaryAuthor WHEN AA.ID THEN AA.Name END),
       STRING_AGG(CASE A.PrimaryAuthor WHEN AA.ID THEN NULL ELSE AA.Name END,', ') WITHIN GROUP (ORDER BY AA.ID) AS SecondaryAuthors
FROM dbo.Article A
     LEFT JOIN dbo.ArticleSecondaryAuthor ASA ON A.ID = ASA.ArticleID
     JOIN dbo.Author AA ON AA.ID IN (A.PrimaryAuthor,ASA.AuthorID)
GROUP BY A.ID, --Just in case of articles with the same name
         A.Title,
         A.PrimaryAuthor;

db<>fiddle