ÀÚµ¿
   
     

     
 
  
 
  ÃÖÁ¤Çö   0   247   2010-3-2 10:51
  ÀζóÀÎºä »ç¿ë ½Ã Äõ¸®½ÇÇà ¼ø¼­¿¡ ´ëÇÑ Á¶¾ð ºÎʵ右´Ï´Ù.
Á¦¸ñ ¾øÀ½

SQLÀ» ÀÛ¼ºÇÒ ¶§ ƯÁ¤ÇÑ ¼ø¼­´ë·Î TABLEÀÌ ¾×¼¼½º µÇ±â¸¦ ¿øÇÏ¿©

±× ¼ø¼­´ë·Î ÀζóÀκä·Î ¹­¾îÁشٰí ÇØµµ ½ÇÁ¦ ¼öÇà½Ã ¿ÉƼ¸¶ÀÌÀú´Â ÀζóÀκä·Î ¹­ÀÎ ¼ø¼­´ë·Î ¼öÇàÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó SQLÀ» REWIRTE Çϰí ÃÖÀûÀ̶ó°í ÆÇ´ÜµÇ´Â ¼ø¼­·Î ¼öÇàÀ» ÇÕ´Ï´Ù.

(¹°·Ð ROWNUM »ç¿ëÀ̳ª ORDERED, NO_MERGE µî ¿©·¯ ÈùÆ®¸¦ »ç¿ëÇÏ¿© ¿øÇÏ´Â ¼ø¼­´ë·Î °­Á¦ÇÒ ¼öµµ ÀÖ½À´Ï´Ù)

 

Áú¹®ÇϽаæ¿ì´Â ¾Æ¸¶µµ ±Ùº»ÀûÀ¸·Î ÀζóÀκäÀÇ ¹®Á¦¶ó±â º¸´Ù´Â

CONNECT BY Äõ¸®ÀÇ ¹®Á¦¶ó°í º¸¿©Áý´Ï´Ù.

ÀϹÝÀûÀÎ SQL ¿¡¼­ WHERE Àý¿¡ ÀÖ´Â »ó¼öÁ¶°ÇÀÌ µå¶óÀ̺ù Á¶°ÇÀÌ µÇÁö¸¸

CONNECT BY Äõ¸®¿¡¼­´Â Á¶±Ý ´Ù¸£°Ô ¼öÇàÀÌ µË´Ï´Ù.

 

¡Ø CONNECT BY Äõ¸®´Â ¾Æ·¡¿Í °°Àº ¼ø¼­·Î ¼öÇàÀÌ µË´Ï´Ù.

 

SELECT  *

FROM    ORGANIZATION

WHERE   ALIVE_DATE >= SYSDATE          --> 3. ÇÊÅ͸µ Á¶°Ç (µå¶óÀ̺ù Á¶°ÇÀÌ ¾Æ´Ô)

START WITH PARENT_DEPARTMENT_ID IS NULL                  --> 1. µå¶óÀ̺ù Á¶°Ç

CONNECT BY PRIOR DEPARTMENT_ID = PARENT_DEPARTMENT_ID;   --> 2. Á¶ÀÎ Á¶°Ç

 

 

±×·±µ¥ °æ¿ì¿¡ µû¶ó CONNECT BY Äõ¸®ÀÇ ¼öÇà°á°ú°¡ ¿øÇÏ´Â °á°ú¿Í

´Ù¸¥ °æ¿ì°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.

 

¿¹¸¦ µé¾î º¸°Ú½À´Ï´Ù.

 

 

CREATE TABLE ORGANIZATION

(

 DEPARTMENT_ID        NUMBER,

 ALIVE_DATE           DATE,

 DEPARTMENT_NAME      VARCHAR2(30),

 PARENT_DEPARTMENT_ID NUMBER

);

 

ALTER TABLE ORGANIZATION

ADD CONSTRAINTS ORGANIZATION_PK PRIMARY KEY (DEPARTMENT_ID, ALIVE_DATE)

USING INDEX NOLOGGING;

 

 

INSERT INTO ORGANIZATION

VALUES (1, TO_DATE('99991231','YYYYMMDD'), '¿£ÄÚ¾ÆÄÁ¼³ÆÃ', NULL);

 

INSERT INTO ORGANIZATION

