Нежелательный продукт - PullRequest
0 голосов
/ 13 июня 2018

Я должен написать SQL-запрос для нашей системы управления посетителями.

Если быть точным, у меня был такой, но благодаря ошибке построения базы данных или что-то от третьей стороны.Были пропущенные записи из-за пропущенных значений в таблице.Управляющая база данных назначает числовой идентификатор посетителя.Этот идентификатор является единственным реализованным ключом.

Чтобы получить пропавших людей, мне нужно написать запрос к трем таблицам, которые объединены по одному и тому же идентификатору, Visitior ID.

Мой SQL-запроснапример:

SELECT
    ROW_NUMBER() OVER(ORDER BY VisitorBooking.Arrival ASC) AS Nr,
    Personalstamm.idPersonalstamm,
    CASE VisitRating.rating 
       WHEN 3 THEN 'Sehr Gut' 
       WHEN 2 THEN 'Gut' 
       WHEN 1 THEN 'Nicht so Gut' 
       ELSE 'Sonstiges' 
    END AS Bewertung, 
    VisitRating.Comment,
    VisitorBooking.Arrival,
    Personalstamm.Name,
    Personalstamm.FirstName,
    Personalstamm.Company,
    Personalstamm.Stadt
FROM
    Personalstamm 
INNER JOIN
    VisitRating ON Personalstamm.idPersonalstamm =  VisitRating.idPersonalstamm 
INNER JOIN
    VisitorBooking ON Personalstamm.idPersonalstamm =  VisitorBooking.idVisitor
WHERE
    Personalstamm.idPersonalstamm IS NOT NULL
ORDER BY
    VisitorBooking.Arrival

В Personalstamm указаны личные даты, такие как имя и так далее.

В VisitRating есть рейтинг пребывания и комментарий.

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

Моя проблема в том, что он делает то, что должен, но строит нежелательный продукт из каршиана из Visitorbooking и Visitor Rating.Что я могу сделать, чтобы не получить это?

Distinct не работал, Group By также не работал.

Пример данных:

Personalstamm :

Name: x
Firstname: MR.
Primary Key ID: 1
Company: X-Files
Town: Gravity Falls

VisitorBooking :

Arrival: 06.13.2018 00:00:00
Departure: 01:30:57
ID Visitor: 1

VisitRating :

Rating: 3
Comment: I'm anonymous
Date: 06.13.2018
Foreign Key ID: 1

Это должно понравиться

1 MR. X Gravity Falls 06.13.2018 Sehr Gut I'm anonymous.

Но естьбыло несколько случаев, когда все из Visitrating было пустым, поэтому мне пришлось переписать, чтобы получить:

1 MR. X Gravity Falls 06.13.2018 00:00:00 NULL NULL.

Я заменил дату на прибытие.

Но что я получаю, когда он посещает более одного разаэто:

1 MR. X Gravity Falls 06.13.2018 00:00:00 Sehr Gut NULL.
1 MR. X Gravity Falls 06.13.2018 00:00:00 GUT NULL.
1 MR. X Gravity Falls 06.13.2018 00:00:00 Nicht so GUT NULL.

1 MR. X Gravity Falls 07.13.2018 00:00:00 Sehr Gut NULL.
1 MR. X Gravity Falls 07.13.2018 00:00:00 GUT NULL.
1 MR. X Gravity Falls 07.13.2018 00:00:00 Nicht so GUT NULL.

1 Ответ

0 голосов
/ 13 июня 2018

Если я правильно понимаю, то вы хотите что-то вроде этого:

select . . . 
From Personalstamm p left join
     (select vr.*,
             row_number() over (partition by idPersonalstamm order by idPersonalstamm) as seqnum VisitRating vr
     ) vr
     on p.idPersonalstamm =  vr.idPersonalstamm left join
     (select vb.*,
             row_number() over (partition by idPersonalstamm order by idPersonalstamm) as seqnum       from VisitorBooking vb
     ) vb
     on p.idPersonalstamm = vb.idVisitor and
        vp.seqnum = vr.seqnum
where ps.idPersonalstamm is not null 
order by vb.Arrival;

Два важных примечания:

  • Это предполагает, что количество посещений, по крайней мере, так же велико, какколичество бронирований.
  • Я ввел псевдонимы таблиц, поэтому вы должны исправить предложение SELECT, чтобы использовать их вместо полного имени таблицы.
...