我想将两个查询与不同的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
答案 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
中包装两个查询的事情......但它绝对会扼杀您的性能,因为数据库需要保存整个内部查询的输出到临时表并重新查询它们。如果您查询的记录数量适中,那就不会很漂亮了。
首先尝试将两个查询合并为一个查询,你会好得多。
当您查看这样的查询时,执行此操作会变得复杂,但可以完成,并且性能应该会更好。
我现在没有时间为你提出完美的查询,但是在这里和其他地方还有一些关于如何做这类事情的其他问题。也许其中一个会对你有帮助吗?