2017-09-10 2 views
0

나는 하나의 주 테이블 인 deliveries를 가지고 있으며 deliveries_languages와 일대일 관계가 있습니다 .dl, deliveries_markets dm 및 deliveries_tags dt는 delivery_id가 외래 키입니다. 이 3 개의 테이블은 언어, 시장 및 태그와 각각 1 대 1의 관계가 있습니다. 덧붙여, 배달, 테이블은 회사와 일대일 관계를 맺고 company_is를 외래 키로 사용합니다. 여기여러 조인에서 고유 한 행을 가져 오는 중 SQL

SELECT deliveries.*, languages.display_name, markets.default_name, tags.default_name, companies.name 
FROM deliveries 
JOIN deliveries_languages dl ON dl.delivery_id = deliveries.id 
JOIN deliveries_markets dm ON dm.delivery_id = deliveries.id 
JOIN deliveries_tags dt ON dt.delivery_id = deliveries.id 
JOIN languages ON languages.id = dl.language_id 
JOIN markets ON markets.id = dm.market_id 
JOIN tags ON tags.id = dt.tag_id 
JOIN companies ON companies.id = deliveries.company_id 
WHERE 
deliveries.name ILIKE '%new%' AND 
deliveries.created_by = '5f331347-fb58-4f63-bcf0-702f132f97c5' AND 
deliveries.deleted_at IS NULL 
LIMIT 10 

내가 여러 언어, 시장과 태그가 delivery_id 때문에 각각의 중복 delivery_ids을 얻고있다 : 내가 작성한 쿼리입니다 다음. 고유 한 delivery_ids에 한도를 사용하고 싶습니다. 따라서 제한 10은 위의 조인 조회에서 10 개의 레코드를 제공하지 않아야하며 distinct delivery_id (deliveries.id)가있는 10 개의 레코드를 제공해야합니다. 아마 파생 테이블 개념을 사용할 수는 있지만 어떻게 할 수 있을지 확신 할 수 없습니다. 누군가이 문제를 해결하기 위해 나를 도울 수 있습니까? 포스트 그레스에서

+0

어떤 DBMS를 사용하고 있습니까? – jarlh

+0

delivery_id 당 10 개의 행을 선택하는 방법은 무엇입니까? (여러 언어를 유지하는 것은 약간 이상하게 보입니다.) – jarlh

+0

postgreSQL을 사용하고 있습니다. –

답변

0

, 당신은 distinct on를 사용할 수 있습니다

SELECT DISTINCT ON (d.id) d.*, l.display_name, m.default_name, t.default_name, c.name 
FROM deliveries d JOIN 
    deliveries_languages dl 
    ON dl.delivery_id = d.id JOIN 
    deliveries_markets dm 
    ON dm.delivery_id = d.id JOIN 
    deliveries_tags dt 
    ON dt.delivery_id = d.id JOIN 
    languages l 
    ON l.id = dl.language_id JOIN 
    markets m 
    ON m.id = dm.market_id JOIN 
    tags 
    ON t.id = dt.tag_id JOIN 
    companies c 
    ON c.id = d.company_id 
WHERE d.name ILIKE '%new%' AND 
     d.created_by = '5f331347-fb58-4f63-bcf0-702f132f97c5' AND 
     d.deleted_at IS NULL 
ORDER BY d.id 
LIMIT 10; 

더 많은 양의 데이터, 이것은 매우 비효율적이 될 수 있습니다. 이와 같이 사용하면 다중 교차 테이블로 인해 카디 전 곱이 산출됩니다. 그러나 데이터 양이 적 으면 문제가 해결됩니다.

+0

이것이 저에게 효과적입니다. 하지만 성능이 떨어질 거라고 했지요. 다중 조인 또는 DISTINCT ON 절이 원인입니까? 또한 하위 쿼리를 사용하는 것보다 효율적입니까? –

+0

감사합니다. Gordon Linoff –

+0

@NilakshiNaphade. . . 이것은 조인이 다른 차원에서 카티 전 곱을 생성하기 때문입니다. . . 주어진 전달에 대해 중간 결과는 시장 수와 태그 수를 곱한 언어 수입니다. –

관련 문제