2010-05-16 49 views
5

varsayalım ben MySQL şöyle Tablom denilen tablo vardır: Her Id için ben tip C olan olan yeni bir satır eklemek istediğiniz,takın yeni bir satır

+----+------+-------+ 
| Id | Type | Value | 
+----+------+-------+ 
| 0 | A |  1 | 
| 0 | B |  1 | 
| 1 | A |  2 | 
| 1 | B |  3 | 
| 2 | A |  5 | 
| 2 | B |  8 | 
+----+------+-------+ 

Ve Value, aynı Id satırlarının A ve B değerlerinin toplamıdır. Bu tablodaki birincil anahtar (Id, Type), dolayısıyla Id, Type çiftlerinin çoğaltılmasıyla ilgili bir soru yok.

Ben bu sorgu ile istediğiniz satırları oluşturabilirsiniz:

SELECT MyTable_A.Id AS Id, 'C' AS Type, (A_Val + B_Val) AS Value FROM 
     (SELECT Id, Value AS A_Val FROM MyTable WHERE Type='A') AS MyTable_A 
    JOIN (SELECT Id, Value AS B_Val FROM MyTable WHERE Type='B') AS MyTable_B 
    ON MyTable_A.Id = MyTable_B.Id 

Verilmesi:

+----+------+-------+ 
| Id | Type | Value | 
+----+------+-------+ 
| 0 | C |  2 | 
| 1 | C |  5 | 
| 2 | C | 13 | 
+----+------+-------+ 

Ama soru şudur: Ben eklemek için bu sonucu nasıl kullanırım C satır tip üretilen MyTable içine?

Bunu bir sorgu ile yapmak için nispeten basit bir yol var mı, yoksa saklı bir yordam yazmam gerekiyor mu? Ve eğer ikincisiyse, rehberlik yardımcı olacaktır, çünkü bende çok iyi bir şekilde bilgili değilim.

+0

Bu, verilerinizi normalleştirecektir. Bunu neden yapmak istiyorsun? A ve B değiştiğinde ne olacak? Birisi C'leri değiştirebilir mi? –

+0

Bunun nedeni, C 'nin "A + B" olarak tanımlanması ve tablolardaki tüm girişlerin şu anda "A" ve "B" değerlerine sahip olması, yalnızca "C" nin bilinen gelecekteki girişleri olacaktır. ve 'A' ve 'B' bileşenlerinin arızalarını belirlemenin hiçbir yolu yoktur. Bunun anlamı, 'A' ve 'B' *' nin * biliniyor olduğu yerdeki ekleme ve güncellemeler için' C = A + B' olmasını sağlayan harici doğrulama mantığını uygulamak zorunda olduğumun farkındayım. –

cevap

4

. Örneğin:

insert into MyTable (Id,Type,Value) 
    select MyTable_A.Id, 'C', (A_Val + B_Val) from ... 

sorgu aslında doğru olduğunu varsayarak - O :-) ayrıca örnek olarak

hiçbir değerlendirme,

insert into MyTable (Id,Type,Value) 
    select Id+1000, 'C', Value from MyTable where Type = 'A' 

aşağıdaki satırları eklersiniz olun:

+------+------+-------+ 
| Id | Type | Value | 
+------+------+-------+ 
| 1000 | C |  1 | 
| 1001 | C |  2 | 
| 1002 | C |  5 | 
+------+------+-------+ 
+0

Mükemmel! Basit ve hatta ön-madde olarak benim de “varsayılan değerlerini almak istediğim tabloda başka sütunlar varsa ne yapmalıyım? –

2

Sadece select deyimi önce aşağıdaki satırı ekleyin: Bunu sadece seçme bir ekleme üzerine (biraz "sen as maddelerini ihtiyacımız yok" gibi değiştirilmiş) ekleyebilirsiniz

INSERT MyTable (Id, Type, Value)