Member 14800672 Ответов: 0

Как не получить повторяющиеся записи в перекрестном соединении без использования 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?

0 Ответов