2011-06-30 21 views
0

私は自分の頭脳を質問の周りに入れて、助けてくれると期待しています。私は2つのテーブルを持っている:この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 

ように見えるCUSTOMER_TABLEとproduct_tableだから私は何をしたいSKUの製品テーブルに表示され、少なくとも1つの製品を持っているすべての顧客のリストを返すです。したがって、上記の情報を私は

ボブ

のレコードをバック受け取ることになるフランク

ジャスティン

任意のアイデアこれを行うにはどのように?

答えて

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関係である第3の表が必要です。

+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がnullでなく、すべての顧客を探していることを意味するのでしょうか?

このような場合は、2通りの方法があります。

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 
関連する問題