2009-09-15 4 views
0

Так что у меня такая проблема.SQL Query (возможно, простой)

У меня есть две таблицы (Oracle), одна называется Destination, а другая - Reserve. Резерв имеет внешний ключ для идентификатора пункта назначения (потому что у резерва есть один пункт назначения). И резервные кортежи означают все резервы, которые сделали все пользователи. Мне нужен способ проверить 3 самых посещаемых пункта назначения (на основе внешнего ключа в таблице Reserve).

Как я могу это сделать с SQL в Oracle. Я знаю, что мне нужно искать в резервных таблицах три наиболее повторяющихся идентификатора назначения, а затем присоединяться к таблице Destination, чтобы получить информацию о трех лучших местах назначения.

Любая помощь действительно. Большое спасибо.

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) 
    ) ; 

Только примечание:

RESERVE является Reserva НАЗНАЧЕНИЯ является Destino

Поскольку БД на испанском языке. Благодаря!

+0

Это было бы проще, если бы вы дали нам точную схему БД. Подобно операторам CREATE TABLE, которые дублируют вашу настройку. –

+0

Уверен, прямо сейчас – Sheldon

ответ

2

Возможно, мне что-то не хватает, но как насчет группировки по внешнему ключу и сортировки по результирующим значениям?

Edit: Что-то вроде:

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

Привет, спасибо! Это отлично работает за исключением одной вещи ... если я положил предел, это не работает для оракула, только для MySQL рабочего запроса: выберите fk_cod_destino, граф (*) в качестве cantidad из группы Reserva по fk_cod_destino порядке cantidad desc – Sheldon

+1

Существует ли LIMIT в Oracle? Я думал, что он доступен только для MySQL. –

+0

Как я могу ограничить результат до 3 с помощью оракула WHERE rownum <= 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

вы можете попробовать HAVING RowNum < = 3