Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 只有当两个查询都返回结果时,Union才会返回结果_Sql - Fatal编程技术网

Sql 只有当两个查询都返回结果时,Union才会返回结果

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

我希望查询以这样一种方式工作:如果任何一个查询返回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 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”是什么意思?你的意思是没有行吗?是的,空我的意思是没有行。我不希望整个查询返回的数据是任何一个查询返回的空记录。非常感谢您的努力:)非常感谢您的努力:)非常感谢您的努力:)如果您想说“谢谢,这很有用”非常感谢您的努力:)您可以(也应该)单击任意数量答案上的向上投票箭头如果您想说“谢谢,这很有用”,请单击任意数量答案上的向上投票箭头