VALUES (2, TO_DATE('20091231','YYYYMMDD'), 'ÄÁ¼³ÆÃº»ºÎ(OLD)', 1);

 

INSERT INTO ORGANIZATION

VALUES (3, TO_DATE('99991231','YYYYMMDD'), '1»ç¾÷ºÎ(OLD)', 2);

 

INSERT INTO ORGANIZATION

VALUES (4, TO_DATE('99991231','YYYYMMDD'), '2»ç¾÷ºÎ(OLD)', 2);

 

INSERT INTO ORGANIZATION

VALUES (5, TO_DATE('99991231','YYYYMMDD'), 'ÄÁ¼³ÆÃ»ç¾÷ºÎ(NEW)', 1);

 

INSERT INTO ORGANIZATION

VALUES (6, TO_DATE('99991231','YYYYMMDD'), '1»ç¾÷ºÎ(NEW)', 5);

 

INSERT INTO ORGANIZATION

VALUES (7, TO_DATE('99991231','YYYYMMDD'), '2»ç¾÷ºÎ(NEW)', 5);

 

 

 

¿£ÄÚ¾ÆÄÁ¼³ÆÃÀ̶õ ȸ»ç¿¡¼­ 2010³â¿¡ Á¶Á÷°³ÆíÀ¸·Î ÀÎÇØ ±âÁ¸ Á¶Á÷À»

INVALID ó¸®ÇÏ°í »õ·Î¿î Á¶Á÷Äڵ带 »ý¼ºÇß½À´Ï´Ù.

 

 

-- OLD Á¶Á÷ ±¸¼º

 

(1) ¿£ÄÚ¾ÆÄÁ¼³ÆÃ ---> (2) ÄÁ¼³ÆÃº»ºÎ(OLD) ---> (3) 1»ç¾÷ºÎ(OLD)

                                          |

                                          ---> (4) 2»ç¾÷ºÎ(OLD)

 

-- NEW Á¶Á÷ ±¸¼º

 

(1) ¿£ÄÚ¾ÆÄÁ¼³ÆÃ ---> (5) ÄÁ¼³ÆÃº»ºÎ(NEW) ---> (6) 1»ç¾÷ºÎ(NEW)

                                          |

                                          ---> (7) 2»ç¾÷ºÎ(NEW)

 

 

¾ïÁö·Î(?) »óȲÀ» ¸¸µé±â À§Çؼ­ OLD Á¶Á÷ÀÎ

"1»ç¾÷ºÎ(OLD)", "2»ç¾÷ºÎ(OLD)" ÀÇ ALIVE_DATE ¸¦ '20091231' ·Î ¼³Á¤ÇÏÁö ¾Ê°í

»óÀ§ Á¶Á÷ÀÎ "ÄÁ¼³ÆÃº»ºÎ(OLD)" ¸¸ '20091231' ·Î ¼³Á¤ÇÏ¿© INVALID 󸮸¦

Çß½À´Ï´Ù.

 

 

 

1. SQL Å×½ºÆ® 1

 

SELECT  *

FROM    ORGANIZATION

WHERE   ALIVE_DATE >= SYSDATE

START WITH PARENT_DEPARTMENT_ID IS NULL

CONNECT BY PRIOR DEPARTMENT_ID = PARENT_DEPARTMENT_ID;

 

SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY);

 

-------------------------------------------------------------------------------------------

| Id  | Operation                  | Name         | Rows  | Bytes | Cost (%CPU)| Time     |

-------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT           |              |     1 |    47 |     2   (0)| 00:00:01 |

|*  1 |  FILTER                    |              |       |       |            |          |

|*  2 |   CONNECT BY WITH FILTERING|              |       |       |            |          |

|*  3 |    FILTER                  |              |       |       |            |          |

|   4 |     TABLE ACCESS FULL      | ORGANIZATION |     1 |    47 |     2   (0)| 00:00:01 |

|*  5 |    HASH JOIN               |              |       |       |            |          |

|   6 |     CONNECT BY PUMP        |              |       |       |            |          |

|   7 |     TABLE ACCESS FULL      | ORGANIZATION |     1 |    47 |     2   (0)| 00:00:01 |

