SQL跨表引用

时间:2014-01-09 18:12:07

标签: sql sql-server

好的,所以我有两张桌子。一个表(table 1)包含一列Books_Owned_ID,它以1,3,7的形式存储一系列数字。我有另一个表(table 2),它将Book名称存储在一列中,书籍ID存储在另一列中。

我想要做的是创建一个SQL代码,该代码将从Books_Owned_ID中获取数字,并在新列中显示这些书籍的名称。像这样:

|New Column  |
 Book 1 Name
 Book 2 Name
 Book 3 Name

我无法解决这个问题,这很简单,但我看到的所有线程都让人感到困惑。

Table1包含以下列:

|First_Name| Last_Name| Books_Owned_ID |

Table2包含以下列:

|Book_Name|Book_ID|

3 个答案:

答案 0 :(得分:2)

您需要进行内部联接。 This is a great example/reference for these

SELECT Book_Name FROM Table2
INNER JOIN Table1
ON Table1.Books_Owned_ID = Table2.Book_ID

编辑 SQL Fiddle

我将努力让列逗号分割工作。这不会是额外的。

编辑2 See this answer to build a function to split your string.然后你可以这样做:

SELECT Book_Name FROM Table2 
WHERE Book_ID IN(SELECT FN_ListToTable(',',Table1.Books_Owned_ID) FROM Table1 s)

答案 1 :(得分:1)

您需要一个以逗号分隔的列表并返回表格的函数。这很慢,从根本上说是一个坏主意。实际上所有这一切都是将这种做法转换成我在下面描述的数据模型。 (有关此示例,请参阅ProfessionalAmateur的答案。)

如果您刚开始更改数据模型。制作链接表。像这样:

好的,所以我有两张桌子。一个表(表1)包含一列Books_Owned_ID,它以1,3,7的形式存储一系列数字。我有另一个表(表2),它将Book名称存储在一列中,书籍ID存储在另一列中。

我想要做的是创建一个SQL代码,该代码将从Books_Owned_ID中获取数字,并在新列中显示这些书籍的名称。像这样:

人员表

 |First_Name| Last_Name| Person_ID |

书桌

 |Book_Name|Book_ID|

PersonBook Table

 |PersonID|BookID|

此表可为每个人提供多行。

答案 2 :(得分:1)

其核心围绕数据规范化......每个事实只存储一次(因此是“权威的”)。你应该养成只在任何领域存储一个事实的习惯。

因此,想象下面的表格布局......

Books
    Id, Name, Description

Users
    Id, Username, EmailAddress, PasswordHash, etc....

BooksOwned
    UserId, BookId

因此,如果一个用户拥有多本图书,BooksOwned表中会有多个条目......

UserId, BookID
1, 1
1, 2
1, 3

表示用户1拥有书籍1到3。

这样做的原因是它使将来查询变得更容易。您还将BookId视为整数而不是包含列表的字符串 - 因此您无需担心字符串操作来执行查询。

以下内容将返回用户拥有Id = 1

所有图书的名称
SELECT Books.Name
FROM   BooksOwned
       INNER JOIN Books
           ON BooksOwned.BookId = Books.Id
WHERE  BooksOwned.UserId = 1