SQL选择不返回我想要的结果

时间:2019-01-12 22:06:16

标签: sql-server tsql datatable

我是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

1 个答案:

答案 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