2009-09-15 68 views
0

所以我有這個問題。SQL查詢(可能很簡單)

我有兩個表(Oracle),一個叫Destination,另一個叫Reserve。保留區有一個外鍵給目的地的ID(因爲保留區有一個目的地)。並且保留元組意味着所有用戶已經完成的所有儲備。我需要一種方法來檢查前3個最常訪問的目標(基於表中的外鍵)。

如何在Oracle中使用SQL執行此操作。我知道我需要在保留表中搜索最重複的3個目的地ID,然後將其與目的地表加入以獲得前3個目的地的詳細信息。

任何幫助都是有效的。非常感謝你。

架構:

-------------------------------------------------------- 
-- 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是西班牙語。謝謝!

+0

如果你給我們的DB的精確模式這會更容易些。與CREATE TABLE語句一樣,它將複製您的設置。 – 2009-09-15 18:50:48

+0

當然,現在 – Sheldon 2009-09-15 18:51:56

回答

2

也許我錯過了一些東西,但外鍵分組和按結果值排序呢?

編輯:喜歡的東西:

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

嘿budy謝謝! 該工程除了一兩件事完美...如果我把這個限制,它並不適用於甲骨文的工作,只爲MySQL 查詢工作是: 選擇fk_cod_destino,COUNT(*)從RESERVA組cantidad由fk_cod_destino命令由cantidad desc – Sheldon 2009-09-15 19:04:38

+1

在Oracle中是否存在LIMIT?我認爲它只適用於MySQL。 – 2009-09-15 19:05:28

+0

如何使用oracle WHERE rownum <= 3 將結果限制爲3我把它放在最後但不起作用。對不起,有很多問題和我的英語不好。 – Sheldon 2009-09-15 19:05:34

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

Oracle不支持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 < = 3