преобразование нормального запроса в подзапрос дает разные результаты - PullRequest
0 голосов
/ 06 ноября 2019

Я делаю вопрос, используя подзапрос (без JOIN) и обычный (используя JOIN) запрос, но в конце результаты отличаются от этих двух запросов, я не могу понять эту проблему.

Вопрос заключается в том, чтобы указать данные о владельце собаки, который забронировал на этой платформе как минимум дважды

PET_OWNER(Owner_id,Oname,OAdd),
PET(Pet_id,Pname,PType),
BOOKING(Booking_num,Pet_id)

у каждого владельца может быть> = 1 собака, у каждой собаки> = 1 бронирование

SELECT PET_OWNER.Owner_id,Oname,OAdd,COUNT(*) AS BOOKING
FROM PET_OWNER,
     PET,
     BOOKING 
WHERE PET_OWNER.Owner_id = PET.Owner_id
  AND PET.Pet_id = BOOKING.Pet_id
  AND PType = 'DOG'
GROUP BY PET_OWNER.Owner_id, Oname, OAdd
HAVING COUNT(*) >=2
ORDER BY PET_OWNER.Owner_id;`

это обычный запрос, показывающий, какой владелец собаки забронировал как минимум дважды


SELECT *
FROM PET_OWNER
WHERE Owner_id IN ( SELECT Owner_id FROM PET
                    WHERE Pet_id IN ( SELECT Pet_id FROM BOOKING)
                      AND PType = 'DOG'
                    GROUP BY Owner_id 
                    HAVING COUNT(*) >1);

проблема в этом подзапросе заключается в том, что в результате показано, у какого владельца есть по крайней мере две собакино не какой владелец собаки сделал заказ по крайней мере дважды. подзапрос автоматически показывает мне отличный pet_id, так что я не могу рассчитывать на Pet_id в таблице Booking, потому что он всегда показывает только 1 ** любое соединение не допускается в этом подзапросе

какие изменения я должен внести вкод подзапроса? я ожидаю, что эти два запроса имеют одинаковые результаты

Ответы [ 3 ]

0 голосов
/ 06 ноября 2019

Я думаю, вы должны сделать 2 подзапроса для этой цели:

SELECT * FROM PET_OWNER
 WHERE OWNER_Id IN (SELECT Owner_id FROM PET 
                     WHERE PType = 'DOG'
                       AND Pet_Id IN (SELECT Pet_id 
                                        FROM BOOKING
                                       GROUP BY Pet_id
                                       HAVING COUNT(*) > 1))
    OR OWNER_Id IN (SELECT Owner_id FROM PET 
                     WHERE PType = 'DOG'
                       AND Pet_Id IN (SELECT Pet_id 
                                        FROM BOOKING)
                     GROUP BY Pet_id
                     HAVING COUNT(*) > 1)
0 голосов
/ 06 ноября 2019

Вы можете получить владельцев собак, которые забронировали, по крайней мере, два раза, с join и group by:

select p.owner_id
from booking b join
     pet p
     on p.pet_id = b.pet_id
where p.type = 'Dog'
group by p.owner_id
having count(*) >= 2;

. Вы можете получить детали разными способами. Простой подход использует in:

select o.*
from owner o
where o.owner_id in (select p.owner_id
                     from booking b join
                          pet p
                          on p.pet_id = b.pet_id
                     where p.type = 'Dog'
                     group by p.owner_id
                     having count(*) >= 2
                    );
0 голосов
/ 06 ноября 2019

Я думаю, вам нужно group by в подзапросе следующим образом:

SELECT * FROM 
PET_OWNER 
WHERE Owner_id IN 
  ( SELECT Owner_id FROM PET
     WHERE Pet_id IN ( SELECT Pet_id FROM BOOKING 
     GROUP BY PET_ID HAVING COUNT(1) >1 ) AND PType = 'DOG';

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...