我是SQL的业余爱好者,需要您的帮助。在第三行的“选择”之后,我应该得到
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
答案 0 :(得分:0)
外部联接非常棘手,对于业余来说,你是相当不错的:-)
您需要在没有WHERE条件的情况下加入posudio
:
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