안녕하세요. 오랜만에 sql문을 써보려고 하니깐 어렵네요.

 

테이블 A와 B가 있는데요.

두 테이블에는 모두 member_srl 컬럼이 있습니다.

 

테이블 A와 B에 where 을 통해 AND 조건을 주고, 두 조건을 모두 만족하는 member_srl 을 출력하려고 하는데요.

 

SELECT B.member_srl

FROM A, B 

WHERE A.group NOT LIKE 'apple'

             AND B.group_num = 12345;

 

대충 위와 같은 조건을 만족하는 member_srl 을 출력하고 싶은데 저렇게하면 제대로 안나오네요...

Join을 해야할 것 같긴한데 안써본지 하도 오래돼서 찾아봐도 모르겠네요.

 

sql문을 어떤식으로 고쳐야할까요? ㅠㅠ

  • profile

    A와 B를 조인하는 조건이 빠졌네요. 양쪽에 뭔가 같은 값이 있는 경우만 찾아야 하잖아요.

    WHERE 부분에 AND A.컬럼이름 = B.컬럼이름 조건을 추가하셔야 합니다.

  • profile ?
    • kxo
    • 질문기여자

    감사합니다 기진님.

     

    SELECT B.member_srl
    FROM A, B
    WHERE A.member_srl = B.member_srl
    AND A.group NOT LIKE 'apple'
    AND B.group_num = 12345;

    그럼 이렇게 하면 제대로 나와야 정상인건가요!?

  • ? profile
    원하시는 데이터가 정확히 어떤 용도인지는 모르겠으나 문법적으로는 맞습니다.
  • profile ?
    • kxo
    • 질문기여자

    기진님 혹시 select문 간의 차집합을 구하는법은 없을까요?

    SELECT a.member_srl FROM xe_member_group_member a, xe_services_applicant b
    WHERE a.member_srl = b.member_srl AND a.group_srl=831378 AND b.status LIKE 'G';



    SELECT a.member_srl FROM xe_member_group_member a, xe_services_applicant b
    WHERE a.member_srl = b.member_srl AND a.group_srl=831378 AND b.status NOT LIKE 'G';

    두 개 결과값에서 중복을 제거한 값을 출력시키고 싶은데요.
    MySQL에선 MINUS 함수가 지원이 안되나보네요... ㅠㅠ

  • ? profile

    MySQL에서는 MINUS, INTERSECT를 지원하지 않으므로 두 번째 쿼리 결과를 LEFT JOIN한 후 해당 필드가 NULL인지 아닌지로 구분합니다.

    http://www.gokhanatil.com/2010/10/minus-and-intersect-in-mysql.html

  • profile ?
    • kxo
    • 질문기여자

    감사합니다! 그런데 Left Join 예시에서는 보면 WHERE 절이 없이 Select * From 구문만 Join 하는 식이던데

    두 Select 문 모두 Where 조건문이 있는 상태에서도 Left Join으로 출력할 수가 있을까요?

  • ? profile

    SELECT * FROM table AS a ..... LEFT JOIN (SELECT ..... WHERE .....) AS b WHERE .....
    이런 식으로 들어갑니다. 서브쿼리를 가상의 테이블로 취급하지요.

  • profile ?
    • kxo
    • 질문기여자
    감사합니다 ^^
  • profile ?
    • kxo
    • 질문기여자
    SELECT a.member_srl FROM xe_member_group_member AS a LEFT JOIN (SELECT a.member_srl WHERE a.group_srl=304314 AND b.status LIKE 'G') AS b WHERE a.group_srl=304314 AND b.status NOT LIKE 'G';

    이렇게 했더니 에러가나네요 ㅠㅠ
    디비 너무 어렵네요 ㅠㅠㅋㅋㅋ
  • ? profile
    괄호 안팎의 SELECT 쿼리는 서로 전혀 무관하다고 생각하셔야 해요. 테이블 참조가 괄호 밖에 a, b, 괄호 안에 c, d, 괄호친 SELECT 쿼리 전체를 AS로 받아오는 e, 이렇게 총 5개가 되어야 할 겁니다. 물론 a, b와 e를 서로 조인하는 조건도 괄호 밖에서 지정해 주어야 하고요.
  • profile ?
    • kxo
    • 질문기여자
    감사합니다... 좀더 연구해봐야겠네요