[SQL] 왼쪽에 참여 이용한 1 대 다수의 관계에서 첫 번째 레코드를 선택
SQL왼쪽에 참여 이용한 1 대 다수의 관계에서 첫 번째 레코드를 선택
나는 왼쪽 조인을 사용하여 두 개의 테이블을 조인하기 위해 노력하고있어. 그리고 결과 집합은 "오른쪽"조인 된 테이블에서 첫 번째 기록을 포함한다.
나는 다음과 같이 두 테이블 A와 B가 있다고 가정하자;
표 "A"
code | emp_no
101 | 12222
102 | 23333
103 | 34444
104 | 45555
105 | 56666
표 "B"
code | city | county
101 | Glen Oaks | Queens
101 | Astoria | Queens
101 | Flushing | Queens
102 | Ridgewood | Brooklyn
103 | Bayside | New York
예상 출력 :
code | emp_no | city | county
101 | 12222 | Glen Oaks | Queens
102 | 23333 | Ridgewood | Brooklyn
103 | 34444 | Bayside | New York
104 | 45555 | NULL | NULL
105 | 56666 | NULL | NULL
내 결과가 표 "B"에서 오직 하나 개 일치하는 기록을 가지고 통지 (문제 기록이 일치 무엇을하지 않습니다) 떠난 후 가입 (그리고 많은 매핑에 하나) 경우
나는 테이블 B에서 첫 번째 일치하는 기록을 선택해야하고 다른 모든 행을 무시합니다.
도와주세요!
감사
해결법
-
==============================
1.내가 기대했던 것보다 조금 장난 후, 밖으로이 회전은 난이도가 될 수 있습니다! 그 table_b 가정하면 (단일 필드 기본 키 말) 고유 어떤 하나의 컬럼을 가지고 당신이 할 수있는 것처럼, 그것은 본다 :
내가 기대했던 것보다 조금 장난 후, 밖으로이 회전은 난이도가 될 수 있습니다! 그 table_b 가정하면 (단일 필드 기본 키 말) 고유 어떤 하나의 컬럼을 가지고 당신이 할 수있는 것처럼, 그것은 본다 :
SELECT table_a.code, table_a.emp_no, table_b.city, table_b.county FROM table_a LEFT JOIN table_b ON table_b.code = table_a.code AND table_b.field_that_is_unique = ( SELECT TOP 1 field_that_is_unique FROM table_b WHERE table_b.code = table_a.code ) ;
-
==============================
2.데이터베이스에서 지원하는 경우, OUTER 적용을 효율적이고 간결 옵션입니다.
데이터베이스에서 지원하는 경우, OUTER 적용을 효율적이고 간결 옵션입니다.
SELECT * FROM Table_A a OUTER APPLY (SELECT TOP 1 * FROM Table_B b_1 WHERE b_1.code = a.code ) b ;
왼쪽에있는이 결과는 불확정 첫번째 일치하는 기록에 가입 할 수 있습니다. 내 테스트는 (MS SQL 서버 2012) 다른 게시 된 솔루션보다 빠른 것으로 보여.
-
==============================
3.가장 높은 투표 대답은하지 나에게 올바른 것 수행하고 overcomplicated 보인다. 귀하의 하위 쿼리에서 테이블 B의 코드 필드에 의해 그냥 그룹과 그룹화 당 최대 ID를 선택합니다.
가장 높은 투표 대답은하지 나에게 올바른 것 수행하고 overcomplicated 보인다. 귀하의 하위 쿼리에서 테이블 B의 코드 필드에 의해 그냥 그룹과 그룹화 당 최대 ID를 선택합니다.
SELECT table_a.code, table_a.emp_no, table_b.city, table_b.county FROM table_a LEFT JOIN table_b ON table_b.code = table_a.code AND table_b.field_that_is_unique IN (SELECT MAX(field_that_is_unique) FROM table_b GROUP BY table_b.code)
-
==============================
4.당신은 SQL Server 2005 또는 이후 버전에있는 경우, 당신은 당신이 원하는 것을 달성하기 위해 순위를 사용할 수 있습니다. 특히, ROW_NUMBER ()는 잘 필요에 맞게 같다 :
당신은 SQL Server 2005 또는 이후 버전에있는 경우, 당신은 당신이 원하는 것을 달성하기 위해 순위를 사용할 수 있습니다. 특히, ROW_NUMBER ()는 잘 필요에 맞게 같다 :
WITH B_ranked AS ( SELECT *, rnk = ROW_NUMBER() OVER (PARTITION BY code ORDER BY city) FROM B ) SELECT A.code, A.emp_no, B.city, B.county FROM A LEFT JOIN B_ranked AS B ON A.code = B.code AND b.rnk = 1
또는
WITH B_unique_code AS ( select * from( SELECT *, rnk = ROW_NUMBER() OVER (PARTITION BY code ORDER BY city) FROM B ) AS s where rnk = 1 ) SELECT A.code, A.emp_no, B.city, B.county FROM A LEFT JOIN B_unique_code AS B ON A.code = B.code
-
==============================
5.나는 ruakh에서 답을 수정이 MySQL과 완벽하게 작동하는 것 같다.
나는 ruakh에서 답을 수정이 MySQL과 완벽하게 작동하는 것 같다.
SELECT table_a.code, table_a.emp_no, table_b.city, table_b.county FROM table_a a LEFT JOIN table_b b ON b.code = a.code AND b.id = ( SELECT id FROM table_b WHERE table_b.code = table_a.code LIMIT 1 ) ;
-
==============================
6.오라클에서 당신은 할 수 있습니다 :
오라클에서 당신은 할 수 있습니다 :
WITH first_b AS (SELECT code, min(rowid) AS rid FROM b GROUP BY code)) SELECT a.code, a.emp_no, b.city, b.county FROM a INNER JOIN first_b ON first_b.code = a.code INNER JOIN b ON b.rowid = first_b.rid
-
==============================
7.이 방법은 다음과 같습니다
이 방법은 다음과 같습니다
Select * From TableA a Left Join TableB b On b.Code = a.Code And [Here put criteria predicate that 'defines' what the first record is]
도시와 카운티가 고유 이봐, 다음,이를 사용
Select * From TableA a Left Join TableB b On b.Code = a.Code And b.City + b.county = (Select Min(city + county) From TableB Where Code = b.Code)
그러나 요점은 당신이 먼저 무엇을 의미하는지 쿼리 프로세서에게 거기에 몇 가지 표현을 넣어야 할 것입니다.
from https://stackoverflow.com/questions/8161438/select-first-record-in-a-one-to-many-relation-using-left-join by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] Oracle 용으로 생성 SQL 삽입 (0) | 2020.06.25 |
---|---|
[SQL] JDBC 결과 : 저는 getDateTime 필요하지만 GETDATE 및 getTimeStamp이있다 (0) | 2020.06.25 |
[SQL] 검색어 "사이"오라클 날짜 (0) | 2020.06.25 |
[SQL] 시간 반올림 두 날짜 사이의 차이를 가져 오는 방법 (0) | 2020.06.25 |
[SQL] MYSQL 구문은 NULL의 존재하에 동일하지 평가하지 (0) | 2020.06.25 |