1

これには簡単な修正があると確信しています。私は基本的にSQLステートメントを書いた経験がないので、必要なものを取得するためのすべてのコマンド、トリック、または構文を知りません。

組み合わせる必要のある次の2つのSQLSELECTステートメントがあり ます。

1:

SELECT 
    h.jhhold, h.jhjob, h.jhrev, o.jadesc, o.jaoqty, o.jacqty, o.japo, o.javend  
FROM 
    Jhead AS h  
LEFT JOIN 
    jjops AS o ON h.jhjob = o.jajob  
WHERE 
    h.jhpcmp = 0 
    AND o.jatype = 2 
    AND o.jacqty < o.jaoqty 
    AND o.japcmp = 0 
    AND o.japo = 0  

2:

SELECT 
    h.jhhold, h.jhjob, h.jhrev, o.jadesc, o.jaoqty, o.jacqty, o.japo, o.javend, 
    p.hdprcd, p.hdrecd, p.hdseq  
FROM 
    Jhead AS h 
LEFT JOIN 
    jjops AS o ON h.jhjob = o.jajob   
LEFT JOIN 
    hpodt AS p ON h.jhjob = p.hdjob   
WHERE 
    h.jhpcmp = 0 
    AND o.jatype = 2 
    AND o.jacqty < o.jaoqty 
    AND o.japcmp = 0 
    AND p.hdjob = h.jhjob 
    AND p.hdpo = o.japo 
    AND p.hdseq = o.jaseq

これらの2つのステートメントはどちらも、必要な結果を返します。最初のステートメントは基本的に、o.japo = 0(nullになることはありません)の結果を返します。2つ目は、o.japoがゼロでない結果を返し、別のテーブルをデータに結合しようとします。UNION ALLを間に挟んでみましたが、調べたすべてのユニオンの例には、selectステートメントごとにunqiueWHEREステートメントがありませんでした。


私は最初に次のステートメント(以下)を試みましたが、o.japo = 0のときに複数行のデータを取得していて、なぜ余分な行を取得しているのか理解できませんでしたが、2番目の左の結合が正しくない/不要な結合であったと思われますデータ。o.japo = 0の場合、すべてのhpodt(p。)フィールドはnullであるはずですが、代わりにどこかからのデータが入力されています。

SELECT h.jhhold, h.jhjob, h.jhrev, o.jadesc, o.jaoqty, o.jacqty, o.japo, o.javend, p.hdprcd, p.hdrecd, p.hdseq 
FROM Jhead AS h 
LEFT JOIN jjops AS o ON h.jhjob = o.jajob 
LEFT JOIN hpodt AS p ON h.jhjob = p.hdjob 
WHERE (h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND o.japcmp = 0 AND p.hdjob = h.jhjob AND o.japo != 0 AND p.hdpo = o.japo AND p.hdseq = o.jaseq AND o.jaopr != 'PT') OR (h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND o.japcmp = 0 AND o.japo = 0 AND o.jaopr != 'PT')
ORDER BY h.jhjob, o.jaseq, p.hdrecd
4

3 に答える 3

3

UNION2つのステートメントの間に置きます。

UNIONは同じ数の列を持つ必要があるため、少し余分な作業を行う必要があります。

存在しない列をカバーするために、最初のselectステートメントにいくつかのnullを追加します。

SELECT 
   -- Common to both tables
   h.jhhold, h.jhjob, h.jhrev, 
   o.jadesc, o.jaoqty, o.jacqty, 
   o.japo, o.javend, 
   -- These columns don't exist here.
   -- include them anyway as NULL
   NULL as hdprcd,
   NULL AS hdrecd, 
   NULL AS hdseq  
FROM Jhead AS h  
LEFT JOIN 
  jjops AS o ON h.jhjob = o.jajob  
WHERE 
    h.jhpcmp = 0 
AND o.jatype = 2 
AND o.jacqty < o.jaoqty 
AND o.japcmp = 0 
AND o.japo = 0
-- The big boy, combining the results of two queries
---
UNION
SELECT 
   h.jhhold, h.jhjob, h.jhrev, 
   o.jadesc, o.jaoqty, o.jacqty, 
   o.japo, o.javend, p.hdprcd, 
   p.hdrecd, p.hdseq  
FROM Jhead AS h 
LEFT JOIN 
   jjops AS o 
ON h.jhjob = o.jajob   
LEFT JOIN 
   hpodt AS p 
ON h.jhjob = p.hdjob   
WHERE 
    h.jhpcmp = 0 
AND o.jatype = 2 
AND o.jacqty < o.jaoqty 
AND o.japcmp = 0 
AND p.hdjob = h.jhjob 
AND p.hdpo = o.japo 
AND p.hdseq = o.jaseq
于 2012-11-08T18:27:39.117 に答える
1

別のエイリアスを使用して、に再度参加しjjops、それからhpodt:に再度参加します。

SELECT 
    h.jhhold, h.jhjob, h.jhrev, 
    o.jadesc, o.jaoqty, o.jacqty, o.japo, o.javend,
    o2.jadesc, o2.jaoqty, o2.jacqty, o2.japo, o2.javend, 
    p.hdprcd, p.hdrecd, p.hdseq
FROM Jhead AS h  
LEFT JOIN
    jjops AS o ON h.jhjob = o.jajob  
LEFT JOIN
    jjops AS o2 ON h.jhjob = o2.jajob   
LEFT JOIN
    hpodt AS p ON h.jhjob = p.hdjob
    AND p.hdpo = o2.japo
    AND p.hdseq = o2.jaseq
    AND p.hdjob = h.jhjob
WHERE 
    h.jhpcmp = 0 
    AND o.jatype = 2 
    AND o.jacqty < o.jaoqty 
    AND o.japcmp = 0 
    AND o.japo = 0;

ONまた、いくつかの条件を句に移動したことにも注意してください。必要に応じて、いつでもwhere句に戻すことができます。

...
LEFT JOIN
    hpodt AS p ON h.jhjob = p.hdjob
WHERE 
    h.jhpcmp = 0 
    AND o.jatype = 2 
    AND o.jacqty < o.jaoqty 
    AND o.japcmp = 0 
    AND o.japo = 0
    AND p.hdpo = o2.japo
    AND p.hdseq = o2.jaseq
    AND p.hdjob = h.jhjob;

ただし、異なる結果が生成される可能性があります。この最後のバージョンでは、からの行がないLEFT JOINからの行を返すo2ことはできませんp

于 2012-11-08T18:42:35.510 に答える
0

元のステートメントのWhere句を調整することもできます。

同じテーブルがない場合は、同じテーブルに対して複数の選択を行わない方がよい場合があります。

SELECT h.jhhold, h.jhjob, h.jhrev, o.jadesc, o.jaoqty, o.jacqty, o.japo, o.javend, p.hdprcd, p.hdrecd, p.hdseq 
FROM Jhead AS h 
LEFT JOIN jjops AS o ON h.jhjob = o.jajob   
LEFT JOIN hpodt AS p ON h.jhjob = p.hdjob   
WHERE h.jhpcmp = 0 
    AND o.jatype = 2 
    AND o.jacqty < o.jaoqty
    AND o.japcmp = 0
    AND (o.japo = 0 
        OR (p.hdjob = h.jhjob AND p.hdpo = o.japo AND p.hdseq = o.jaseq 
                  AND o.japo <> 0))
于 2012-11-08T18:53:25.580 に答える