0

我有一个包含大量记录(~20k)的 MySQL 表,它在 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)
)

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

4

1 回答 1

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
于 2012-10-02T10:17:46.227 回答