2014-07-22 5 views
0

제목이 의미가 없다는 것을 알고 있습니다. 나는 그것을 어떻게 바꾸어야할지 모르겠군요. 그래서 지금 제가 직면하고있는 것이 있습니다. 나는 하나의 테이블을 가지고 있는데, 큰 테이블은 거의 2M 개의 행을 가지고있다. 이 테이블이며 이미 I은 Resep = 'R'을 갖는 데이터로 구성 결과를 원하는 NoRegis=1411940Jumlah>0조건이없는 행을 선택하십시오.

|| Kode || Nama || Kali || Hari || Resep || Jumlah || 
++======++======++======++======++=======++========++ 
||AL-128||SP 5 ||  ||  ||A  ||5.00 || 
||AL-132||SP 10 ||  ||  ||A  ||3.00 || 
||AL-132||SP 10 ||  ||  ||A  ||7.00 || 
||DS-074||PARACE||3  ||1  ||R  ||10.00 || 
||DS-119||ASP 81||1  ||1  ||R  ||5.00 || 
||AL-242||VEN 2 ||  ||  ||A  ||1.00 || 
||AL-242||VEN 2 ||  ||  ||R  ||1.00 || 

하여 여과 하였다. 이런 일 :

|| Kode || Nama || Kali || Hari || Resep || Jumlah || 
++======++======++======++======++=======++========++ 
||DS-074||PARACE||3  ||1  ||R  ||10.00 || 
||DS-119||ASP 81||1  ||1  ||R  ||5.00 || 

가 마지막 데이터 (AL-242)을 참조 두 행이 모두 Resep = 'R'과 Resep = 'A'로 구성되어 있으며, I는 간단한 것이 추천

SELECT Kode,Nama,Kali,Hari,Resep,sum(Jumlah) FROM Frm_Ranap 
where NoRegis=1411940 and Jumlah>0 and resep<>'A' GROUP by Kode 
시도

하지만 아직 AL-242가 있는데, 거기에 있지 않아야합니다. 그것이 나에게 어떤 결과를 보여 결코 너무 많은 데이터를 가지고 아마 때문에, 작동을 멈출 수 없다, 나는 또한

SELECT Kode,Nama,Kali,Hari,Resep,sum(Jumlah) FROM Frm_Ranap 
WHERE kode not in (
select Kode FROM Frm_Ranap WHERE NoRegis=1411940 and Jumlah>0 and Resep='A') 
and NoRegis=1411940 and Jumlah>0 GROUP by Kode 

처럼 뭔가를 시도했지만 때마다 나는이 쿼리를 실행하려고.

먹었습니까?

+0

하나에 복합 인덱스를 이용할 수있는이 쿼리를 않습니다 예상되는 출력이 맞습니까? –

+0

그래, 그 이유는 내가 여기 묻는거야, 그 같은 결과를 얻는 방법을 모르겠다 – Darjeeling

답변

0

반환되는 첫 번째 쿼리를 사용하겠습니다. 당신은 단지 where 절 대신 having 절에 A에 조건을 이동해야합니다

SELECT Kode, Nama, Kali, Hari, Resep, sum(Jumlah) 
FROM Frm_Ranap 
WHERE NoRegis = 1411940 and Jumlah > 0 
GROUP by Kode 
HAVING sum(resep = 'A') = 0; 

having 표현은 조건에 맞는 각 그룹 (즉 각 kode의 경우)의 행 수를 계산합니다. = 0은 그룹에 해당 행이 없음을 지정합니다.

+0

이것은 지금까지 올바른,하지만 꽤 시간이 걸립니다, 이것을 최적화하는 방법이 무엇입니까? – Darjeeling

+0

@ student080705639 . . 내 유일한 제안은'Frm_Ranap (NoRegis, Jumlah)'에 대한 색인입니다. –

0

먼저 당신이 원하는되지 않은 모든 행을 선택

SELECT Kode FROM Frm_Ranap where resep<>'R' GROUP by Kode 

그런 다음 당신은 당신이 원하는 사람을 선택,하지만 첫 번째에있는 사람을 선택하지 :

SELECT Kode,Nama,Kali,Hari,Resep,sum(Jumlah) FROM Frm_Ranap where NoRegis=1411940 and Jumlah>0 and Kode not in (SELECT Kode FROM Frm_Ranap where resep<>'R' GROUP by Kode) group by Jumlah 
0

나는이 (2 KODE, 1,)! = 'AL'는 기록을 필터링합니다 당신에게

SELECT Kode,Nama,Kali,Hari,Resep,sum(Jumlah) 
FROM Frm_Ranap 
WHERE NoRegis=1411940 
AND Jumlah>0 
AND resep<>'A' 
AND SUBSTRING(Kode, 1, 2) != 'AL' 
GROUP by Kode 

SUBSTRING 도움이 될 생각하는 요 u를 제거하고 싶습니다.

+1

OP가 동일한 쿼리를 찾고 있는지는 잘 모르겠지만 테이블을보고 나면 원하는 결과를 얻을 수있는 좋은 방법입니다. 명성!! –

+0

나는 이것을 시도하지는 않았지만 'AL'로 시작하는 모든 코드를 제거하기로되어 있지 않습니까? 나는 그런 일이 일어나길 원하지 않는다. 내가 보여준 데이터는 단지 예일뿐입니다. 'AL'로 시작하는 모든 코드가 필요하지는 않은지 알 수 없습니다. – Darjeeling

+0

예 'AL'코드가있는 모든 코드가 제거됩니다. –

0

을 사용하여 AResep이없는 kode을 선택할 수 있습니다. 일반적으로 not exists은 하위 쿼리가 큰 결과 집합을 반환하고 테이블이 제대로 인덱싱 될 때 not in보다 빠릅니다. ! R을 가지고있는 한 -

select Kode,Nama,Kali,Hari,Resep,sum(Jumlah) 
from Frm_Ranap t1 
where NoRegis=1411940 and Jumlah>0 and Resep <> 'A' 
and not exists (select 1 from Frm_Ranap t2 
where t2.Kode = t1.Kode and t2.Resep = 'A' 
and t2.NoRegis = 1411940 and t2.Jumlah > 0) 
group by Kode 

은 ** ** = 'A'` resep`당신의 "AL-242"기록의 (NoRegis,Kode,Resep,Jumlah)

관련 문제