Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Majkel
Člen
Avatar
Majkel:27.3.2018 13:14

Ahoj, mám dvě tabulky UserRoom a Meetings. Snažím se napsat následující join:

select distinct ur.* from UserRoom ur
join Meetings me on ur.RoomId = me.RoomId
where
ur.UserId = 1968
and ur.RoomId = 1
and [ur].[To] >= GETDATE()
and [ur].[From] <> [me].[From]
and [ur].[To] <> [me].[To]

Výsledkem by měl být pouze záznam "16, 2018-03-31 06:00:00.0000000, 1, 2018-03-31 06:30:00.0000000, 1968".

Dostávám ale záznamy tři viz obrázek. Kde dělám prosím chybu. Díky.

Editováno 27.3.2018 13:15
 
Odpovědět
27.3.2018 13:14
Avatar
Odpovídá na Majkel
Michal Štěpánek:27.3.2018 14:36

Proč by tam ty dva záznamy být neměly?

Nahoru Odpovědět
27.3.2018 14:36
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Majkel
Člen
Avatar
Majkel:27.3.2018 15:14

Protože tady ty dvě podmínky by mi měly vyřadit záznamy, kde je v obou tabulkách shodné From a To

and [ur].[From] <> [me].[From]
and [ur].[To] <> [me].[To]
 
Nahoru Odpovědět
27.3.2018 15:14
Avatar
Odpovídá na Majkel
Michal Štěpánek:27.3.2018 16:43

Podle mě ten tvůj dotaz tyto podmínky asi nevyhodnotí, protože neví jak. Obecně se takovouto podmínkou dá porovnat "něco" s jedním konkrétním záznamem. Pokud bys chtěl porovnávat s více daty musíš je nějak "projít".
např.

SELECT * FROM ur WHERE [From] NOT IN(SELECT [From] FROM me)

Jen tak mimochodem, dávat názvy sloupců stejné, jako jsou "klíčová slova" dotazů mi přijde dosti nevhodné, možná bych i řekl dosti špatné. Jak má pak chudák "dotaz" rozlišovat, co je název a co klíčové slovo? A to nemluvím ani o přehlednosti kódu při používání takových názvů...

Editováno 27.3.2018 16:45
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
27.3.2018 16:43
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Ondřej Crha
Člen
Avatar
Odpovídá na Majkel
Ondřej Crha:27.3.2018 16:51
declare @UserRoom table (
        [Id] int null,
        [From] datetime null,
        [RoomId] int null,
        [To] datetime null,
        [UserId] int null )
insert into @UserRoom
([Id], [From], [RoomId], [To], [UserId]) values
(1, '2018-02-19 12:00:00', 1, '2018-02-19 13:00:00', 1968),
(2, '2018-02-26 12:00:00', 1, '2018-02-26 13:00:00', 1968),
(3, '2018-02-16 07:00:00', 1, '2018-02-16 07:30:00', 1968),
(5, '2018-02-15 14:00:00', 1, '2018-02-15 15:30:00', 3),
(10, '2018-03-14 12:00:00', 1, '2018-03-14 13:00:00', 1968),
(11, '2018-03-31 12:00:00', 1, '2018-03-31 13:00:00', 1968),
(12, '2018-03-31 14:00:00', 1, '2018-03-31 15:00:00', 1968),
(13, '2018-03-31 07:00:00', 2, '2018-03-31 08:00:00', 1968),
(14, '2018-03-31 10:00:00', 3, '2018-03-31 10:20:00', 1968),
(15, '2018-03-31 17:00:00', 3, '2018-03-31 18:00:00', 1968),
(16, '2018-03-31 06:00:00', 1, '2018-03-31 06:30:00', 1968)

declare @Meetings table (
[Id] int null,
[From] datetime null,
[To] datetime null,
[RoomId] datetime null )
insert into @Meetings
([Id], [From], [To], [RoomId]) values
(1, '2018-03-31 12:00:00', '2018-03-31 13:00:00', 1),
(2, '2018-03-31 13:00:00', '2018-03-31 15:00:00', 1)

select distinct
         ur.[Id] as urId, ur.[From] as UrFrom, me.[From] as meFrom, ur.[RoomId] as urRoomId, ur.[To] as urTo, me.[To] as meTo, ur.[UserId] as urUserId, me.[Id] as meId
from @UserRoom ur
join @Meetings me on ur.RoomId = me.RoomId
where
ur.UserId = 1968
and ur.RoomId = 1
and ur.[To] >= GETDATE()
and ur.[From] <> me.[From]
and ur.[To] <> me.[To]

Výsledek viz obrázek. V daný čas se sice koná jeden meeting, ale druhý ne, proto je ve výsledcích join na něj. Takhle je to myslím správně:

select distinct
        ur.*
from @UserRoom ur
where ur.UserId = 1968
and ur.RoomId = 1
and ur.[To] >= GETDATE()
and not exists (
        select NULL from @Meetings me
        where me.RoomId = ur.RoomId
        and (me.[From] >= ur.[From]     and me.[To] <= ur.[To]) -- spada do terminu
        and (me.[From] <= ur.[From] and me.[To] <= ur.[To]) -- zacina driv nez termin
        and (me.[From] >= ur.[From] and me.[To] >= ur.[To]) -- konci pozdeji nez termin
        and (me.[From] <= ur.[From] and me.[To] >= ur.[To]) -- presahuje termin
)
 
Nahoru Odpovědět
27.3.2018 16:51
Avatar
Ondřej Crha
Člen
Avatar
Ondřej Crha:27.3.2018 16:59

Oprava:

select distinct
        ur.*
from @UserRoom ur
where ur.UserId = 1968
and ur.RoomId = 1
and ur.[To] >= GETDATE()
and not exists (
        select NULL from @Meetings me
        where me.RoomId = ur.RoomId and (
        (me.[From] >= ur.[From] and me.[To] <= ur.[To]) -- spada do terminu
        or (me.[From] < ur.[From] and me.[To] <= ur.[To]) -- zacina driv nez termin
        or ((me.[From] >= ur.[From] and me.[From] < ur.[To]) and me.[To] > ur.[To]) -- konci pozdeji nez termin
        or (me.[From] < ur.[From] and me.[To] > ur.[To]) -- presahuje termin
        )
)
 
Nahoru Odpovědět
27.3.2018 16:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.