2016-07-01 7 views
1

zum ersten Mal stelle ich hier eine Frage, ich bin eine Reservierung Anwendung auf C# mit Visual Studio 2015, aber ich habe ein Problem versucht, freie Räume in einem Datenraster anzuzeigen, hier ist die Abfrage ich verwende:Vermeiden Sie wiederholte Werte in SQL-Abfrage, Reservierungen Anwendung

SELECT clientID, cost, arrival, roomNumber, resvNum, departure, size 
FROM roomswithresvView 
WHERE (roomNumber NOT IN 
     (SELECT roomNumber 
      FROM roomswithresvView AS roomswithresvView_1 
      WHERE (arrival BETWEEN @date1 AND @date2) 
      OR (departure BETWEEN @date1 AND @date2))) 

das Problem ist, dass, wenn ein Zimmer mehr als eine Reservierung hat, wird die Abfrage es mehrmals zeigen, ich habe mit DISTINCT versucht, aber ich kann nur Arbeit macht mit einer Spalte und ich konnte GROUP BY nicht arbeiten.

Vielen Dank für Ihre Aufmerksamkeit.

Query Sample

Zum Beispiel, wenn ich die Abfrage mit 2016.07.06 als date1 und 2016.07.07 als date2 testen, wird es Raum 1005 wiederholen, weil es zwei Vorbehalte auf die Datenbank hat.

+0

Aber Sie fragen nach den Reservierungen. Sie sollten diese Frage löschen und eine andere Frage mit Beispieldaten und gewünschten Ergebnissen stellen. –

+0

Können Sie angeben, welche Spalte unterschiedlich ist? – NikhilSN

+0

Danke, ich habe es auf roomNumber getestet, das ist, wo ich sehen kann, wenn ein Zimmer –

Antwort

0

Wo haben Sie die DISTINCT platziert?

Sie benötigen einen Tisch für die Zimmer und einen Tisch für Reservierungen. Dann benötigen Sie eine Unterabfrage, um Reservierungen zu finden, die mit den von Ihnen gewünschten Daten kollidieren. Hier verwenden Sie DISTINCT. Dann benötigen Sie eine äußere Abfrage, um alle Räume zu finden, die in der Unterabfrage nicht zurückgegeben wurden. Vergessen Sie nicht den Fall, in dem Sie eine bestehende Reservierung haben, die vor und nach dem gewünschten Datum beginnt! Putting das alles zusammen, erhalten Sie diese ...

insert into room(costPerNight, roomNumber, size) 
values 
(55, 1, 13), 
(65, 2, 15), 
(85, 3, 20) 
; 

create table reservation(
id int identity (1,1) not null, 
roomId int not null, 
dateIn date not null, 
dateOut date not null 
) 

insert into reservation (roomId, dateIn, dateOut) 
values 
(1,'2016-07-01','2016-07-03'), 
(1,'2016-07-05','2016-07-08'), 
(2,'2016-07-01','2016-07-08') 
*/ 

declare @requestedDateIn date = '2016-07-03' 
declare @requestedDateOut date = '2016-07-05'; 

select * from room where id not in(
--find clashing reservations 
select distinct roomId from reservation where 
(dateOut > @requestedDateIn and dateOut < @requestedDateOut) 
or (dateIn > @requestedDateIn and dateIn < @requestedDateOut) 
or (dateIn < @requestedDateIn and dateOut > @requestedDateOut) 
) 
Verwandte Themen