2009-09-15 5 views
0

그래서이 문제가 있습니다.SQL 쿼리 (아마도 간단하다)

두 테이블 (Oracle)이 있는데, 하나는 대상이라고하고 다른 하나는 예비라고합니다. Reserve에는 목적지의 ID에 대한 외래 키가 있습니다 (예약시 하나의 대상이 있으므로). 예약 튜플은 모든 사용자가 수행 한 모든 예약을 의미합니다. 가장 많이 방문한 상위 3 개 목적지를 확인하는 방법이 필요합니다 (테이블 예약의 외래 키 기반).

Oracle에서 SQL을 사용하여 어떻게 수행 할 수 있습니까? Reserve 테이블 내에서 가장 많이 반복되는 3 개의 Destination ID를 검색하고 나중에 Destination 테이블과 조인하여 상위 3 개 목적지의 세부 정보를 가져와야한다는 것을 알고 있습니다.

도움말이 유효합니다. 고맙습니다.

SCHEMA :

-------------------------------------------------------- 
-- File created - martes-septiembre-15-2009 
-------------------------------------------------------- 
-------------------------------------------------------- 
-- DDL for Table DESTINO 
-------------------------------------------------------- 

    CREATE TABLE "S2501A29"."DESTINO" 
    ( "PK_ID_DESTINO" NUMBER(10,0), 
    "FK_COD_UBICACION_GEOGRAFICA" NUMBER(10,0), 
    "NOMBRE" VARCHAR2(10), 
    "FOTO" VARCHAR2(30), 
    "DESCRIPCION" VARCHAR2(50) 
    ) ; 
-------------------------------------------------------- 
-- DDL for Table LUGAR_ESTADIA 
-------------------------------------------------------- 

    CREATE TABLE "S2501A29"."LUGAR_ESTADIA" 
    ( "PK_ID_ESTADIA" NUMBER(10,0), 
    "NOMBRE" VARCHAR2(10), 
    "TIPO" VARCHAR2(10), 
    "DESCRIPCION" VARCHAR2(50), 
    "COSTO_SERVICIOS" NUMBER, 
    "DESCRIPCION_ALOJAMIENTO" VARCHAR2(100), 
    "DESCRIPCION_ALIMENTACION" VARCHAR2(100) 
    ) ; 
-------------------------------------------------------- 
-- DDL for Table OPCION_TRANSPORTE 
-------------------------------------------------------- 

    CREATE TABLE "S2501A29"."OPCION_TRANSPORTE" 
    ( "PK_ID_VIAJE" NUMBER(10,0), 
    "MEDIO_TRANSPORTE" VARCHAR2(10), 
    "RESPONSABLE" VARCHAR2(10), 
    "CIUDAD_ORIGEN" VARCHAR2(10), 
    "CIUDAD_DESTINO" VARCHAR2(10), 
    "COSTO" NUMBER 
    ) ; 
-------------------------------------------------------- 
-- DDL for Table RESERVA 
-------------------------------------------------------- 

    CREATE TABLE "S2501A29"."RESERVA" 
    ( "PK_ID_RESERVA" NUMBER(10,0), 
    "FK_COD_DESTINO" NUMBER(10,0), 
    "FK_COD_ESTADIA" NUMBER(10,0), 
    "FK_COD_VIAJE" NUMBER(10,0), 
    "TARJETA_CREDITO" VARCHAR2(12), 
    "FECHA_SALIDA" DATE, 
    "FECHA_REGRESO" DATE, 
    "NOMBRE_USUARIO" VARCHAR2(50) 
    ) ; 
-------------------------------------------------------- 
-- DDL for Table UBICACION_GEOGRAFICA 
-------------------------------------------------------- 

    CREATE TABLE "S2501A29"."UBICACION_GEOGRAFICA" 
    ( "PK_ID_UBICACION" NUMBER(10,0), 
    "CIUDAD" VARCHAR2(10), 
    "PAIS" VARCHAR2(10), 
    "CONTINENTE" VARCHAR2(10) 
    ) ; 

그냥 참고 : DB 스페인어에 있기 때문에

RESERVE 인 세르 DESTINATION은 운명의

입니다. 감사!

+0

당신이 우리에게 DB의 정확한 스키마를 준 경우가 쉬울 것이다. 설정을 복제하는 CREATE TABLE 문과 같습니다. –

+0

예, 바로 지금 – Sheldon

답변

2

어쩌면 내가 누락되었지만 외래 키로 그룹화하고 결과 값으로 정렬하는 것은 어떨까요?

편집 : 뭔가 같은 :

select FK_COD_DESTINO, count(*) as qty from RESERVA group by FK_COD_DESTINO order by qty desc limit 3 
+0

안녕하세요 budy thanks! 내가 한계를 넣어 경우 한 가지를 제외하고 완벽하게 작동 는 ..., 그냥 MySQL의 를 들어, 오라클이 작동하지 않습니다 쿼리 작업은 다음과 같습니다 선택 fk_cod_destino는 RESERVA 그룹에서 cantidad로 (*) 계산 에 의해 fk_cod_destino 명령에 의해 캔디다 desc – Sheldon

+1

오라클에 LIMIT가 존재합니까? MySQL에서만 사용할 수 있다고 생각했습니다. –

+0

오라클 WHERE rownum <= 3을 사용하여 결과를 3으로 어떻게 제한 할 수 있습니까? 끝까지 넣었지만 작동하지 않습니다. 너무 많은 질문과 나쁜 영어로 죄송합니다. – Sheldon

1

방법에 대해 :

WITH CountsByDestination 
AS 
(
    SELECT FK_COD_DESTINO, 
     COUNT(*) CNT 
    FROM Reservations 
    GROUP BY DestinationId 
), 
RankingByDestination 
AS 
(
    SELECT FK_COD_DESTINO, 
     CNT, 
     RANK() OVER (ORDER BY CNT) RNK 
    FROM CountsByDestination 
) 
SELECT * 
FROM RankingByDestination R 
INNER JOIN Destinations D ON D.PK_ID_DESTINO = R.FK_COD_DESTINO 
WHERE R.RNK BETWEEN 1 AND 3 
ORDER BY R.RNK 

두 개 이상의 목적지가 같은 수를 공유하는 경우가 결과의 일부로 표시 할 수 있도록이, 관계를 유지 세트.

1

오라클은 limit을 지원하지 않습니다. 이것은 당신을 위해 작동해야합니다.

select A.FK_COD_DESTINO 
    , A.COUNT 
    , A.RANK 
    , B.* 
    from (select FK_COD_DESTINO 
      , count(*) as COUNT 
      , rank() over (order by count(*) desc) as RANK 
      from RESERVA 
     group by FK_COD_DESTINO) A 
    join DESTINO B on B.PK_ID_DESTINO = A.FK_COD_DESTINO 
where A.RANK <= 3 
1

당신이 ROWNUM을 HAVING 시도 할 수 < = 3