it-source

왼쪽 자체 가입은 '기본'당 하나의 행을 반환합니다.

criticalcode 2023. 10. 23. 21:56
반응형

왼쪽 자체 가입은 '기본'당 하나의 행을 반환합니다.

저는 이렇게 생긴 테이블이 있습니다.

Rel_Id  Last    First   Relation
1   Jones   John    Primary
1   Jones   Mary    Spouse
1   Jones   Carl    Dependent
2   Will    Bill    Primary
3   Fine    Howard  Primary
4   Smith   Diana   Primary
4   Smith   Axel    Spouse

저는 한 행에 하나씩 모든 "기본" 관계를 반환하려고 하지만 배우자가 있는 경우에는 같은 행에 포함시키려고 합니다.

제가 이루고 싶은 결과는 다음과 같습니다.

1   Jones   John    Primary Jones   Mary    Spouse
2   Will    Bill    Primary null    null    null
3   Fine    Howard  Primary null    null    null
4   Smith   Diana   Primary Smith   Axel    Spouse

아니면 이것도 괜찮습니다.

1   Jones   John    Primary Jones   Mary    Spouse
2   Will    Bill    Primary Will    Bill    Primary
3   Fine    Howard  Primary Fine    Howard  Primary
4   Smith   Diana   Primary Smith   Axel    Spouse

제 질문은 이렇습니다.

SELECT
P.Rel_Id,
P.Last,
P.`First`,
P.Relation,
S.Last AS sLast,
S.`First` AS sFirst,
S.Relation AS sRelation
FROM
relations AS P
LEFT JOIN relations AS S ON S.Rel_Id = P.Rel_Id
WHERE P.Relation = 'Primary' 
AND S.Relation <> 'Dependent'

위의 쿼리 결과는 다음과 같습니다.

1   Jones   John    Primary Jones   John    Primary
1   Jones   John    Primary Jones   Mary    Spouse
2   Will    Bill    Primary Will    Bill    Primary
3   Fine    Howard  Primary Fine    Howard  Primary
4   Smith   Diana   Primary Smith   Diana   Primary
4   Smith   Diana   Primary Smith   Axel    Spouse

안타깝게도 '의존적'을 올바르게 제외한 제 질문에는 배우자가 있는 고유한 '기본' 구성원에 대한 두 줄이 표시되어 있는데, 이는 제가 원하지 않습니다.배우자와의 관계가 있는 경우에만 '기본' 관계당 하나의 행을 반환하려면 어떻게 해야 합니까?

가입 조건에서 쿼리에 추가 검사를 추가해야 기본 2개가 표시되지 않고 배우자만 표시됩니다.

따라서 이 조건을 쿼리에 추가합니다.

S.Relation <> P.Relation

따라서 최종 쿼리는 다음과 같습니다.

SELECT
P.Rel_Id,
P.Last,
P.`First`,
P.Relation,
S.Last AS sLast,
S.`First` AS sFirst,
S.Relation AS sRelation
FROM
relations AS P
LEFT JOIN relations AS S ON S.Rel_Id = P.Rel_Id AND S.Relation <> P.Relation
WHERE P.Relation = 'Primary' 
AND S.Relation <> 'Dependent'

도움이 되길 바랍니다.

SELECT  GROUP_CONCAT(CONCAT_WS(' ',
                               last, first, relation),
                     SEPARATOR ' -- '
                     ORDER BY IF(relation = 'PRIMARY', 0, rel_id)
        ) AS Family
    FROM relations
    GROUP BY last;

요청하신 것처럼 "열"을 제공하지는 않지만, 제공할 수도 있습니다.

이렇게 하면 인원수에 상관없이 가족을 처리할 수 있습니다.그러나, 그것은 다음에 달려있습니다.last(이것은 스키마 설계에 존재하는 결함입니다.)

분리하는 것.last더 좋을 수도 있습니다:

SELECT  last,
        GROUP_CONCAT(CONCAT_WS(' ',
                               first, relation),
                     SEPARATOR ' -- '
                     ORDER BY IF(relation = 'PRIMARY', 0, rel_id)
        ) AS Family
    FROM relations
    GROUP BY last;

이건 이제 너무나 명백해 보여요 - 그리고 아주 간단해요! (모두 감사합니다 - 정말)

SELECT
P.Rel_Id,
P.Last,
P.`First`,
P.Relation,
S.Rel_Id AS sRel_Id,
S.Last AS sLast,
S.`First` AS sFirst,
S.Relation AS sRelation
FROM
relations AS P
LEFT JOIN relations AS S ON S.Rel_Id = P.Rel_Id and S.Relation = 'Spouse'
WHERE P.Relation = 'Primary' 

언급URL : https://stackoverflow.com/questions/31360277/left-self-join-return-one-row-per-primary

반응형