Как не получить повторяющиеся записи в перекрестном соединении без использования distinct?
I hay this table Day DayId Name --- ---- 1 sun 2 mon 3 tue 4 wed And this table Place PlaceId Loc DayId 1 1 1 1 1 2 1 2 1 2 1 3 3 1 2 3 1 4 i want to to return the days that are not used for each (PlaceId and LocId) so the result should be as follows PlaceId Loc DayId 1 1 3 1 1 4 1 2 2 1 2 3 1 2 4 2 1 1 2 1 2 2 1 4 3 1 1 3 1 3
Что я уже пробовал:
Я не хочу использовать distinct, но я не знаю, как это сделать, не получая дублированных записей
select distinct Place.PlaceId, Place.Loc, Day.DayId from Place cross join Day left join Place AS X on Place.PlaceId = X.PlaceId and Place.Loc = X.Loc and Day.DayId = X.DayId where x.DayId is null
carloscs
С этой схемой вы не можете сделать это без использования distinct или group by. [Если бы у вас была третья таблица PlaceLoc с уникальными ключевыми столбцами (PlaceId, Loc), содержащая все place_loc, вы могли бы это сделать].
Однако немного ясный и более эффективный запрос это один:
выберите P.PlaceId, стр. Лок, д. DayId
из места Р, День Д
где не существует (выберите 1 из места p2, где p2.PlaceId = p.PlaceId и p2.Loc = p.Loc и p2.DayId = d.DayId)
группа П. PlaceId, стр. Лок, д. DayId
- он ясно говорит, что вам нужно сделать, - другой запрос немного запутан.
- не существует коррелированного подзапроса, который должен быть немного более оптимизирован, чем левое соединение [хотя это может варьироваться с различными базами данных в зависимости от оптимизатора]
- обратите внимание, что group by имеет тот же эффект, что и использование distinct в select part [я старая школа и предпочитаю group by :)]
Edit: запрос не тестировался, просто быстрый пример
Member 14800672
Теперь я попробую ur query(что означает select 1, 1 относится к чему?) У меня есть таблица под названием PlaceLoc, как я могу использовать ее в своем запросе, чтобы получить правильный результат без distinct?