가입

2012-06-21 6 views
0

나는가입

표 과일을

FruitID | Fruit | Unit Price 
    1 | Orange |  $3 
    2 | Apple |  $2 
    3 | Grape |  $4 

표 FruitDetails

Picture  | Color | FruitID 
Orange_o.jpg | Orange | 1 
Apple_g.jpg | Green | 2 
Apple_r.jpg | Red  | 2 
Grape_p.jpg | Purple | 3 
Grape_g.jpg | Green | 3 

의 I 취득하는 결과없이 반복되는 이름을 가진 모든 과일이다

을 요청하는 쿼리가 있습니다. 예

Fruit | UnitPrice | Picture  | Color 
Orange| $3  | Orange_o.jpg | Orange 
Apple | $2  | Apple_g.jpg | Green 
Grape | $4  | Grape_p.jpg | Purple 

는 그렇게하는 것이 가능인가요? 감사합니다.

+4

무슨에 합류? 당신은 지금 어떤 질문을하나요? –

+0

'FruitDetails'에서 올바른 행을 어떻게 선택합니까? 포도가 자주색이고 사과가 녹색이라는 것을 어떻게 알 수 있습니까? –

+0

은 로직을 wats합니까? – manurajhada

답변

1

SQL Server 용으로 작성했지만 실제 쿼리는 다른 데이터베이스에서 작동해야합니다.

설정 데이터 :

declare @Fruit table (FruitID int not null,Fruit varchar(10) not null,UnitPrice int not null) 
insert into @Fruit(FruitID,Fruit,UnitPrice) values 
(1,'Orange',3), 
(2,'Apple',2), 
(3,'Grape',4) 

declare @FruitDetails table (FruitID int not null,Picture varchar(20) not null,Color varchar(10) not null) 
insert into @FruitDetails (FruitID,Picture,Color) values 
(1,'Orange_o.jpg','Orange'), 
(3,'Grape_p.jpg','Purple'), 
(3,'Grape_g.jpg','Green'), 
(2,'Apple_g.jpg','Green'), 
(2,'Apple_r.jpg','Red') 

검색어 :

select 
    f.Fruit, 
    f.UnitPrice, 
    fd.Picture, 
    fd.Color 
from 
    @Fruit f 
     inner join 
    @FruitDetails fd 
     on 
      f.FruitID = fd.FruitID 
     left join 
    @FruitDetails fd_anti 
     on 
      f.FruitID = fd_anti.FruitID and 
      fd_anti.Picture < fd.Picture --This is the condition for picking a better row 
where 
    fd_anti.FruitID is null --This eliminates rows where a better row was picked 

결과 : 당신의 예상 결과와 일치하지 않는,하지만 당신은 우리에게 좋은를 부여하지 않은

Fruit  UnitPrice Picture    Color 
---------- ----------- -------------------- ---------- 
Orange  3   Orange_o.jpg   Orange 
Grape  4   Grape_g.jpg   Green 
Apple  2   Apple_g.jpg   Green 

FruitDetail에서 "최상의"행을 선택하는 조건에 대한 정의.

+0

왼쪽 조인을 사용하는 단점은 쿼리 최적화 프로그램을 제한한다는 것입니다. 중첩 된 선택 또는 다른 그룹화 된 조인으로 "최상의"그림을 선택하면 제한이 줄어 듭니다. –

+0

@JanHudec - "최상의"결과 행을 찾기 위해 복잡한 다중 열 조건이 필요한 경우 중첩 선택이 아닌 anti-join으로 표현할 수 있습니다. –

+0

예, 순서를 나타내는 숫자 또는 값을 계산할 수 없으면 중첩 된 선택 항목이나 실제로 그룹화 된 항목을 사용할 수 있습니다. –

1

SQL에서 "아무 것도 선택하지"않습니다. 좋은 이유가있는 것은 아닙니다. 그것은 결정적이지 않을 것이고, 그것은 당신의 애플리케이션을 디버깅하려고하는 두통을 줄 것입니다. 그러나 수동으로 선택하는 것이 가능합니다. 일부 데이터베이스에는 당기는 데 약간의 추가 트릭이 필요합니다 (일부 데이터베이스는 확장이 쉽기 때문에 일반 SQL에 대해 설명합니다).

그래서 먼저 가입하려는 한 줄을 선택하는 기준을 선택해야합니다. 색상이 알파벳순으로 먼저 나오는 것을 원한다고 가정 해보십시오 (실제로는 우선 순위 또는 중요성을 가질 수 있습니다). 사용하는 열은 과일마다 고유해야합니다! 그룹 별 또는 중첩 선택을 사용하여 다른 조인을 통해 계산할 수 있습니다. 중첩 된 선택은 IMO로 작성하고 이해하기가 더 쉽습니다. 그것은 다음과 같습니다없이 FruitDetails 테이블을 가정

select * from Fruit 
    join FruitDetails as outer 
     on outer.Fruit = Fruit.Fruit 
     and outer.Color = (select min(Color) from FruitDetails as inner where inner.Fruit = Fruit.Fruit) 

당신이 잊고 Fruit 열을 가지고 있지만 :

(select min(Color) from FruitDetails as inner where inner.Fruit = Fruit.Fruit) 

지금 당신이 그렇게, 색상이 하나 인 것을 조건으로 테이블을 조인 그것은 조인이 전혀 불가능합니다. 그리고 각 과일에 대한 최소 색상 값을 갖는 단 하나의 라인이 있다는 것을 보장하기 위해 unique(Fruit, Color) 제한이 있습니다.

이와 다른 대안이 될 것 조인

select Fruit.* ThisDetails.* 
    from Fruit 
    join FruitDetails as ThisDetails using (Fruit) 
    join FruitDetails as BestDetails using (Fruit) 
    group by Fruit.*, ThisDetails.* 
    having ThisDetails.Color = min(BestDetails.Color) 

(using (column) 대부분의 onetable.column = othertable.column의 약자입니다, 전부는 아니지만, SQL 변종)