0

1NFにある大量のレコード(〜20k)を含むMySQLテーブルがあります。残念ながら、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フィドルを参照):

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 に答える