ksd 님이 쓰신 글 :
: 답변감사합니다.
: subquery 결과가 한건인경우는 실행됩니다.
: subquery 결과가 한건 이상인 경우에는
: multiple rows in singleton select 에러를 발생시키더군요
: delete from a where a.no in ( select b.no from b where b.c1 = 조건 ) ;
: 으로 하면 실행 됩니다.
: 다만 데이터 량이 많아서 그런지 속도가 22 초 이상나옵니다.(제 시스템 성능 빵빵하다고 자랑하는데 ㅋ)
: b 테이블은 인덱스를 타는데
: a 는 풀스켄 하는것 같습니다.
: b 테이블은 plan 이 붙여지는데
: a 테이블은 in 을 사용해서 그런지 plan 도 안되더군요
: a.no 가 프라임키 인데도 인덱스를 타지 않을뿐더러 plan도 사용을 못하겠습니다.
: 혹 for 문을 사용하라고 아래 글 중에서 읽은것 같은데
: for 문을 도통 사용해본 경험이 없어서
: 여하튼 답변 감사 합니다.
:
:
:
:
: 김상면 님이 쓰신 글 :
: : 대체로 고급 SQL은 지원하지 못하는 SQL드라이버들이 많습니다.
: : 다른문제도 있겠지만 인덱스가 있는지 한번 살펴 보시기 바랍니다.
: : 그외에도 여러가지 문제가 있을수 있지만 그래도 문제가 계속 발생한다면....
: : 고급SQL은 사용하지 않는게 좋습니다.
: : 그럼
: : ksd 님이 쓰신 글 :
: : : Firebird-2.0.0.12484-0-Win32.exe
: : : Firebird_ODBC_1.2.0.69-Win32.exe
: : : 를 설치하여 사용중 입니다.
: : :
: : : delete from a where a.no = ( select b.no from b where b.c1 = 조건 ) ;
: : : 와 같은 문장을 사용하고 싶습니다.
: : : 형식은 관계없이 b 테이블에서 검색된 자료와 일치하는 a 테이블의 자료를 삭제하고 싶습니다.
: : :
: : : subquery 결과가 한건인경우는 실행되는것 같은데 여러건의 자료가 검색된경우
: : : 여러건의 자료가 검색 되었다는 메세지가 나타납니다.
: : :
: : : 부탁 드립니다.
: : :
: : : delete from a where EXISTS ( select * from b where b.c1 = 조건 and b.no = a.no ) ;
: : : 이 문장은 실행 됩니다. 다만 시간이 많이 걸리는 군요.
안녕하세요. 까막입니다.
애초에 문의하신 쿼리문 자체가 단 하나의 조건값으로만 삭제를 하기 위한 쿼리 구문입니다.
당연히 Sub Query 에서 여러건의 Row 를 반환 한다면 Multiple... 오류가 나는 거죠.
조건값이 여러개가 되는 셈이니까요.
또한 IN, EXISTS 는 오류가 안나는게 여러 건의 조건값에 대해 처리를 하기 위해 쓰는 쿼리 구문이니까요.
for 문 사용 예제.
CREATE OR ALTER PROCEDURE Test_SP
AS
DECLARE VARIABLE vNo CHAR(04);
begin
for
SELECT No
FROM B
WHERE C1 = '0000'
INTO :vNo
do
begin
DELETE FROM A
WHERE NO = :vNo;
end
suspend;
end
대략 이렇게 사용하시면 됩니다.
질문이 시간이 꽤 지난지라 질문하신 분에게는 큰 도움이 안되시겠지만...
혼이 살아 있을까.... 대한민국.