-------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 - filter("ALIVE_DATE">=SYSDATE@!)

   2 - access("PARENT_DEPARTMENT_ID"=PRIOR "DEPARTMENT_ID")

   3 - filter("PARENT_DEPARTMENT_ID" IS NULL)

   5 - access("PARENT_DEPARTMENT_ID"=PRIOR "DEPARTMENT_ID")

 

 

-- ¼öÇà°á°ú

 

Department_id   Alive_date    Department_name     Parent_department_id

----------------------------------------------------------------------

1               12/31/9999    ¿£ÄÚ¾ÆÄÁ¼³ÆÃ        

3               12/31/9999    1»ç¾÷ºÎ(OLD)        2

4               12/31/9999    2»ç¾÷ºÎ(OLD)        2

5               12/31/9999    ÄÁ¼³ÆÃ»ç¾÷ºÎ(NEW)   1

6               12/31/9999    1»ç¾÷ºÎ(NEW)        5

7               12/31/9999    2»ç¾÷ºÎ(NEW)        5

 

 

1¹ø SQLÀÇ ½ÇÇà°èȹÀ» º¸¸é, "PARENT_DEPARTMENT_ID IS NULL" Á¶°ÇÀ¸·Î

µå¶óÀ̺ù µÇ¾î CONNECT BY 󸮰¡ ¸ðµÎ ÀÌ·ç¾îÁø ÈÄ¿¡ ¸¶Áö¸·¿¡

"ALIVE_DATE >= SYSDATE" °¡ Àû¿ëµÈ °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.  

 

ÀÌ ºÎºÐ È®ÀÎ  -->  1 - filter("ALIVE_DATE">=SYSDATE@!)

 

ÀÌ·¸°Ô 󸮵Ǵ٠º¸´Ï ¿øÇÏÁö ¾Ê´Â "1»ç¾÷ºÎ(OLD)", "2»ç¾÷ºÎ(OLD)"

Á¶Á÷±îÁö SELECT °¡ µÇ°í ÀÖ½À´Ï´Ù.

 

 

 

2. SQL Å×½ºÆ® 2

 

SELECT  *

FROM   (SELECT  *

        FROM    ORGANIZATION

        WHERE   ALIVE_DATE >= SYSDATE

       )

START WITH PARENT_DEPARTMENT_ID IS NULL

CONNECT BY PRIOR DEPARTMENT_ID = PARENT_DEPARTMENT_ID;

 

SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY);

 

------------------------------------------------------------------------------------------

| Id  | Operation                 | Name         | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT          |              |     1 |    47 |     2   (0)| 00:00:01 |

|*  1 |  CONNECT BY WITH FILTERING|              |       |       |            |          |

|*  2 |   FILTER                  |              |       |       |            |          |

|*  3 |    TABLE ACCESS FULL      | ORGANIZATION |     1 |    47 |     2   (0)| 00:00:01 |

|*  4 |   HASH JOIN               |              |       |       |            |          |

|   5 |    CONNECT BY PUMP        |              |       |       |            |          |

|*  6 |    TABLE ACCESS FULL      | ORGANIZATION |     1 |    47 |     2   (0)| 00:00:01 |

------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 - access("ORGANIZATION"."PARENT_DEPARTMENT_ID"=PRIOR

              "ORGANIZATION"."DEPARTMENT_ID")

   2 - filter("ORGANIZATION"."PARENT_DEPARTMENT_ID" IS NULL)

   3 - filter("ALIVE_DATE">=SYSDATE@!)

   4 - access("ORGANIZATION"."PARENT_DEPARTMENT_ID"=PRIOR

              "ORGANIZATION"."DEPARTMENT_ID")

   6 - filter("ALIVE_DATE">=SYSDATE@!)

 

 

 

-- ¼öÇà°á°ú

 

Department_id   Alive_date    Department_name     Parent_department_id

----------------------------------------------------------------------

1               12/31/9999    ¿£ÄÚ¾ÆÄÁ¼³ÆÃ        

5               12/31/9999    ÄÁ¼³ÆÃ»ç¾÷ºÎ(NEW)   1

6               12/31/9999    1»ç¾÷ºÎ(NEW)        5

7               12/31/9999    2»ç¾÷ºÎ(NEW)        5

 

 

2¹ø SQLÀÇ ½ÇÇà°èȹÀ» º¸¸é,

