Member 13142345 Ответов: 1

Как получить данные из 2 таблиц, объединив их


У меня есть 2 стола

Таблица 1-это главная таблица, где я храню статус комнаты, номер комнаты и статус уборки.

select room_no,room_status,housekeeping_status from room_master


Выполнив вышеприведенный запрос, я получу следующий результат.

room_no      room_status       housekeeping_status
801          vacant             Ready
802          Vacant             Dirty
803          Occupied           Dirty
804          vacant             Ready
805          Occupied           Clean


Используя приведенные выше результаты я пишу приведенный ниже код для назначения комнат в список
добавление изображения,текста и номера номера в зависимости от статуса

strsql = "select room_no,room_status,housekeeping_status from room_master"
 dt1 = ConnectionModule.HMSgetdataset(strsql)

 Dim lst1() As ListViewItem
        ReDim Preserve lst1(dt1.Rows.Count - 1)
        For i = 0 To dt1.Rows.Count - 1
            If dt1.Rows(i)(1) = "Vacant" And dt1.Rows(i)(2) = "Ready" Then
                lst1(i) = New ListViewItem
                lst1(i).Text = dt1.Rows(i)(0)
                lst1(i).ImageIndex = 2
                lst1(i).BackColor = Color.SpringGreen
                lbl_vacantready.Text = CDbl(lbl_vacantready.Text) + 1
            ElseIf dt1.Rows(i)(1) = "Vacant" And dt1.Rows(i)(2) <> "Ready" And dt1.Rows(i)(2) <> "OutInv" And dt1.Rows(i)(2) <> "OutOdr" Then
                lst1(i) = New ListViewItem
                lst1(i).Text = dt1.Rows(i)(0)
                lst1(i).ImageIndex = 0
                lst1(i).BackColor = Color.CadetBlue
                lbl_vacantnotready.Text = CDbl(lbl_vacantnotready.Text) + 1
            ElseIf dt1.Rows(i)(1) = "Occupied" Then
                lst1(i) = New ListViewItem
                lst1(i).Text = dt1.Rows(i)(0)
                lst1(i).ImageIndex = 1
                lst1(i).BackColor = Color.Aqua
                lbl_occupied.Text = CDbl(lbl_occupied.Text) + 1
            ElseIf dt1.Rows(i)(2) = "OutInv" Then
                lst1(i) = New ListViewItem
                lst1(i).Text = dt1.Rows(i)(0)
                lst1(i).ImageIndex = 4
                lst1(i).BackColor = Color.OrangeRed
                lbl_OOI.Text = CDbl(lbl_OOI.Text) + 1
            ElseIf dt1.Rows(i)(2) = "OutOdr" Then

                lst1(i) = New ListViewItem
                lst1(i).Text = dt1.Rows(i)(0)
                lst1(i).ImageIndex = 5
                lst1(i).BackColor = Color.Orange
                lbl_OOR.Text = CDbl(lbl_OOR.Text) + 1
            End If
        Next


Что я уже пробовал:

Теперь требование заключается в том, что когда есть бронирование с любым номером, то мне нужно добавить
"(R)" рядом с комнатой нет.
Для проверки бронирования я использую следующий запрос.

strsql="select roomno from guestreservation where arrivaldate=cast('" & Format(currdate(), "dd-MMM-yyyy") & "' as smalldatetime)"


он даст номера номеров, которые были забронированы на сегодняшний день.
room_no
801
802



поэтому для номеров комнат 801 и 802 нужно добавить "(R)" рядом с номером комнаты.
я написал нижеприведенную строку, чтобы добавить "(R)". Но он должен быть отключен только тогда, когда есть бронирование с этим номером, для остальных номеров номер номера будет отображаться как тот же самый.
lst1(i).Text = dt1.Rows(i)(0).Tostring() + "R"


поэтому я предполагаю добавить "(R)" только в цикле.

"how can i join the 2 queries to get the room number as reserved"

jaket-cp

Вы должны быть в состоянии сделать это в SQL - что-то вроде этого (непроверенное):
выбирать
гр.room_no,
гр.room_status,
гр.housekeeping_status,
дело
когда gr.roomno равен нулю, то "
еще одна буква "Р"
конец AmIReserved
от room_master rm
слева присоединяйтесь к guestreservation gr
на rm.roomno = gr.roomno
и Cast(getdate() выполняет как дата) = приведение(arrivaldate как дата)
;

Member 13142345

Спасибо. Он работал с модификациями.

jaket-cp

рад помочь - но я вижу, что решение 1 хорошо, он получает мои 5+

1 Ответов

Рейтинг:
7

Maciej Los

Я бы сделал это вот так:

SELECT RM.room_no, RM.room_status, RM.housekeeping_status, CASE WHEN GR.roomno IS NULL THEN 'F' ELSE 'R' END AS FreeOrReserved
FROM room_master AS RM LEFT JOIN 
(
    SELECT *
    FROM guestreservation 
    WHERE arrivaldate = CAST(GETDATE() AS SMALLDATETIME)
) AS GR ON RM.room_no = GR.roomno


Кстати: никогда, никогда не используйте сцепленную строку, как это:
strsql="select roomno from guestreservation where arrivaldate=cast('" & Format(currdate(), "dd-MMM-yyyy") & "' as smalldatetime)"

потому что вы выставляете свою базу данных для SQL-инъекция[^].
Лучше использовать параметризованный запрос[^] (что в данном примере - вам не нужно).

Для получения более подробной информации, пожалуйста, смотрите:
Визуальное представление SQL-соединений[^]
Как выполнять параметризованные запросы | Microsoft Docs[^]


Member 13142345

спасибо Вам за решения и за коррекцию.

Maciej Los

Всегда пожалуйста.

Member 13142345

другой запрос, Что делать, если я хочу добавить условие к этому запросу, чтобы показать только комнаты, основанные на условии

Скрыть   скопировать код

SELECT RM.room_no, RM.room_status, RM.housekeeping_status, CASE WHEN GR.roomno IS NULL THEN 'F' ELSE 'R' END AS FreeOrReservedFROM room_master AS RM LEFT JOIN (    SELECT *    FROM guestreservation     WHERE arrivaldate = CAST(GETDATE() AS SMALLDATETIME)) AS GR ON RM.room_no = GR.roomno and room_status='Vacant' and housekeeping_status='Ready' 

если я написал так, то это выбор всех комнат, опуская условие where, и результатов тоже много. вы можете мне помочь

Maciej Los

Дорогой,

Я не могу получить доступ к вашей базе данных, HD или экрану... Вы должны изменить вышеуказанный запрос в соответствии с вашими потребностями...

Member 13142345

Неверный Вопрос... Спасибо....