我有一张桌子,其中贴纸包含水温,一份热水记录和一份冷水记录。
我要做的是构建一个查询,该查询将根据唯一ID返回两个记录,并且只生成包含热水和冷水数据的一行。
我已经读过这可以使用INNER JOIN完成,但正如您在下面看到的那样,我的查询返回两行,一行用于热水,另一行用于冷水。
是否可以生产一个包含热水和冷水的行?
这是我目前的查询:
SELECT h.UniqueID, h.Room, h.AuditDate, h.AuditBy, h.SeqID, h.WaterHot, h.WaterCold
FROM NXLHR_Hist h
INNER JOIN NXLHR_Hist b
ON h.UniqueID = b.UniqueID
WHERE h.WaterHot < '50' OR h.WaterHot > '66.0' OR h.WaterCold > '20.0'
AND DATE(h.CompStamp) BETWEEN DATE('2015-09-08') AND DATE('2016-09-10')
ORDER BY h.Room ASC
即使我使用GROUP BY UniqueID,我仍然会得到两行。
任何帮助都会很棒,我会提前感谢您的时间。
问候。
答案 0 :(得分:1)
SELECT h.UniqueID, h.Room, h.AuditDate, h.AuditBy, h.SeqID, h.WaterHot, h.WaterCold
FROM NXLHR_Hist h
INNER JOIN NXLHR_Hist b
ON h.UniqueID = b.UniqueID
WHERE h.WaterHot < '50' AND h.WaterHot > '66.0' AND h.WaterCold > '20.0'
AND DATE(h.CompStamp) BETWEEN DATE('2015-09-08') AND DATE('2016-09-10')
ORDER BY h.Room ASC
使用此查询,希望它适合您
答案 1 :(得分:1)
据推测,这个WHERE
条款可以更好地满足您的意图:
WHERE (h.WaterHot < 50 OR
h.WaterHot > 66.0 OR
h.WaterCold > 20.0
) AND
DATE(h.CompStamp) BETWEEN DATE('2015-09-08') AND DATE('2016-09-10')
请注意括号。您似乎想要在该时间段内水温超出范围的任何记录。另外,我假设值是数字。不要在数字周围使用单引号;它对人们有误导性,有时会误导SQL优化器。
您的条件被解析为:
WHERE h.WaterHot < 50 OR
h.WaterHot > 66.0 OR
(h.WaterCold > 20.0 AND
DATE(h.CompStamp) BETWEEN DATE('2015-09-08') AND DATE('2016-09-10')
)
实际上,我会把它写成:
WHERE (h.WaterHot < 50 OR
h.WaterHot > 66.0 OR
h.WaterCold > 20.0
) AND
h.CompStamp >= DATE('2015-09-08') AND
h.CompStamp < DATE('2016-09-11')
此版本允许引擎在CompStamp
上使用索引。
您想要的查询可能看起来像这样:
SELECT h.Room, MAX(h.WaterHot), MIN(h.WaterHot), MAX(h.WaterCold)
FROM NXLHR_Hist h
WHERE (h.WaterHot < 50 OR
h.WaterHot > 66.0 OR
h.WaterCold > 20.0
) AND
h.CompStamp >= DATE('2015-09-08') AND
h.CompStamp < DATE('2016-09-11')
GROUP BY h.Room;