CONNECT BY 󸮸¦ Çϱâ Àü¿¡ ¸ÕÀú "ALIVE_DATE >= SYSDATE" Á¶°Ç¿¡ ¸Â´Â µ¥ÀÌÅ͸¦ °É·¯ ³½ ÈÄ¿¡ ±× °á°ú ³»¿¡¼­ CONNECT BY °¡ ÀÌ·çÁ³½À´Ï´Ù.

 

ÀÌ ºÎºÐ È®ÀÎ  -->  3 - filter("ALIVE_DATE">=SYSDATE@!)

 

±×¸®ÇÏ¿© "1»ç¾÷ºÎ(OLD)", "2»ç¾÷ºÎ(OLD)" Á¶Á÷ÀÌ ºüÁö°í ¿øÇÏ´Â »õ·Î¿î Á¶Á÷¸¸ SELECT °¡ µÇ¾ú½À´Ï´Ù.

 

 

PREDICATE Á¤º¸¸¦ Æ÷ÇÔÇÑ Á¤È®ÇÑ ½ÇÇà°èȹÀ̳ª µ¥ÀÌÅÍ »ùÇÃÀÌ ¾ø¾î¼­

³²Åý´Բ²¼­ °ÞÀ¸½Å »óȲÀ» Á¤È®È÷ ¾Ë ¼ö ¾øÁö¸¸

Ȥ½Ã À§¿Í °°ÀÌ CONNECT BY Äõ¸®ÀÇ ¹®Á¦°¡ ¾Æ´ÑÁö Çѹø È®ÀÎÇØ º¸½Ã±â ¹Ù¶ø´Ï´Ù.

   
   
  ³²Åý ÃÖÁ¤Çö´ÔÀÇ ±íÀÌ ÀÖ´Â ´äº¯¿¡ ¹è¿ö°©´Ï´Ù. ^ ^
ÀǵµÇϽŠ´ë·Î ¼± ºÎºÐ¹üÀ§ ó¸® ÈÄ Å×½ºÆ®ÇØ º¸´Ï ¹®Á¦Á¡ÀÌ »ç¶óÁ³¾î¿ä. °¨»çÇÕ´Ï´Ù~~

±×·±µ¥, ¿©±â¼­ Áú¹®ÀÌ ¶Ç Çϳª Àִµ¥¿ä...
±×·¸´Ù¸é, °èÃþÇü Äõ¸® ½ÇÇà ½Ã WHEREÀýÀÇ ÇÊÅ͸µ Á¶°ÇÀº µ¥ÀÌÅÍ Á¤ÇÕ¼º¿¡ ÀÖ¾î ¶§¿¡ µû¶ó º¸ÀåµÉ ¼ö ¾ø´Â °ÍÀΰ¡¿ä?

¿ÉƼ¸¶ÀÌÀú ¼öÇà¿ø¸®¸¦ ÀÌÇØÇÑ´Ù´Â °ÍÀº Âü ¾î·Á¿î ÀÏÀÎ °Í °°¾Æ¿ä
2010-03-04
  ÃÖÁ¤Çö °èÃþÇü Äõ¸®ÀÇ Á¤ÇÕ¼º ¹®Á¦¶ó±â º¸´Ù´Â µ¥ÀÌÅÍ °ü¸®ÀÇ ¹®Á¦¶ó°í
»ý°¢µË´Ï´Ù.

½ÇÁ¦ ¸ð »çÀÌÆ®ÀÇ Â÷¼¼´ëÇÁ·ÎÁ§Æ®¿¡¼­ À§ÀÇ °æ¿ì¿Í À¯»çÇÑ »ç·Ê°¡
¹ß»ýÇß¾ú½À´Ï´Ù.
Å×ÀÌºí ·¹À̾ƿôÀº Á¤È®È÷ ±â¾ïÀÌ ³ªÁö ¾ÊÁö¸¸, Á¶Á÷Äڵ带 °ü¸®ÇÏ´Â
Å×ÀÌºí¿¡¼­ Á¶Á÷ÄÚµåÀÇ º¯°æÀ̷±îÁö °°ÀÌ °ü¸®¸¦ Çϰí À־
º¯°æÀ̷¸¶´Ù Á¶Á÷Äڵ尡 ÇÑ SET ¾¿ Á¸ÀçÇÏ´Â ÇüÅ¿´´ø°ÍÀ¸·Î ±â¾ïÇÕ´Ï´Ù.
ÀÌ °æ¿ì¿¡ SQL¿¡¼­ ³»°¡ º¸°íÀÚ ÇÏ´Â Á¤È®ÇÑ ÇϳªÀÇ SET ¸¸À» ÃßÃâÇÒ ¼ö
ÀÖ´Â Á¶°ÇÀÌ ´©¶ôµÇ¾î ÀÖ´Ù¸é ¿©·¯ SET °¡ SELECT µÇ¾î ÀÌ·¯ÇÑ ¹®Á¦°¡
¹ß»ýÇÒ ¼ö ÀÖÀ» °ÍÀ¸·Î º¸ÀÔ´Ï´Ù.

