2016-03-01 4 views
0

Я пытаюсь найти Плейлист (ы) с 10 или более дорожками, которые имеют значения NULL в столбце «Композитор».Значения NULL SQL COUNT

Вот таблицы

CREATE TABLE [Playlist] 
(
[PlaylistId] INTEGER NOT NULL, 
[Name] NVARCHAR(120), 
CONSTRAINT [PK_Playlist] PRIMARY KEY ([PlaylistId]) 
); 

CREATE TABLE [PlaylistTrack] 
(
[PlaylistId] INTEGER NOT NULL, 
[TrackId] INTEGER NOT NULL, 
CONSTRAINT [PK_PlaylistTrack] PRIMARY KEY ([PlaylistId], [TrackId]), 
FOREIGN KEY ([PlaylistId]) REFERENCES [Playlist] ([PlaylistId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION, 
FOREIGN KEY ([TrackId]) REFERENCES [Track] ([TrackId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
); 

CREATE TABLE [Track] 
(
[TrackId] INTEGER NOT NULL, 
[Name] NVARCHAR(200) NOT NULL, 
[AlbumId] INTEGER, 
[MediaTypeId] INTEGER NOT NULL, 
[GenreId] INTEGER, 
[Composer] NVARCHAR(220), 
[Milliseconds] INTEGER NOT NULL, 
[Bytes] INTEGER, 
[UnitPrice] NUMERIC(10,2) NOT NULL, 
CONSTRAINT [PK_Track] PRIMARY KEY ([TrackId]), 
FOREIGN KEY ([AlbumId]) REFERENCES [Album] ([AlbumId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION, 
FOREIGN KEY ([GenreId]) REFERENCES [Genre] ([GenreId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION, 
FOREIGN KEY ([MediaTypeId]) REFERENCES [MediaType] ([MediaTypeId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
) 

Вот то, что я до сих пор. Я думаю, что логика запроса хороша, но является ли это правильным способом подсчета нулевых значений?

SELECT P.PlaylistId, P.name 
FROM Playlist P 
    JOIN PlaylistTrack pt ON p.PlaylistId = pt.PlaylistId 
    JOIN Track t ON pt.TrackId = t.TrackId 
GROUP BY p.PlaylistId 
HAVING COUNT(t.Composer IS NULL) >=10; 

ответ

0

Вместо NULL, не может просто заявить что-то вроде <> 0? или = 0?

или по крайней мере попробовать:

Где T.Composer IS NULL или цв = ''

или Где T.Composer IsNull (цв, '') = ''

0

Я хотел бы использовать левое соединение вместо внутреннего. Таким образом, он все равно вернет строку, даже если в этом запросе нет строк. Иногда это может нарушить ваше утверждение, поскольку оно не может считать нуль.

1

Попытка сравнить COUNT(T.Compser) >= 10 в предложении SELECT является ошибкой. Это сравнение, которое будет (всегда), возвращать true/false. Этот подзапрос также не имеет отношения к вашему внешнему запросу. Я действительно удивлен, что он даже работает без ошибок.

Вы должны быть в состоянии использовать пункт HAVING, который используется для сравнения агрегатов:

SELECT 
    P.PlaylistID, 
    P.Name 
FROM 
    Playlist P 
INNER JOIN PlaylistTrack PT ON PT.PlaylistID = P.PlaylistID 
INNER JOIN Track T ON 
    T.TrackID = PT.TrackID AND 
    T.Composer IS NULL 
GROUP BY 
    P.PlaylistID, 
    P.Name 
HAVING 
    COUNT(*) >= 10 

EDIT: Вы изменили свой вопрос. С новым запросом проблема заключается в том, что COUNT() всегда будет считать строку независимо от того, что значение внутри, если это значение не равно NULL. T.Composer IS NULL будет оценивать значение - либо true, либо false (1/0), что означает, что независимо от значения T.Composer каждая строка будет подсчитываться по совокупности.

Смежные вопросы