2012-05-20 3 views
0

USING을 사용합니다.테이블 A의 데이터와 테이블 B의 데이터를 표시하는 Sql 쿼리. 테이블 A의 parent_id가 테이블 B에서 찾았습니다.

두 개의 테이블이 있습니다. 표 A 및 표 B.

표 A 난이 쿼리를 수행하려고 테이블 B.이 ID는 테이블 A에 crm_field 및 PARENT_ID 식별 표 B. 관련된 ID

를 가지고 어떤 값을 갖는다.

select * 
from tableA inner join tableB ON tableA.crm_field=tableB.parent_field 
WHERE tableA.id = '75' AND 
     tableA.category != 'null' AND 
     tableA.category != 'No Category' 

내 예상 결과는 어디 요구 사항을 충족 TABLEA의 데이터가 TABLEA의 crm_field의에 PARENT_ID 동등한를 보유하고 TableB의의와 함께 표시 할 것입니다.

실제 결과는 값을 보유하는 parent_id를 제외하고는 tableB가 표시됩니다. 또한 crm_field = 0 및 parent_id = 0, crm_field 22 때 같은 parent_id 찾을 수있는 실제 값을 쿼리 할 때 그것을 쿼리 할 것으로 보인다.

select * 
from tableA inner join tableB ON tableA.crm_field=tableB.parent_field 
WHERE tableA.id = '75' AND 
     tableA.category != 'null' AND 
     tableA.category != 'No Category' AND 
     tableA.crm_field != '0' 

을하지만, 그것은 단지 내가 TABLEA에 추가 할 필요 TableB의에서 데이터를 보여 주었다 : 시도 대신이 일을.

조인 쿼리를 사용하여이 작업을 수행하는 방법은 무엇입니까?

그렇지 않은 경우 이중 쿼리를 수행 할 수도 있습니다.

감사

샘플 출력

이 -if

0|dog|0|hi 
1|cat|22|hi 
2|wild|22 

도 가능하다 :

tableA 
id|name|crm_field|category 
0|dog|0|hi 
1|cat|22|hi 
2|bear|0|null| 


tableB 
id|name|parent_id| 
0|wild|22| 
1|foo|0| 

디스플레이는이 같은되어야 하는가?

crm_field 일부 값이 있습니다

내가 여기 달성하기 위해 노력하고있어 지점에 도착하면이입니다.

그러나 쿼리가 crm_field에서 22 또는 21 또는 둘 모두를 볼 경우 tableB에있는 해당 값을 표시해야합니다.

crm_field == 21 또는 22이면 해당 값을 배열에 추가하는 다른 쿼리를 수행합니다. 하지만 가능한 적은 코드로 이것을 수행하고 싶습니다. 따라서 join을 실험하고있었습니다. (이미 JohnFx에서 언급 한 바와 같이)

+0

어떤 데이터베이스를 사용하고 있습니까? – JohnFx

+0

죄송합니다. mysql을 사용하여 – magicianiam

+0

'null'문자열에 대해 의도적으로 쿼리하고 있습니까? 아니면 실제로 null을 확인 했습니까? – JohnFx

답변

1

UNION에 이어

  • 당신은 'null'를 저장해서는 안 당신의 주어진 입력

    SELECT id, name, crmfield 
    FROM TableA 
    WHERE category != 'null' 
    UNION ALL 
    SELECT a.id, b.name, a.crmfield 
    FROM TableA AS a 
         INNER JOIN TableB AS b ON b.parent_id = a.crm_field 
    WHERE parent_id != '0'   
    

    당신에게 출력을 얻을 수 있지만 테이블 디자인 몇 가지 문제가 있습니다 것 모든 데이터베이스의 문자열 값.

  • 외래 키를 연결하는 기본 키 이름을 지정하는 것이 훨씬 쉽습니다 (적어도 내게는). parent_idcrm_field에 연결되어 있다는 것을 알 수있는 방법이 없습니다.TableB.parent_id에서 TableB.crm_field으로 이름을 바꿔 연결을 해제하는 것이 좋습니다.
  • 결과에 TableB.foo 레코드가 반환되지 않게하려고합니다. 그것은 나를 이상하게 여긴다. 나는 당신이 관계의 일부분만을 돌려 주길 원한다고 상상할 수 있지만 여기에서는 외래 키로 0에 특별한 의미를 부여한 것으로 보인다.
+0

예 crm_field에 22 또는 21이 포함되어 있으면 parent_id가 22 또는 21 인 테이블에서 데이터를 검색하면됩니다. 그렇지 않으면 tableb가 전혀 검색되지 않아야합니다. 이제부터는 SQL에서 조건의 일부로 'null'을 사용하지 않을 것입니다. 이는 오히려 위험하기 때문입니다. 이걸 고맙다. – magicianiam

관련 문제