2017-12-16 14 views
0

、IN、NOTに私はこのクエリを持っている:私はORで、 "NOT IN" に以下のクエリを追加する必要がダブル選択

SELECT * FROM (
SELECT DISTINCT on (i.empleado) i.id as id,i.dia as dia,e.id as empleadoId,pe.nombre as personaNombre,pe.apellido1 as personaApellido1,pe.apellido2 personaApellido2 FROM rrhh.imputacion as i 
INNER JOIN rrhh.empleado as e ON e.id = i.empleado 
JOIN commons.persona AS pe ON e.persona_comun = pe.id 
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = i.id 
INNER JOIN rrhh.parte as p ON pi.parte = p.id 
WHERE p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2 and e.id 
NOT IN(
SELECT DISTINCT on (i.empleado) i.empleado FROM rrhh.imputacion as i 
INNER JOIN rrhh.empleado as e ON e.id = i.empleado 
JOIN commons.persona AS pe ON e.persona_comun = pe.id 
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = i.id 
INNER JOIN rrhh.parte as p ON pi.parte = p.id 
WHERE i.dia >= '2017-12-04' AND i.dia <= '2017-12-10' and p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2 
ORDER BY i.empleado, i.dia DESC,i.id 
) 
ORDER BY i.empleado, i.dia DESC,i.id) 
t 
ORDER BY t.dia DESC 

SELECT DISTINCT on (a.empleado) a.empleado FROM rrhh.ausencia as a 
INNER JOIN rrhh.empleado as e ON e.id = a.empleado 
JOIN commons.persona AS pe ON e.persona_comun = pe.id 
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = a.id 
INNER JOIN rrhh.parte as p ON pi.parte = p.id 
WHERE a.dia >= '2017-12-04' AND a.dia <= '2017-12-11' and p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2 
ORDER BY a.empleado, a.dia DESC,a.id 

類似したものがあるはずです

SELECT * FROM (
SELECT DISTINCT on (i.empleado) i.id as id,i.dia as dia,e.id as empleadoId,pe.nombre as personaNombre,pe.apellido1 as personaApellido1,pe.apellido2 personaApellido2 FROM rrhh.imputacion as i 
INNER JOIN rrhh.empleado as e ON e.id = i.empleado 
JOIN commons.persona AS pe ON e.persona_comun = pe.id 
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = i.id 
INNER JOIN rrhh.parte as p ON pi.parte = p.id 
WHERE p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2 and e.id 
NOT IN(
SELECT DISTINCT on (i.empleado) i.empleado FROM rrhh.imputacion as i 
INNER JOIN rrhh.empleado as e ON e.id = i.empleado 
JOIN commons.persona AS pe ON e.persona_comun = pe.id 
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = i.id 
INNER JOIN rrhh.parte as p ON pi.parte = p.id 
WHERE i.dia >= '2017-12-04' AND i.dia <= '2017-12-10' and p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2 
ORDER BY i.empleado, i.dia DESC,i.id 
OR -- UNION 
SELECT DISTINCT on (a.empleado) a.empleado FROM rrhh.ausencia as a 
INNER JOIN rrhh.empleado as e ON e.id = a.empleado 
JOIN commons.persona AS pe ON e.persona_comun = pe.id 
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = a.id 
INNER JOIN rrhh.parte as p ON pi.parte = p.id 
WHERE a.dia >= '2017-12-04' AND a.dia <= '2017-12-11' and p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2 
ORDER BY a.empleado, a.dia DESC,a.id 
) 
ORDER BY i.empleado, i.dia DESC,i.id) 
t 
ORDER BY t.dia DESC 

答えて

0
:私は下に置くが、私は、構文を知らないので、それが動作しません、私はORとUNIONを試してみましたが、両方のケースで、私はエラーを取得するものに210

"ORで"あなたが何を意味するか分かりません。あなたはe.idが第二サブクエリ内NOT IN最初のサブクエリすべきかどうかを判断することを意味している場合は、行うことができます:

... 
AND (
    e.id NOT IN (
     SELECT DISTINCT ... 
    ) OR (
    e.id NOT IN (
     SELECT DISTINCT ... 
    ) 
) 

あなたはそれがどちらか(組合でそれゆえの試み)にしたくない場合は、単に変更をORとAND。

私は、このクエリのクエリプランは非常に貧しいと思うが。 INとNOT INはそこに多くの結果がある場合、非効率的です。

また、コードは非常に奇妙です。あなたのジョインのほとんどは明示的に内部ジョインですが、カップルはちょうどJOINと言います。しかし、JOINはデフォルトでINNER JOINです。だから、なぜいくつかの行は明示的で、他は暗黙的な行ですか?なぜコード全体のスタイルの違いがありますか?例えば、ASas、1行から次へ...

+0

1つまたは両方の副選択以外は誰もが欲しいです。だから私はANDが必要です。 ありがとうございます。 –

関連する問題