2012-03-22 1 views
1

Bonjour, Je crée une base de données qui permet aux utilisateurs de faire une réservation dans un restaurant. Voici mon modèle de données pour la base de données.Réservation de base de données Oracle avec SQL

Ma question est que je suis un peu confus avec la façon dont je vérifierais pour les tables qui sont disponibles sur une nuit donnée. Le restaurant a 15 tables pour n'importe quelle nuit avec 4 personnes à une table (les groupes peuvent être de 4 à 6 grands, les groupes plus grands que 4 prendront deux tables). Comment devrais-je interroger la base de données pour retourner les tables qui sont disponibles sur une nuit donnée.

Merci.

EDIT ::

C'est ce que je l'ai essayé. (Certaines d'entre elles est pseudo que je ne suis pas tout à fait sûr de savoir comment faire)

SELECT tables.table_id 
FROM tables 
LEFT JOIN table_allocation 
ON tables.table_id = table_allocation.table_id 
WHERE table_allocation.table_id is NULL; 

Cela renvoie les lignes vides et qu'il vérifie la présence de pas de la table. Je ne suis pas tout à fait sûr comment je ferais le test de bit de date.

+2

http://mattgemmell.com/2008/12/08/what-have-you-tried/ –

Répondre

3

Pour trouver des lignes de table qui ont pas lignes de TABLE_ALLOCATION sur une donnée THEMED_NIGHT.TEME_NIGHT_DATE, vous devriez être en mesure de faire quelque chose comme ceci:

SELECT * 
FROM TABLES 
WHERE 
    TABLE_ID NOT IN (
     SELECT TABLE_ALLOCATION.TABLE_ID 
     FROM 
      TABLE_ALLOCATION 
      JOIN RESERVATION 
       ON TABLE_ALLOCATION.RESERVATION_ID = RESERVATION.RESERVATION_ID 
      JOIN THEMED_NIGHT 
       ON RESERVATION.THEME_ID = THEMED_NIGHT.THEME_ID 
     WHERE 
      THEME_NIGHT_NAME = :the_date 
    ) 

En clair:

  • Inscrivez-vous TABLE_ALLOCATION, RESERVATION et THEMED_NIGHT et n'acceptent que ceux qui sont à la date donnée (:the_date).
  • Supprimez les lignes TABLE liées aux lignes ci-dessus (NOT IN).
  • Les lignes TABLE qui restent sont libres pour la nuit.
+0

relation. –

+0

@MarkBannister Ahh ... J'ai complètement raté RESERVATION.TIME. Quoi qu'il en soit, votre réponse a mon +1 :) –

1

Essayez:

SELECT tables.table_id 
FROM tables t 
WHERE NOT EXISTS 
(SELECT NULL 
FROM table_allocation a 
JOIN reservation r 
    ON a.reservation_id = r.reservation_id and 
     r.`TIME` between :Date and :Date+1 
WHERE t.table_id = a.table_id) 

Note: renvoie uniquement les tables qui ne sont pas réservés à tout moment le jour en question. Cela exclura uniquement les tables qui ont été réservées pour une nuit à thème - la ligne pointillée à THEMED_NIGHT implique que ceci est facultatif.

Questions connexes