UNION(2)从(1)表中选择WHERE,GROUP BY和ORDER BY

时间:2013-03-25 22:04:35

标签: mysql union

我想将两个查询与不同的WHERE子句和重叠结果组合在一起。我如何使用UNION将结果与case_id结合起来?

第一次查询

SELECT
O.case_id,
O.otc_eff_date,
DATE_FORMAT(STR_TO_DATE(O.otc_eff_date, '%Y%j'),'%m/%d/%Y') otc_ef_date,
O.otc_type,
O.case_rsf,
O.otc_rsn,
O.otc_rlse_to,
O.seg_ent_date,
O.Seg_chg_date,
O.otc_case_status,
O.otc_opn_seq_cnt,
O.filler
FROM NU.RawCaseOTC O
WHERE O.otc_eff_date BETWEEN 2011182 AND 2012182
GROUP BY O.case_id
ORDER BY otc_ef_date

第二次查询

SELECT 
MAX(otc_eff_date) MAX_OTC_EFF_DATE, 
case_id,
otc_eff_date,
otc_type,
case_rsf,
otc_rsn,
otc_rlse_to,
seg_ent_date,
Seg_chg_date,
otc_case_status,
otc_opn_seq_cnt,
filler 
FROM NU.RawCaseOTC 
WHERE (otc_case_status != 'C') AND (otc_eff_date <='2011182')
GROUP BY case_id
ORDER BY otc_eff_date

3 个答案:

答案 0 :(得分:1)

如果UNION这个2选择然后再选择它,你可以使case_id不同,如果你把每个列放在MAX或MIN或SUM或COUNT或AVG ......

如果您希望第一行是不同的,则第二行必须是聚合函数。

答案 1 :(得分:0)

首先,您需要调整查询以使列匹配。例如,现在您的第一个查询在第一列中有case_id,但您的第二个查询在第二列中包含SELECT * FROM ( SELECT ... UNION ALL -- unite results, preserving all duplicates SELECT ... ) GROUP BY case_id -- find duplicates, and randomly discard all but one ; ;你需要修复它们才能将它放在同一列中。

一旦你完成了,你可以写(正如Sami Korhonen在上面的评论中提到的那样):

GROUP BY

请注意,这是MySQL特有的;在标准SQL中,在大多数DBMS中,您不能{{1}}一个字段丢弃欺骗而忽略其他字段。

答案 2 :(得分:0)

小心!是的,您可以执行诸如在外部查询中使用SELECT的嵌套GROUP BY中包装两个查询的事情......但它绝对会扼杀您的性能,因为数据库需要保存整个内部查询的输出到临时表并重新查询它们。如果您查询的记录数量适中,那就不会很漂亮了。

首先尝试将两个查询合并为一个查询,你会好得多。

当您查看这样的查询时,执行此操作会变得复杂,但可以完成,并且性能应该会更好。

我现在没有时间为你提出完美的查询,但是在这里和其他地方还有一些关于如何做这类事情的其他问题。也许其中一个会对你有帮助吗?