我有一个MySQL表,有大量的记录(~20k),这是1NF。不幸的是,将它转换为2NF及以上并不是一个选择。
该表包含
等数据ClientName1 | ClientLastName1 | ClientZip1 | ... | Product1
ClientName1 | ClientLastName1 | ClientZip1 | ... | Product2
ClientName1 | ClientLastName1 | ClientZip1 | ... | Product3
ClientName2 | ClientLastName2 | ClientZip2 | ... | ProductX
ClientName3 | ClientLastName3 | ClientZip3 | ... | Product1
ClientName3 | ClientLastName3 | ClientZip3 | ... | Product2
ClientName4 | ClientLastName4 | ClientZip4 | ... | Product2
ClientName4 | ClientLastName4 | ClientZip4 | ... | Product3
我想做的是获得至少拥有Product1的客户的所有产品。 因此,在上面的示例中,将是以下记录:
ClientName1 | ClientLastName1 | ClientZip1 | ... | Product1
ClientName1 | ClientLastName1 | ClientZip1 | ... | Product2
ClientName1 | ClientLastName1 | ClientZip1 | ... | Product3
ClientName3 | ClientLastName3 | ClientZip3 | ... | Product1
ClientName3 | ClientLastName3 | ClientZip3 | ... | Product2
现在让我们假设(ClientName,ClientLastname)对每个客户端都是唯一的。 假设表名是客户端
,我使用了以下查询SELECT
ClientID
FROM
clients cl
WHERE (ClientName,ClientLastname)
IN (
SELECT ClientName, ClientLastname
FROM clients
GROUP BY ClientName,ClientLastname,Product
HAVING Product IN (Product1ID)
)
首先,这个查询运行了很长时间,似乎没有终止(或者至少没有在合理的时间内),其次我觉得它不正确。
答案 0 :(得分:3)
在一个理想的世界里,我的建议是尽可能地将这张桌子标准化。正如你所看到的,你有一堆桌子试图使用。
但你有没有试过这样的事情(见SQL Fiddle with Demo):
select c.ClientName,
c.ClientLastName,
c.ClientZip,
c.Product
from clients c
inner join
(
select ClientName
from clients
where Product = 'Product1'
) x
on c.ClientName= x.ClientName