반응형
왼쪽 자체 가입은 '기본'당 하나의 행을 반환합니다.
저는 이렇게 생긴 테이블이 있습니다.
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
반응형
'it-source' 카테고리의 다른 글
부모 활동으로 올바르게 돌아가려면 어떻게 해야 합니까? (0) | 2023.10.28 |
---|---|
make 명령의 m 옵션, makefile (0) | 2023.10.23 |
두 날짜 사이의 시간 차이(시간 단위)를 구하는 방법 (0) | 2023.10.23 |
AJAX 호출 데이터를 반환하는 자바스크립트 함수 (0) | 2023.10.23 |
ASP.NET MVC 및 뷰 상태 (0) | 2023.10.23 |