2010-05-20 3 views
3

나는 6 개의 테이블을 가지고있다. 그것들을 a, b, c, d, e, f라고 부르 자. 이제 특정 단어에 대한 모든 테이블의 모든 열 (ID 열 제외)을 검색하려고합니다. 'Joe'라고합시다. 내가 한 일은 모든 테이블에 걸쳐 INNER JOINS를 만든 다음 LIKE을 사용하여 열을 검색하는 것입니다.INNER JOIN 쿼리에서 카디 전 곱을 피하는 방법은 무엇입니까?

INNER JOIN 
... 
ON 
INNER JOIN 
... 
ON.......etc. 
WHERE a.firstname 
~* 'Joe' 
OR a.lastname 
~* 'Joe' 
OR b.favorite_food 
~* 'Joe' 
OR c.job 
~* 'Joe'.......etc. 

결과가 정확합니다. 찾고 있던 모든 칼럼을 얻었습니다. 그러나 어떤 종류의 데카르트 제품도 얻었습니다. 거의 같은 결과로 2 개 이상의 라인을 얻었습니다.

어떻게 피할 수 있습니까? 결과가 웹 검색에 나타나야하므로 각 줄을 한 번만 갖고 싶습니다.

내가 처음 SELECT DISTINCT 것은이 문을 사용하여 작업 할 것인지 알아 내기 위해 노력

UPDATE : pastie.org/970959를하지만 여전히 나에게 카티 제품을 제공합니다. 이게 뭐가 잘못 됐어?

+0

사용하는 데이터베이스를 지정하십시오. – hgulyan

답변

2

시도 SELECT DISTINCT?

+0

SQL Server 인 경우에도? – hgulyan

+1

ms sql 서버는 여전히 고유 한 선택을 했습니까? – oedo

+0

힌트를 보내 주셔서 감사합니다. – flhe

2

어떤 조건에서 JOINtables입니까? foreign keys 같은 것이 있습니까?

어쩌면 각 테이블에서 그 단어를 찾아야할까요?

+0

나는 테이블 사이에 관계가 있으므로 person_has_job 테이블에 대해 INNER JOIN을하고 작업 테이블에 INNER JOIN을 수행합니다. – flhe

1

어떤 종류의 서버를 사용하고 있습니까? Microsoft SQL Server에는 전체 텍스트 인덱스 기능이 있습니다 (나는 다른 사람들도 이와 비슷한 것을 가지고 있다고 생각합니다). 이것은 리소스를 덜 사용하는 방법으로 키워드를 검색 할 수있게합니다.

테이블을 조인하는 대신 UNION을 사용하는 것도 고려하십시오.

+0

그것은 postgresql 서버입니다. – flhe

0

테이블을 보지 않고도 나는 어딘가에서 일대 다 관계를 유지하고 있다는 것을 실제로 추측 할 수 있습니다. 하위 쿼리에서 모든 작업을 수행하고 고유 ID를 선택한 다음 ID로 표시하려는 데이터를 가져 오려고합니다. 뭔가 같이 :이 sloooow 될 것입니다

  • 하고 RDBMS가 지원하는 경우에 당신은 아마 (대신 전체 텍스트 검색을 사용하려면 :

    SELECT a.*, b.* 
    FROM (SELECT DISTINCT a.ID 
         FROM ... 
         INNER JOIN ... 
         INNER JOIN ... 
         WHERE ...) x 
    INNER JOIN a ON x.ID = a.ID 
    INNER JOIN b ON x.ID = b.ID 
    

    몇 가지 그러나주의해야 그것).

  • 먼저 데카르트 제품의 모든 항목을 결합한 다음 OR로 필터링하는 것보다 각 테이블을 개별적으로 검색하는 것이 더 빠를 수도 있습니다.

+0

그게 해결책일지도 몰라. 나는 그것을 시도 할 것이다. 감사! – flhe

+0

자, postgresql 전체 텍스트 검색을 살펴 보겠습니다. – flhe

+0

먼저이 문을 사용하여 SELECT DISTINCT가 작동하는지 알아 내려고했습니다. http://pastie.org/970959 그래도 여전히 데카르트 제품을 제공합니다. 이게 뭐가 잘못 됐어? – flhe

0

경우 테이블 예를 들어, a있는 사람과 b있는 회사 엔터티 형식의 테이블입니다, 당신이 이런 식으로 결과를 검색 할 경우 (단일 쿼리를 카티 제품을 피할 수 있다고 생각하지 않습니다).

특정 단어에 대해 모든 표를 검색하려고하지만 결과를 해당 유형으로 분리하려고한다고 가정합니다. 권리? 그렇지 않으면 웹 검색은별로 의미가 없습니다. 그래서 'Joe'를 검색하면 'Joe'라는 이름을 가진 사람을 보려고하고 예를 들어 'Joe 's gym'이라는 회사를 찾고 싶습니다.다른 엔티티를 검색하므로 검색을 다른 쿼리로 분리해야합니다.

하나의 쿼리에서이 작업을 수행하려면 데이터베이스 구조를 변경해야합니다. 엔티티 ID (엔티티 ID)와 엔티티 유형이 포함 된 '검색 테이블'의 일부 양식과 해당 엔티티를 찾을 수있는 키워드 목록이 필요합니다. 예 :

EntityType, EntityID, Keywords 
------------------------------ 
Person,  4,  'Joe', 'Doe' 
Company, 12,  'Joe''s Gym', 'Gym' 

그런 식으로 뭔가요? 검색 엔티티의 한 유형을 반환 할 때

그러나이 다르다, 사람을 말하고, 당신은 당신이 (그 사람에 관련된 모든 테이블에) 해당 키워드에 타격을받을 대상이되는 사람을 반환합니다. 그런 다음 표시 할 필드를 모두 제외하고 표시하려는 모든 필드를 선택해야합니다. 불가피하게 그것들을 포함시키는 것은 데카르트 제품으로 이어진다.

나는 여기에서 브레인 스토밍을하고 있습니다. 도움이되기를 바랍니다.