2016-04-04 21 views
1

Birçok kaydın birleştirildiği bir veritabanımız var. Ve bir kişinin birçok birleşik kimliğe sahip olması alışılmadık bir durum değildir. Her kişinin ilk kimliğini ve en son kimliğini takip eden bir tablo oluşturmak istiyorum. Bunu yapmanın en iyi yolunun olduğunu düşünüyorum ama WHILE döngüsünü nasıl yazacağımı bilmiyorum.WHERE döngüsü, plsql'de [select by connection] ile ilgili önceki ifadeye göre nasıl kullanılır?

Orijinal tablo aşağıdaki gibidir:

Table1 
old_id new_id 
001  001 
002  002 
001  003 
004  004 
003  005 
005  006 

Birincisi, ben Sonra

Table2 
old_id new_id 
001  001 
002  002 
004  004  

Ben döngü istiyorum deyimi kadar olmalıdır ki çalıştırdıktan sonra

CREATE Table2 AS 
SELECT * 
FROM Table1 
WHERE old_id = new_id 
; 

çalıştırmak Yapmak için daha fazla güncelleme yok:

UPDATE Table2 
SET new_id = (SELECT b.new_id 
       FROM Table1 AS a 
       JOIN Table1 AS b ON b.old_id = a.new_id 
       WHERE b.old_id != b.new_id) 
; 

ben kurmaya çalışıyorum çıkan tabloya elde edene kadar: Yardımlarınız için şimdiden

Table2 
old_id new_id 
001  006 
002  002 
004  004 

teşekkürler.

+0

"Önceden bağlan" a bakın Bir hiyerarşiyi taramanıza olanak sağlar – xQbert

cevap

3

Oracle Kurulumu

CREATE TABLE Table1 (old_id, new_id) AS 
SELECT '001', '001' FROM DUAL UNION ALL 
SELECT '002', '002' FROM DUAL UNION ALL 
SELECT '001', '003' FROM DUAL UNION ALL 
SELECT '004', '004' FROM DUAL UNION ALL 
SELECT '003', '005' FROM DUAL UNION ALL 
SELECT '005', '006' FROM DUAL; 

CREATE TABLE Table2 (old_id, new_id) AS 
SELECT CONNECT_BY_ROOT(old_id), 
     new_id 
FROM table1 
WHERE CONNECT_BY_ISLEAF = 1 
START WITH old_id = new_id 
CONNECT BY NOCYCLE PRIOR new_id = old_id; 

Sorgu

SELECT * FROM TABLE2; 

Çıktı:

OLD_ID NEW_ID 
------ ------ 
001 006  
002 002  
004 004 

Görünüm olarak:

@ xQbert'in önerisine göre, bir tablodan ziyade bir görünüm olarak oluşturabilirsiniz, böylece güncel kalır.

CREATE VIEW View_Of_Table1(old_id, new_id) AS 
SELECT CONNECT_BY_ROOT(old_id), 
     new_id 
FROM table1 
WHERE CONNECT_BY_ISLEAF = 1 
START WITH old_id = new_id 
CONNECT BY NOCYCLE PRIOR new_id = old_id; 
+0

Nice! ama neden sadece bir görünüm olarak yaratmıyoruz, bu yüzden güncel kalıyor: P – xQbert

+0

@xQbert OP bir masa oluşturma hakkında konuşuyordu, ben de bunu yaptım ama bir an vereyim ve cevabım için bir görünüm ekleyeceğim . – MT0