下面的查询为SP_ScheduleEvent表中的每个条目生成一条记录。
SELECT m.MaterialId, m.MaterialTitle, se.EventDateTime, c.ChannelName
FROM GB_Material m
LEFT OUTER JOIN SP_ScheduleEvent se on se.MaterialName = m.MaterialName
INNER JOIN SP_Schedule s on s.ScheduleID = se.ScheduleID
INNER JOIN GB_Channel c on c.ChannelID = s.ChannelID
WHERE LOWER(m.MaterialName) like '%foo%' OR LOWER(m.MaterialTitle) like '%foo%'
我想将结果集限制在最近的未来EventDateTime。
因此,根据材料名称,我希望看到一个EventDateTime,它应该是当前时间最近的未来日期。
最后,SP_ScheduleEvent表中可能不存在特定材质名称的记录,在这种情况下,EventDateTime列应返回null
我将如何做到这一点?
答案 0 :(得分:0)
首先,您的 app.use(bodyParser.urlencoded({ extended: true})); // parse application/x-www-form-urlencoded
app.use(bodyParser.json());
并不重要,因为后续联接使其成为LEFT JOIN
。在INNER JOIN
语句中使用LEFT JOIN
或切换到FROM
。
我认为你可以使用INNER JOIN
:
ROW_NUMBER()
答案 1 :(得分:0)
使用ROW_NUMBER()函数:
WITH cte AS (
SELECT m.MaterialId, m.MaterialTitle, se.EventDateTime, c.ChannelName,
ROW_NUMBER() OVER (PARTITION BY m.MaterialId ORDER BY EventDateTime ASC) AS rn
FROM GB_Material m
LEFT OUTER JOIN SP_ScheduleEvent se on se.MaterialName = m.MaterialName
LEFT OUTER JOIN SP_Schedule s on s.ScheduleID = se.ScheduleID
LEFT OUTER JOIN GB_Channel c on c.ChannelID = s.ChannelID
WHERE LOWER(m.MaterialName) like '%foo%' OR LOWER(m.MaterialTitle) like '%foo%'
AND se.EventDateTime > GETDATE()
)
SELECT * FROM cte
WHERE rn=1