Compte tenu de ces tablesrequête T-SQL pour trouver manquants ID pour une plage de dates
table Channel
--------------
ChannelID int IDENTITY
<other irrelevant stuff>
table Program
--------------
ProgramID int IDENTITY
ChannelID int
AiringDate datetime
<other irrelevant stuff>
et cette requête
SELECT C.ChannelID, t.AiringDate
FROM
Channel C
LEFT JOIN (
SELECT distinct ChannelID
FROM Program
WHERE AiringDate = '2010-01-16'
) p
ON p.ChannelID=C.ChannelID
CROSS JOIN (
SELECT AiringDate = '2010-01-16'
) t
WHERE C.ChannelID IN (1, 2, 74, 15, 906) /* the Channel table contains more channels than we are interested in */
AND p.ChannelID IS NULL
qui donne
ChannelID | AiringDate
----------|-----------
2 | 2010-01-16
906 | 2010-01-16
comment puis-je modifier pour accepter une plage de dates, de sorte que le résultat sera quelque chose comme
ChannelID | AiringDate
----------|-----------
2 | 2010-01-16
906 | 2010-01-16
2 | 2010-01-17
906 | 2010-01-17
s'il n'y avait pas de programmes diffusés sur ces 2 canaux l'un de ces deux jours
Ce ne renvoie aucune ligne
SELECT C.ChannelID, t.AiringDate
FROM
Channel C
LEFT JOIN (
SELECT distinct ChannelID, AiringDate
FROM Program
WHERE AiringDate between '2010-01-16' and '2010-01-17'
) p
ON p.ChannelID=C.ChannelID
CROSS JOIN (
SELECT AiringDate = '2010-01-16'
union
SELECT AiringDate = '2010-01-17'
) t
WHERE C.ChannelID IN (1, 2, 74, 15, 906)
AND p.ChannelID IS NULL
Ce CROSS JOIN
est un peu laid, et il serait bien de se débarrasser de tout cela. Notez que le premier exemple de requête est un peu compliqué; Pour les dates simples que j'ai un simple qui ne sort que channelIds manquants:
SELECT C.ChannelID
FROM
Channel C
LEFT JOIN (
SELECT distinct ChannelID
FROM Program
WHERE AiringDate = '2010-01-16'
) p
ON p.ChannelID=C.ChannelID
WHERE C.ChannelID IN (1, 2, 74, 15, 906)
AND p.ChannelID IS NULL
Hmm, à proximité! Cependant, cela ne fonctionne que s'il n'y avait pas de programme le 16 et il n'y avait pas de programme le 17. Mon exemple a peut-être manqué. Je veux trouver les chaînes qui n'ont diffusé aucun programme dans une certaine plage de dates, et aussi retourner les AiringDates qui auraient pu l'être. Donc une ligne par canal et par AiringDate. –
En fait, en dehors de l'affreux select/union dont vous vous êtes débarrassé (ce qui est sympa!) Votre requête fait exactement la même chose que la seconde listée dans mon post original. Si je supprime mon O WH C.ChannelID IN (1, 2, 74, 15, 906) stipulation (que votre requête omis), j'obtiens les mêmes résultats. Les plans d'exécution sont identiques. –
@ J F - J'ai ajouté quelques exemples de données. Pour ces données, qu'attendez-vous en tant que sortie? J'avais l'impression qu'il devrait retourner ChannelID 3 pour chaque date. –