我正试图围绕一个问题包围我的大脑,并希望你能提供帮助。我有两个表: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出现在产品表中。因此,根据上述信息,我会收到
的记录鲍勃
谢
贾斯汀
任何想法如何做到这一点?
答案 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