Выбор SQL не возвращает результаты, как я хочу - PullRequest
0 голосов
/ 13 января 2019

Я любитель SQL и мне нужна ваша помощь. После «Выбрать» в 3-м ряду я должен получить

Ivo |Ivić| NULL  

но я получаю все 3 нуля. Помоги мне, где моя ошибка? Я пытался проверить мой код примерно 10 раз, но все еще не вижу проблемы.

CREATE TABLE Prijatelj 
(
    ID_prijatelja INT NOT NULL PRIMARY KEY IDENTITY,
    ImePrijatelja NVARCHAR(30) NOT NULL,
    PrezPrijatelja NVARCHAR(30) NOT NULL
)
GO

CREATE TABLE DVD 
(
    ID_DVD INT NOT NULL PRIMARY KEY IDENTITY,
    ImeDVD NVARCHAR(50) NOT NULL
)
GO

CREATE TABLE Posudio 
(
    ID_prijatelja INT NOT NULL 
         FOREIGN KEY REFERENCES prijatelj(ID_prijatelja),
    ID_DVD INT NOT NULL
         FOREIGN KEY REFERENCES dvd(ID_DVD),
    datumPosudbe DATETIME NOT NULL,
    datumPovratka DATETIME,
    CONSTRAINT PK_posudba 
         PRIMARY KEY (ID_Prijatelja, ID_DVD, datumPosudbe)
)
GO

ALTER TABLE Posudio 
    ADD CONSTRAINT CK_Posudba_prije_Povratka CHECK (datumPosudbe < datumPovratka)

INSERT INTO Prijatelj (ImePrijatelja, PrezPrijatelja)
VALUES ('Ana', 'Anić'), 
       ('Ivo', 'Ivić'),
       ('Marko', 'Marić')
GO

INSERT INTO DVD (ImeDVD)
VALUES ('Avengers: Infinity War'),
       ('Interstellar'),
       ('Inception')
GO

INSERT INTO Posudio(ID_prijatelja, ID_DVD, datumPosudbe, datumPovratka)
VALUES (1, 1, '2019-01-5','2019-01-14'),
       (2, 2, '2018-12-16','2019-01-8'),
       (2, 3, dateadd(day, -30, getdate()), NULL)
GO

SELECT
    d.ImeDVD AS 'Naziv DVD-a',
    pr.ImePrijatelja AS 'Ime',
    pr.PrezPrijatelja AS 'Prezime',
    DATEDIFF(DAY, datumPosudbe, datumPovratka) AS 'Dana posuđen'
FROM 
    DVD AS d
LEFT OUTER JOIN
    (SELECT *
     FROM Posudio 
     WHERE datumPovratka IS NOT NULL) AS po ON d.ID_DVD = po.ID_DVD
LEFT OUTER JOIN
    prijatelj AS pr ON po.ID_prijatelja = pr.ID_prijatelja


SELECT 
    pr.ImePrijatelja AS 'Ime', pr.PrezPrijatelja AS 'Prezime'
FROM 
    prijatelj pr
LEFT OUTER JOIN
    Posudio po ON pr.ID_prijatelja = po.ID_prijatelja
WHERE 
    po.ID_prijatelja IS NULL
GO

1 Ответ

0 голосов
/ 13 января 2019

Внешние соединения - это сложно, для любителя вы довольно хороши: -)

Вам необходимо присоединиться к posudio без этого условия WHERE:

SELECT
   d.ImeDVD AS 'Naziv DVD-a',
   pr.ImePrijatelja AS 'Ime',
   pr.PrezPrijatelja AS 'Prezime',
   datediff(DAY, datumPosudbe, datumPovratka) AS 'Dana posuđen'
FROM DVD AS d
LEFT JOIN Posudio  AS po 
  ON d.ID_DVD = po.ID_DVD
LEFT JOIN prijatelj AS pr
  ON po.ID_prijatelja = pr.ID_prijatelja
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...