2014-10-21 4 views
0

나는 columnName : TownName이있는 tableA에 81,190 개의 타운 이름이 있습니다.가능한 중복이있는 2 개의 테이블에서 데이터 선택

다음과 같은 방식으로 tableB에 저장된 32,117 개의 고유 레코드 이름리스트가 있습니다 : Town, County, Volume.

나는 81,190 개의 마을 이름 각각에 대해 카운티를 선택하고 싶습니다. 그래서 내 쿼리는 다음과 같습니다

Select TownName, County, Volume 
From tableA 
Inner Join tableB 
On TownName = Town 
Where Town = TownName 
Order By TownName, Volume, County 

모든 것이 평등합니다. 81,190 기록을 되찾고 싶습니다.

그러나 91,669 개의 ​​레코드가 있습니다. 왜 그런지 이해합니다. 동일한 도시 이름이 여러 카운티에있을 수 있기 때문에 도시 이름은 tableB에 두 번 이상 나타날 수 있습니다.

Abinton Limerick 0 
Abinton Limerick 0 
Abinton Lanarkshire 11 
Abinton Lanarkshire 11 
Abinton Northamptonshire 13 
Abinton Northamptonshire 13 

애 빙턴은 TABLEA에 두 번 표시하고 나에게 대신 내가 필요로하는 2 (6 개) 기록을 반환 TableB의 3 회 :

레코드의 예는 것을 돌아왔다. 가장 높은 볼륨 군은 예를 반환되도록 내 쿼리를 수정하는 방법을

는 :

Abinton Northamptonshire 13 
Abinton Northamptonshire 13 

난 81190 개 레코드 끝.

미리 도움을 청하십시오. 나는 당신의 설명을 혼란 생각하지만

답변

0

내가 제대로 이해하면 , 당신은 tableA에있는 모든 마을에 대한 카운티 이름이 필요합니다. 따라서 다음을 시도해보십시오.

Select tableA.TownName, tableB.County, tableB.Volume 
From tableA 
left Join tableB 
On tableA.TownName = tableB.Town 
Where tableB.Volume= (select max(tB.Volume) from tableB as tB Where tB.Town = tableB.Town) 
Order By tableA.TownName, tableB.County, tableB.Volume 
+0

솔루션과 같은이 모습 - 77,978 행을 반환합니다. 나는 카운티를 찾지 못하는 곳이 있다고 가정하고 있습니다. 데이터를 확인하고 가능한 빨리 업데이트하겠습니다. 감사. –

0

다음 쿼리를

CREATE TEMPORARY TABLE IF NOT EXISTS tableC AS (SELECT DISTINCT Town, County FROM tableB); 
Select TownName, County 
From tableA 
Left Join tableC 
On tableA.TownName = tableC.Town 
Order By TownName, Volume; 

을보십시오. "나는 tableB에 저장된 32,117 개의 고유 한 레코드 이름 목록이 있습니다."및 "한 도시 이름은 tableB에 두 번 이상 나타날 수 있습니다"라고 설명합니다. 이것이 TableA에있는 경우 고유 한 타원 이름이 있습니까? 그렇지 않다면 테이블을 결합 할 때 항상 중복을 가질 것입니다.

+0

레코드가 고유합니다. 기록 1 Abington, Limerick 0, 기록 2 Abington, Lanarkshire, 11 기록 3 Abington, Northamptonshire, 13. 불행히도 3 가지 Abington이 있으며, 만약 내가 그 중 하나를 사용하려고한다면, 나는 가장 큰 것을 가진 것을 사용하고 싶다. –

+0

결과에 Volume이 필요하지 않으면 간단 해집니다. 내 질문 업데이트 – geoandri

+0

26,858 행만 반환 –

2

아마 윈도우 함수 MAX를 사용할 수 있습니다. 같은 뭔가 :

Select TownName, County, Volume 
From 
(Select TownName, County, Volume, max(Volume) over (partition by TownName) as highest_volume 
From tableA 
Inner Join tableB 
On TownName = Town) as x 
where Volume = x.highest_volume 
Order By TownName, Volume, County 

편집

이 당신의 상황을 재현하는 올바른 방법은? 당신이 MySQL을 사용하는 경우

create table tableA (
TownName varchar(100) 
); 

create table tableB (
Town varchar(100), 
County varchar(100), 
Volume integer 
); 

insert into tableA values('Abinton'); 
insert into tableA values('Abinton'); 
insert into tableB values('Abinton','Limerick',0); 
insert into tableB values('Abinton','Lanarkshire',11); 
insert into tableB values('Abinton','Northamptonshire',13); 
+0

정확한 코드에 대한 오류 수정, 나는 여전히 91,669 행을 반환했다. –

+0

어떤 수정? 나는 필드를 깜박했기 때문에 편집했습니다. 하지만 여기서 테스트하고 올바른 답을 얻고 있습니다. 제가 여기 제대로하고 있는지 볼 수 있도록 몇 개의 삽입물을 줄 수 있습니까? –

+0

여기서 Volume = 오류를 던졌습니다 - highest_volume =으로 변경하고 작동했습니다. –

0

다음이 쿼리가 작동해야합니다

SELECT 
    a.TownName, 
    (SELECT b1.County FROM tableB b1 
    WHERE b1.Town = a.TownName AND b1.Volume = b.max_volume 
    LIMIT 1) AS Country, 
    b.max_volume AS Volume 
FROM tableA a 
INNER JOIN (
    SELECT Town, MAX(Volume) AS max_volume 
    FROM tableB 
    GROUP BY Town 
) b ON b.Town = a.TownName 
ORDER BY a.TownName, County 

를 데이터베이스 서버가 윈도우 기능을 지원하는 경우, 다음 쿼리는 간단 할 수 있습니다

SELECT a.TownName, b.County, b.Volume 
FROM tableA a 
INNER JOIN (
    SELECT Town, County, Volume, 
    ROW_NUMBER() OVER (PARTITION BY Town ORDER BY Volume DESC) rn 
    FROM tableB 
) b 
ON b.Town = a.TownName AND b.rn = 1 
ORDER BY a.TownName, b.County 
관련 문제