it-source

행을 찾을 수 없는 경우 JOIN 조건의 폴백 값

criticalcode 2022. 11. 20. 12:16
반응형

행을 찾을 수 없는 경우 JOIN 조건의 폴백 값

서문:이룰 수 없는 일을 부탁하는 것 같아 두렵다.하지만 만약 방법이 있다면, 여기 누군가가 알게 될 것입니다.

MySQL 데이터베이스(호환성을 유지할 수 있는 경우에는 MariaDB 데이터베이스)가 있다고 가정합니다.표 A에서 선택하고 표 B에 특정 값 X를 가진 특정 열을 기준으로 결합해야 합니다. 표 B에 적절한 행이 없을 수 있으므로 왼쪽 외부 결합을 사용해야 합니다.단, 행을 찾을 수 없는 경우(테이블B의 행에는 X 값이 포함되지 않은 경우), 테이블B의 행에 Y 값이 있는 행을 사용합니다.즉, Y는 JOIN의 폴백 조건으로 기능해야 합니다.

여기 저의 구체적인 예가 있습니다.엔티티(예: 제품)를 현지화 가능한 데이터와 고정 데이터가 포함된 두 테이블 간에 분할하여 데이터 현지화를 처리한다고 가정합니다.프랑스어로 된 상품 정보를 얻고 싶을 때 프랑스어로 된 정보가 없다면 영어로 폴백하고 싶습니다.하지만 만약 내가 한다면

// basic stub of the query for demonstration purposes
SELECT * FROM Products p
LEFT OUTER JOIN ProductsLocalization pLoc
      ON pLoc.ProductID = p.ID AND pLoc.Culture = 'fr-FR'

프랑스어 정보가 없을 때 NULL을 받습니다.대신, 그 행에 대해서만 쿼리 결과를 알고 싶습니다.

// basic stub of the query for demonstration purposes
SELECT * FROM Products p
LEFT OUTER JOIN ProductsLocalization pLoc
      ON pLoc.ProductID = p.ID AND pLoc.Culture = 'en-US'

그러나 후자의 질문은 물론 받아들여지지 않는다.

Culture가 'FR-FR' 또는 'en-US'인 것에 따라 OR을 사용하여 가입할 수 있지만, 이렇게 하면 선택한 행의 수가 두 배가 될 수 있으므로 결과 데이터 세트를 후처리해야 합니다.이 후처리를 피할 수 있는 방법이 있는지 알고 싶습니다.

중복되지 않은 면책사항: 제 질문은 다른 많은 질문들과 비슷하지만 중요한 차이가 있습니다.쿼리 결과가 아닌 JOIN 조건 자체에 폴백 값을 사용해야 합니다.기본값이 데이터 집합으로 끝나지 않지만 데이터 집합은 해당 기본값을 기준으로 계산됩니다.

두 번 가입하고 COALESCE()를 사용하여 원하는 값을 얻을 수 있습니다.

SELECT p.product_desc, 
    COALESCE(pLoc_fr.value, pLoc_en.value) 
FROM Products p
    LEFT OUTER JOIN ProductsLocalization pLoc_us ON 
       pLoc_us.ProductID = p.ID 
       AND pLoc_us.Culture = 'en-US'
    LEFT OUTER JOIN ProductsLocalization pLoc_fr ON 
       pLoc_fr.ProductID = p.ID 
       AND pLoc_fr.Culture = 'fr-FR';

또한 데이터 세트를 결합하는 방법을 상상할 수 있다면 플레인올 SQL을 사용할 수 있습니다.일부 Edge 케이스는 SQL 문을 동적으로 생성해야 하지만, 이러한 경우는 그리 흔하지 않습니다.이 경우 COALESCE, CASE 또는 SELECT 내의 IF 문 안에 상관된2개의 서브쿼리를 사용할 수도 있습니다.고양이 가죽 벗기는 데는 거의 항상 몇 가지 방법이 있다.

언급URL : https://stackoverflow.com/questions/47798511/fallback-value-in-a-join-condition-if-no-row-is-found

반응형