Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL创建一对多视图_Sql Server_Tsql - Fatal编程技术网

Sql server SQL创建一对多视图

Sql server SQL创建一对多视图,sql-server,tsql,Sql Server,Tsql,我正在尝试在SQL Server中创建一个视图,以便在access中链接。我目前的发言是: CREATE VIEW BookInfo AS SELECT Book.Title, Author.AuthorFirst, Author.AuthorLast, Language.LanguageName FROM Book, Author, Translation, Language WHERE Aut

我正在尝试在SQL Server中创建一个视图,以便在access中链接。我目前的发言是:

CREATE VIEW BookInfo 
AS
    SELECT 
        Book.Title, Author.AuthorFirst, Author.AuthorLast, 
        Language.LanguageName
    FROM 
        Book, Author, Translation, Language
    WHERE  
        Author.AuthorID = Book.Author 
        AND Translation.Book = Book.BookID 
        AND Language.LanguageID = Translation.Language;
我的预期(预期)输出:

除了一件事,所有的书都能用——五本书中有两本有多种语言。因此,当视图打开时,它们会被列出两次——但两次都使用相同的语言

Animal Farm, George, Orwell, English
Animal Farm, George, Orwell, English
我有4张表格:书、作者、翻译、语言。书有一个FK到作者(引用authorid),翻译有一个FK到书(bookID)和语言(languageID)。要让它列出一本书的每一个单独的翻译,我需要一个连接吗

编辑:示例数据和表脚本

CREATE TABLE Author (
AuthorID INT NOT NULL,
AuthorFirst VARCHAR (255) NOT NULL,
AuthorLast VARCHAR(255) NOT NULL
);

ALTER TABLE Author ADD CONSTRAINT PK_Author PRIMARY KEY (AuthorID);

CREATE TABLE Book (
BookID INT NOT NULL,
Title VARCHAR(255) NOT NULL,
Pages INT NOT NULL,
Author INT NOT NULL
);

ALTER TABLE Book ADD CONSTRAINT PK_Book PRIMARY KEY (BookID);

CREATE TABLE Language (
LanguageID INT NOT NULL,
Name VARCHAR(255) NOT NULL
);

ALTER TABLE Language ADD CONSTRAINT PK_Language PRIMARY KEY (LanguageID);

CREATE TABLE Translation (
TranslationID INT NOT NULL,
Book INT NOT NULL,
Language INT NOT NULL
);

ALTER TABLE Translation ADD CONSTRAINT PK_Translation PRIMARY KEY 
(TranslationID);

ALTER TABLE Book ADD CONSTRAINT FK_Book_0 FOREIGN KEY (Author) REFERENCES 
Author (AuthorID);

ALTER TABLE Translation ADD CONSTRAINT FK_Translation_0 FOREIGN KEY (Book) 
REFERENCES Book (BookID);

ALTER TABLE Translation ADD CONSTRAINT FK_Translation_1 FOREIGN KEY 
(Language) REFERENCES Language (LanguageID);

INSERT INTO Author (AuthorID, AuthorFirst, AuthorLast) VALUES (1, 'GEORGE', 
'ORWELL'), (2, 'WILLIAM', 'SHAKESPEARE'), (3, 'FREDERIC', 'BASTIAT');

INSERT INTO Language (LanguageID, Name) VALUES (1, 'ENGLISH'), (2, 
'JAPANESE'), (3, 'SPANISH');

INSERT INTO Book (BookID, Title, Pages, Author) VALUES (1, 'THE LAW', 50, 3), 
(2, '1984', 120, 1), (3, 'ANIMAL FARM', 240, 1), (4, 'HAMLET', 240, 2), (5, 
'THAT WHICH IS SEEN, AND THAT WHICH IS NOT SEEN', 58, 3);

INSERT INTO Translation (TranslationID, Book, Language) VALUES (1, 1, 1), (2,                             
2, 1), (3, 3, 1), (4, 3, 2), (5, 4, 1), (6, 5, 1), (7, 5, 3);

要使用显式连接语法,您的查询如下所示。请注意,我还使用了别名使它看起来更干净。我怀疑这仍然会返回一些副本,因为我怀疑您的数据存在一些问题

SELECT b.Title
    , a.AuthorFirst
    , a.AuthorLast
    , l.LanguageName
FROM Book b
join Author a on a.AuthorID = b.Author 
join Translation t on t.Book = b.BookID
join Language l on l.LanguageID = t.Language

你真的需要开始使用ANSI-92样式的连接,它们已经存在超过25年了!!!请原谅我的无知,我从工作和互联网上学到了我所理解的一点sql。所以我需要使用一个特定的join语句?这会是一个内部连接吗?是的,这是一个内部连接运行与您的模式,一切似乎都工作。奥威尔的《动物农场》被翻译成英语和日语。可能是数据问题?优秀的工作发布ddl和样本数据!!!!大多数人都想不出来。这是可行的,但你是对的,它仍然有重复的。我想知道为什么?。我对sql了解不够,无法理解它为什么会复制。翻译表对每本书的翻译都有一个单独的记录,因此从一本书到另一本书的翻译是一对多的。作为一个数据问题,您必须找到它。添加where子句以仅获取一本书。然后开始注释掉所有的连接,一次添加一个,直到得到重复的连接。要么是坏数据,要么是坏设计。没有更多的细节是不可能知道的。唯一的副本是有多个翻译的书,所以我认为这是设计。我想,在我弄明白之前,我得把它修修补补一下。非常感谢。那么一本被翻译成两种语言的书在翻译表中有两行?连接很可能是问题所在。你在什么地方没有写这本书的语言吗?还是原作的“翻译”?如果您可以共享表设计和复制问题的几行示例,那么修复这个问题可能非常简单。看看这篇文章,了解你应该发布什么。“翻译”和语言表有点用词不当——“语言”只是潜在语言的列表,翻译是每本书可用的语言。整个数据库很简单,所以我将发布一些表脚本和示例数据。
SELECT b.Title
    , a.AuthorFirst
    , a.AuthorLast
    , l.LanguageName
FROM Book b
join Author a on a.AuthorID = b.Author 
join Translation t on t.Book = b.BookID
join Language l on l.LanguageID = t.Language