À§ÀÇ ¼³¸í¿¡¼­´Â Á¦°¡ ¾ïÁö·Î À߸øµÈ µ¥ÀÌÅ͸¦ ÃßÃâÇϱâ À§ÇØ
º¯°æµÈ Á¶Á÷ÄÚµåÀÇ ALIVE_DATE ¸¦ Á¦´ë·Î UPDATE ÇÏÁö ¾Ê¾ÒÁö¸¸
ALIVE_DATE °¡ Á¦´ë·Î UPDATE µÇ¾ú´Ù¸é À߸øµÈ °á°ú°¡ ³ªÅ¸³ªÁö
¾Ê¾ÒÀ» °ÍÀÔ´Ï´Ù.

±×¸®°í À§ÀÇ ¼³¸í Áß¿¡¼­ ÇѰ¡Áö ´õ ¸»¾¸µå¸®¸é,
CONNECT BY Àý¿¡ Á¶ÀÎÁ¶°Ç ¿Ü¿¡ ALIVE_DATE >= SYSDATE Á¶°ÇÀ»
°°ÀÌ Ãß°¡ÇØ ÁÖ¸é µ¿ÀÏÇÑ °á°ú¸¦ ÃßÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.

SELECT *
FROM ORGANIZATION
START WITH PARENT_DEPARTMENT_ID IS NULL
CONNECT BY PRIOR DEPARTMENT_ID = PARENT_DEPARTMENT_ID AND
ALIVE_DATE >= SYSDATE
;

SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY);

------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 7 | 364 | 3 (0)| 00:00:01 |
|* 1 | CONNECT BY WITH FILTERING| | | | | |
|* 2 | FILTER | | | | | |
| 3 | TABLE ACCESS FULL | ORGANIZATION | 7 | 364 | 3 (0)| 00:00:01 |
|* 4 | HASH JOIN | | | | | |
| 5 | CONNECT BY PUMP | | | | | |
| 6 | TABLE ACCESS FULL | ORGANIZATION | 7 | 364 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("PARENT_DEPARTMENT_ID"=PRIOR "DEPARTMENT_ID")
filter("ALIVE_DATE">=SYSDATE@!)
2 - filter("PARENT_DEPARTMENT_ID" IS NULL)
4 - access("PARENT_DEPARTMENT_ID"=PRIOR "DEPARTMENT_ID")
filter("ALIVE_DATE">=SYSDATE@!)


-- ¼öÇà°á°ú

Department_id Alive_date Department_name Parent_department_id
----------------------------------------------------------------------
1 12/31/9999 ¿£ÄÚ¾ÆÄÁ¼³ÆÃ
5 12/31/9999 ÄÁ¼³ÆÃ»ç¾÷ºÎ(NEW) 1
6 12/31/9999 1»ç¾÷ºÎ(NEW) 5
7 12/31/9999 2»ç¾÷ºÎ(NEW) 5


±×·³ ÁÁÀº ÇÏ·ç µÇ½Ã±æ~~~^^
2010-03-05
 
  °ü·Ã±Û
ÀζóÀÎºä »ç¿ë ½Ã Äõ¸®½ÇÇà ¼ø¼­¿¡ ´ëÇÑ Á¶¾ð ºÎʵ右´Ï...
ÀζóÀÎºä »ç¿ë ½Ã Äõ¸®½ÇÇà ¼ø¼­¿¡ ´ëÇÑ Á¶¾ð ºÎʵ右...[2]
  ÀÌÀü±Û Insert ½Ã rowÀÇ °¹¼ö Á¦ÇÑ ...
  ´ÙÀ½±Û blob ŸÀÔÀÇ export/ imp...