2011-02-10 16 views
0

我有三個表:tblProduct,lkpFoodgroup,tblCustomer。和一個結表:jctCustomerFoodgroup加入三個表並試圖獲得空值

的列是這樣的:

**tblProduct** 
+---+----------------+ 
|PK |int_ProductID | 
|FK |int_FoodgroupID | 
| |str_ProductName | 
+---+----------------+ 

**lkpFoodgroup** 
+---+-------------------+ 
|PK |int_FoodgroupID | 
| |str_FoodgroupHandle| 
+---+-------------------+ 

**tblCustomer** 
+---+----------------+ 
|PK |int_CustomerID | 
| |str_CustomerName| 
+---+----------------+ 

**jctCustomerFoodgroup** 
+---+----------------+ 
|PK |int_CustomerID | 
|PK |int_FoodgroupID | 
| |int_ProductID | 
+---+----------------+ 

其中最簡單的表是查詢:

**lkpFoodgroup** 
+---------------+-------------------+ 
|int_FoodgroupID|str_FoodgroupHandle| 
+---------------+-------------------+ 
|1    |fruit    | 
|2    |meat    | 
|3    |bread    | 
|4    |cheese    | 
+---------------+-------------------+ 

接下來是客戶:

**tblCustomer** 
+----------------+-------------------+ 
|int_CustomerID |str_CustomerName | 
+----------------+-------------------+ 
|1    |Bob    | 
|2    |Sally    | 
|3    |Jane    | 
|4    |Billy    | 
+----------------+-------------------+ 

在tblProduct上可以有許多與Foodgroup相同的產品。還可以有一些產品Foodgroups沒有產品在其中:

**tblProduct** 
+---------------+-----------------+----------------+ 
|int_ProductID |int_FoodgroupID |str_ProductName | 
+---------------+-----------------+----------------+ 
|1    |1    |apple   | 
|2    |1    |banana   | 
|3    |1    |orange   | 
|4    |1    |pear   | 
|5    |2    |chicken   | 
|6    |2    |beef   | 
|7    |2    |fish   | 
|8    |2    |turkey   | 
|9    |3    |white   | 
|10    |3    |wheat   | 
+---------------+-----------------+----------------+ 

在接線表中的PK是一個組合int_CustomerID和int_FoodgroupID - 這意味着任何用戶只能選擇每Foodgroup一個產品:

**jctCustomerFoodgroup** 
+---------------+-----------------+--------------+------------------------+ 
|int_CustomerID |int_FoodgroupID |int_ProductID | --meaning    | 
+---------------+-----------------+--------------+------------------------| 
|1    | 1    |1    | --Bob, fruit, apple | 
|1    | 2    |6    | --Bob, meat, beef  | 
|1    | 3    |9    | --Bob, bread, white | 
|2    | 1    |3    | --Sally, fruit, orange | 
|2    | 2    |5    | --Sally, meat, chicken | 
|3    | 1    |3    | --Jane, fruit, orange | 
|3    | 3    |9    | --Jane, bread, white | 
|3    | 2    |6    | --Jane, meat, beef  | 
+---------------+-----------------+--------------+------------------------+ 

我要尋找一個查詢,這將給我這樣的結果:

**spGetCustomerProductSelections(1) --Get Bob's choices** 
+----------------+---------------+-------------------+-------------+---------------+ 
|int_CustomerID |int_FoodgroupID|str_FoodgroupHandle|int_ProductID|str_ProductName| 
+----------------+---------------+-------------------+-------------+---------------+ 
|1    |1    |fruit    |1   |apple   | 
|1    |2    |meat    |6   |beef   | 
|1    |3    |bread    |9   |white   | 
|1    |4    |cheese    |null   |null   | 
+----------------+---------------+-------------------+-------------+---------------+ 

