MySQL查询1NF表

时间:2012-10-02 10:08:26

标签: mysql

我有一个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)
)

首先,这个查询运行了很长时间,似乎没有终止(或者至少没有在合理的时间内),其次我觉得它不正确。

1 个答案:

答案 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