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_further
和dbo.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;
我有两个 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_further
和dbo.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;