**spGetCustomerProductSelections(2) --Get Sally's choices** 
+----------------+---------------+-------------------+-------------+---------------+ 
|int_CustomerID |int_FoodgroupID|str_FoodgroupHandle|int_ProductID|str_ProductName| 
+----------------+---------------+-------------------+-------------+---------------+ 
|2    |1    |fruit    |3   |orange   | 
|2    |2    |meat    |5   |chicken  | 
|2    |3    |bread    |null   |null   | 
|2    |4    |cheese    |null   |null   | 
+----------------+---------------+-------------------+-------------+---------------+ 

**spGetCustomerProductSelections(4) --Get Billy's choices** 
+----------------+---------------+-------------------+-------------+---------------+ 
|int_CustomerID |int_FoodgroupID|str_FoodgroupHandle|int_ProductID|str_ProductName| 
+----------------+---------------+-------------------+-------------+---------------+ 
|4    |1    |fruit    |null   |null   | 
|4    |2    |meat    |null   |null   | 
|4    |3    |bread    |null   |null   | 
|4    |4    |cheese    |null   |null   | 
+----------------+---------------+-------------------+-------------+---------------+ 

任何幫助嗎?

+0

如果您生成了創建和插入語句而不是僅數據,那麼您將獲得更多吸引力。 – RichardTheKiwi 2011-02-10 03:11:59

+1

[WTF much](http://thedailywtf.com/Articles/adjYour_adjDaily_nCup_prOf_adjAkWTF.aspx)? – outis 2011-02-10 03:29:59

回答

0

請不要將您的程序命名爲「sp」。它將開始在主數據庫中進行搜索,然後纔會返回到數據庫。

DDL爲您的架構和數據

create table lkpFoodgroup 
(int_FoodgroupID int, str_FoodgroupHandle varchar(max)) 
insert lkpFoodgroup values 
(1,'fruit'), 
(2,'meat'), 
(3,'bread'), 
(4,'cheese'); 

create table tblCustomer 
(int_CustomerID int, str_CustomerName varchar(max)) 
insert tblCustomer values 
(1,'Bob'), 
(2,'Sally'), 
(3,'Jane'), 
(4,'Billy'); 

create table tblProduct 
(int_ProductID int, int_FoodgroupID int, str_ProductName varchar(max)) 
insert tblProduct values 
(1,'1','apple'), 
(2,'1','banana'), 
(3,'1','orange'), 
(4,'1','pear'), 
(5,'2','chicken'), 
(6,'2','beef'), 
(7,'2','fish'), 
(8,'2','turkey'), 
(9,'3','white'), 
(10,'3','wheat'); 

create table jctCustomerFoodgroup 
(int_CustomerID int, int_FoodgroupID int, int_ProductID varchar(max)) 
insert jctCustomerFoodgroup values 
(1,'1','1'), 
(1,'2','6'), 
(1,'3','9'), 
(2,'1','3'), 
(2,'2','5'), 
(3,'1','3'), 
(3,'3','9'), 
(3,'2','6'); 

的存儲過程的代碼

create proc uspGetCustomerProductSelections @customerID int as 
select c.int_CustomerID, l.int_FoodgroupID, l.str_FoodgroupHandle, j.int_ProductID, p.str_ProductName 
from tblCustomer c 
cross join lkpFoodgroup l 
left join jctCustomerFoodgroup j on j.int_CustomerID = c.int_CustomerID and j.int_FoodgroupID = l.int_FoodgroupID 
left join tblProduct p on p.int_ProductID = j.int_ProductID 
where c.int_CustomerID = @customerID 

樣品執行

exec uspGetCustomerProductSelections 1 

輸出

int_CustomerID int_FoodgroupID str_FoodgroupHandle int_ProductID str_ProductName 
-------------- --------------- --------------------------------------------------- 
1    1    fruit    1    apple 
1    2    meat     6    beef 
1    3    bread    9    white 
1    4    cheese    NULL   NULL 
0

您應該使用外連接(左,右或全部)。這些連接將包含空值。