2011-06-30 39 views
0

我試圖圍繞查詢包裝我的大腦,並希望能夠提供幫助。我有兩個表:一個CUSTOMER_TABLE和product_table看起來像這樣Oracle/SQL - 多次將表添加到同一個表中

name sku_num1 sku_num2 sku_num3 sku_num4 
----------------------------------------------------  
Bob  A   B   C   D 
Frank E   A 
Tom  G 
Shelly G   E 
Justin E   G   A 

sku_num  widget_name 
------------------- 
A   widget_a 
B   widget_b 
C   widget_c 
D   widget_d 

所以我想要做的是返回所有誰擁有至少1產品,其SKU出現在產品表中的客戶名單。因此,與上述信息,我會收回該記錄

鮑勃

弗蘭克

賈斯汀

任何想法如何做到這一點?

回答

4

沒有必要加入一個表兩次:

SELECT * 
FROM customers 
WHERE sku_num1 IN (SELECT sku_num 
        FROM product_table) 
    OR sku_num2 IN (SELECT sku_num 
        FROM product_table) 
    .... 

爲什麼你需要多個條件的原因,對product_table執行全表掃描是您的錯誤數據庫設計。客戶購買的產品不應進入顧客列表中的多列。相反,您應該有第三個表格,它是客戶和產品之間的N:M關係。

+0

+1,這是我首先想到的關於破壞關係模型的評論。 –

+0

我同意這是壞的設計,而不是我的做法;謝謝你的想法,但! – dscl

+0

@dscl:在開始項目之前,確保你修復了破碎的設計。 –

0

您可以通過加入一個表本身就是一個alias

select * from mytable a, mytable b where condition 
+0

我可能沒有寫清楚主題行。我需要多次將一張桌子'A'加入到另一張桌子'B'中。即使我可以做...這是我不確定如何完成我的查詢的其他部分。 – dscl

3

像這樣的事情不行嗎?

select name 
from customer c, products p 
where (c.sku_num1 = p.sku) 
or (c.sku_num2 = p.sku) 
or (c.sku_num3 = p.sku) 
or (c.sku_num4 = p.sku) 
+0

如果其他產品中存在多個產品,則會爲每個客戶返回多條記錄。讓它「選擇不同的名字......」。 –

+1

你也可以在(c.sku_num1,c.sku_num2,c.sku_num3,c.sku_num4)中做p.sku –

1

克里斯托弗, 這是否意味着你只是在尋找任何客戶那裏sku_num1或sku_num2或sku_num3或sku_num4不爲空?

如果是這樣的話,你可以用兩種不同的方法做到這一點。

select * from customers 
    where sku_num1 is not null 
    or sku_num2 is not null 
    or sku_num3 is not null 
    or sku_num4 is not null 

如果你想看看他們是否已經下令從特定產品清單的東西,你可以修改這:

select * from customers 
    where sku_num1 in (select sku_num from skus) 
    or sku_num2 in (select sku_num from skus) 
    or sku_num3 in (select sku_num from skus) 
    or sku_num4 in (select sku_num from skus) 

順便說一句,這就是爲什麼人們通常不喜歡結構表這個。應該有另一個連接表,因爲沒有更好的稱之爲customer_skus,它將客戶和skus連接在一起,並且只有一個customerID和一個sku_num。

這會使查詢更易於編寫,讀取和維護。該查詢看起來像這樣:

select distinct name from customers, customer_skus, skus 
    where customers.id = customer_skus.id 
    and customer_skus.sku_num = skus.sku_num 
相關問題