2008-09-18 5 views
1

이제이 질문을 another forum에 보았지만 수용 가능한 대답이 없었습니다.ADO를 사용하여 조인 된 테이블의 행 삭제

두 개의 테이블, 그룹 테이블과 요소 테이블이 있다고 가정합니다. 테이블에는 정의 된 관계가 없습니다. 요소 테이블에는 그룹 테이블의 IdGroup (PK) 필드를 참조하는 IdGroup 필드가 있습니다.

SELECT Elements.*, Groups.GroupName 
FROM Elements 
INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup 

을 내가 요소를 삭제하려면 삭제를 눌러 원하는 그리드에서 :

은 내가 데이터 그리드에 테이블 값을 채울 ADO 레코드를 통해 다음과 같은 쿼리를 사용합니다. 여기 내 문제가있다. DAO를 사용하면 DAO Delete() 함수는 Elements 그룹의 레코드 만 삭제합니다. 이것이 예상 된 행동이었습니다.

ADO로 변경하면 Delete() 함수는 두 테이블, 요소 레코드 및 요소가 속한 그룹의 레코드를 모두 삭제합니다!

테이블에 관계를 정의하지 않고도 ADO에서 DAO 동작을 재현 할 수있는 방법이 있습니까?

참고 : 대체 방법이 있다는 것을 알고 있습니다 (DELETE 쿼리를 실행하면 작업을 수행 할 수 있음). ADO에서이 작업을 수행하는 방법을 보여 주거나 수행 할 수 없다고 말하십시오.

답변

1

당신이하는 쿼리 재 작성 :

  • 내부가 함께 가입 교체 WHERE가 존재 구성된 절;
  • SELECT 절에서 하위 쿼리를 사용하여 Groups.GroupName의 값을 반환합니다.

예 : 나는 마이크로 소프트 OLEDB DataGrid 컨트롤 (MSDATGRD.OCX)의 데이터 소스 속성으로 설정 ADO 레코드와 함께이 사용하는 SQL Server 2008을 테스트 한

SELECT Elements.*, 
     (
     SELECT Groups.GroupName 
      FROM Groups 
     WHERE Elements.IdGroup = Groups.IdGroup 
     ) 
    FROM Elements 
WHERE EXISTS (
       SELECT * 
       FROM Groups 
       WHERE Elements.IdGroup = Groups.IdGroup 
      ); 

다음을 통해 행을 삭제 gird (나는 당신이 비슷한 일을하고 있다고 가정한다.) 행은 실제로 Table 요소에서만 삭제된다 (즉, 그룹의 행은 삭제되지 않은 상태로 유지된다).

수정 된 쿼리는 행을 가져올 때 성능에 부정적인 영향을 줄 수 있습니다.

관련 문제