Sql 只有当两个查询都返回结果时,Union才会返回结果
我希望查询以这样一种方式工作:如果任何一个查询返回null,union将不会返回任何记录。例如,如果问题_id 338返回null,那么整个查询必须返回空数据。有什么建议吗?我认为你不需要工会:Sql 只有当两个查询都返回结果时,Union才会返回结果,sql,Sql,我希望查询以这样一种方式工作:如果任何一个查询返回null,union将不会返回任何记录。例如,如果问题_id 338返回null,那么整个查询必须返回空数据。有什么建议吗?我认为你不需要工会: (select `pk_irfa` from `incident_reports_form_answers` where inc_question_id = 338 AND answer_text in ("N/A", "Graeme Clar
(select `pk_irfa`
from `incident_reports_form_answers`
where inc_question_id = 338
AND answer_text in ("N/A", "Graeme Clark"))
union
(select `pk_irfa`
from `incident_reports_form_answers`
where inc_question_id = 339
AND answer_text in ("Manager", "Pass"))
然后,如果您需要同时使用这两种方法,请使用聚合:
select pk_irfa
from incident_reports_form_answers
where (inc_question_id = 338 AND answer_text in ('N/A', 'Graeme Clark'))) or
(inc_question_id = 339 AND answer_text in ('Manager', 'Pass'))
我认为你不需要工会:
(select `pk_irfa`
from `incident_reports_form_answers`
where inc_question_id = 338
AND answer_text in ("N/A", "Graeme Clark"))
union
(select `pk_irfa`
from `incident_reports_form_answers`
where inc_question_id = 339
AND answer_text in ("Manager", "Pass"))
然后,如果您需要同时使用这两种方法,请使用聚合:
select pk_irfa
from incident_reports_form_answers
where (inc_question_id = 338 AND answer_text in ('N/A', 'Graeme Clark'))) or
(inc_question_id = 339 AND answer_text in ('Manager', 'Pass'))
您可以借助一些CTE来实现这一点:
select pk_irfa
from incident_reports_form_answers
where (inc_question_id = 338 AND answer_text in ('N/A', 'Graeme Clark'))) or
(inc_question_id = 339 AND answer_text in ('Manager', 'Pass'))
group by pk_irfa
having count(distinct inc_question_id) = 2;
请注意,只有当a)其CTE具有结果集,且b)联合的另一半也具有结果集时,联合的每一半才返回结果
Gordon提供了一种不用联合来表达逻辑的方法,但上述方法与您使用的原始逻辑非常接近。您可以借助一些CTE来实现这一点:
select pk_irfa
from incident_reports_form_answers
where (inc_question_id = 338 AND answer_text in ('N/A', 'Graeme Clark'))) or
(inc_question_id = 339 AND answer_text in ('Manager', 'Pass'))
group by pk_irfa
having count(distinct inc_question_id) = 2;
WITH cte1 AS (
SELECT pk_irfa
FROM incident_reports_form_answers
WHERE inc_question_id = 338 AND answer_text IN ('N/A', 'Graeme Clark')
),
cte2 AS (
SELECT pk_irfa
FROM incident_reports_form_answers
WHERE inc_question_id = 339 AND answer_text IN ('Manager', 'Pass')
)
SELECT pk_irfa FROM cte1 WHERE (SELECT COUNT(*) FROM cte2 > 0)
UNION ALL
SELECT pk_irfa FROM cte2 WHERE (SELECT COUNT(*) FROM cte1 > 0);
请注意,只有当a)其CTE具有结果集,且b)联合的另一半也具有结果集时,联合的每一半才返回结果
Gordon提供了一种不使用并集来表达逻辑的方法,但是上面的内容与您使用的原始逻辑非常接近
WITH cte1 AS (
SELECT pk_irfa
FROM incident_reports_form_answers
WHERE inc_question_id = 338 AND answer_text IN ('N/A', 'Graeme Clark')
),
cte2 AS (
SELECT pk_irfa
FROM incident_reports_form_answers
WHERE inc_question_id = 339 AND answer_text IN ('Manager', 'Pass')
)
SELECT pk_irfa FROM cte1 WHERE (SELECT COUNT(*) FROM cte2 > 0)
UNION ALL
SELECT pk_irfa FROM cte2 WHERE (SELECT COUNT(*) FROM cte1 > 0);
如果联接失败,将不会有行。。在我看来,唯一的问题是你的条件是否在所有情况下都唯一地标识了一行,或者你是否会在某个时刻遭受笛卡尔爆炸
如果联接失败,将不会有行。。在我看来,唯一的问题是您的条件是否在所有情况下都唯一地标识一行,或者您是否会在某个点上遭受笛卡尔爆炸您所说的“返回null”是什么意思?你的意思是没有行吗?是的,空我的意思是没有行。我不希望整个查询返回的数据是任何一个查询返回的空记录。你说的“返回null”是什么意思?你的意思是没有行吗?是的,空我的意思是没有行。我不希望整个查询返回的数据是任何一个查询返回的空记录。非常感谢您的努力:)非常感谢您的努力:)非常感谢您的努力:)如果您想说“谢谢,这很有用”非常感谢您的努力:)您可以(也应该)单击任意数量答案上的向上投票箭头如果您想说“谢谢,这很有用”,请单击任意数量答案上的向上投票箭头