2014-01-09 117 views
2

好吧,所以我有兩張表。一個表格(table 1)包含一列Books_Owned_ID,其中以1,3,7的形式存儲一系列數字。我有另一個表(table 2),它將書名存儲在一列中,書的ID存儲在另一列中。SQL交叉表引用

我想要做的是創建一個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| 
+0

您正在使用什麼數據庫與返回的用戶所擁有的所有的書叫什麼名字? – user2989408

+0

是'Books_Owned_Id'和'Book_ID'的標籤是一樣的嗎?如果是這樣,您可以加入他們 –

+1

「Books_Owned_ID」中的值是否真的是「Book_ID」的逗號分隔列表?如果是這樣,那就是爲什麼你有麻煩。您需要一個連接「表格1」和「表格2」的第三個一對多表格。 – David

回答

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視爲Integer而不是包含列表的字符串 - 因此您不必擔心字符串操作來執行查詢。

下將Id = 1

SELECT Books.Name 
FROM BooksOwned 
     INNER JOIN Books 
      ON BooksOwned.BookId = Books.Id 
WHERE BooksOwned.UserId = 1 
+1

正是我所指的!感謝您的幫助@Basic – user2980316

+1

我的榮幸 - 找到想要了解的人總是很高興。希望將來能見到你。 – Basic

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

我將獲得逗號分割的工作列工作。這對於這個不會太多。

EDIT 2See 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) 
+0

但這不會爲您提供以逗號分隔的書名列表。 – user2989408

+0

以先前的問題爲例,更新了答案,這些問題將逗號分隔的字段拆分並可以使用。 – ProfessionalAmateur

+1

如果他想將這些結果轉換回逗號列表,他可以使用FOR XML作爲我的答案:http://stackoverflow.com/a/1785923/215752 – Hogan

1

你需要一個函數,它接受一個逗號分隔的列表,並返回一個表。這是緩慢的,根本上是一個壞主意。實際上,所有這些都是將它轉換成像我在下面描述的數據模型。 (有關這方面的例子,請參閱ProfessionalAmateur的答案)。

如果您剛開始更改數據模型。製作一個鏈接表。像這樣:

好的,所以我有兩張桌子。一個表(表1)包含一列Book_Owned_ID,其存儲一系列以1,3,7形式的數字。我有另一個表(表2),它將書名存儲在一列中,書的ID存儲在另一列中。

我想要做的是創建一個SQL代碼,它將從Books_Owned_ID中獲取數字,並在新列中顯示這些書籍的名稱。像這樣:

人表

|First_Name| Last_Name| Person_ID | 

書表

|Book_Name|Book_ID| 

PersonBook表

|PersonID|BookID| 

此表可以爲每個人多行。