Oracle / SQL - 将一个表多次连接到同一个表

时间:2011-06-30 21:43:16

标签: oracle join

我正试图围绕一个问题包围我的大脑,并希望你能提供帮助。我有两个表:customer_table和product_table,看起来像这样

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

所以我想要做的是返回所有客户的清单,这些客户至少有一个产品的SKU出现在产品表中。因此,根据上述信息,我会收到

的记录

鲍勃

贾斯汀

任何想法如何做到这一点?

4 个答案:

答案 0 :(得分:5)

无需加入一个表两次:

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关系。

答案 1 :(得分: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)

答案 2 :(得分: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

答案 3 :(得分:0)

您可以使用alias

加入表格
select * from mytable a, mytable b where condition