2

私は SQL クエリを作成するのが初めてで、3 つの異なるテーブルから情報を取得してリンクしようとしています。

データは Microsoft SQL Server に存在します。

これは私の現在のクエリです(意図したとおりに機能していません):

SELECT h.jhhold, h.jhjob, h.jhpart, h.jhrev, h.jhcust, h.jhextd, o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend 
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 japcmp = 0 
ORDER BY h.jhjob

私がやろうとしていることを説明するために。ジョブ ヘッダー テーブルJhead、ジョブ詳細テーブルjjops、および発注書詳細テーブルhpodtがあります。ジョブ番号が jhead テーブルの主キーだと思います。

ここに私の問題があります: 2 番目の左結合を追加するとすぐに、重複した情報の多くの余分な行ができてしまいます。

GROUP BY jhead.jhjob を使用しようとしましたが、次のエラーが発生します。

「列 'jhead.jhhold' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。」</p>

そこで、GROUP BY を次のようにするという解決策の 1 つでエラーを調査しました。

しかし、jhead.jhextd を挿入するとすぐに、次のエラーが表示されます。

そして今、壁にぶち当たっています。タイプを NVARCHAR に変更できることがわかりました。説明フィールドは一意であり、サーバーに非常に負担をかける可能性があるため、説明フィールドでソートしたくありません。これを行うより良い方法はありますか?

サンプル データで編集: クエリを簡素化するために余分なフィールドを削除し、1 つの求人番号の結果をフィルター処理しました。

結合が 1 つだけ残っている場合: 左結合が 1 つだけの場合

両方の左結合の場合: 2番

ご覧のとおり、ERP ソフトウェアには 1 つの PO 番号の下に複数のジョブがあり、一致するジョブ番号を持つ行を表示することにのみ関心があります。 三番

クエリが更新されました

SELECT h.jhhold, h.jhjob, h.jhrev, o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend, p.hdprcd, p.hdrecd
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 japcmp = 0 AND p.hdjob = h.jhjob AND p.hdpo = o.japo
ORDER BY h.jhjob

これは私が望むものに近づいています。問題は、私の jadesc フィールドが、実際には行ごとに異なるはずの最初の結果を複製していることです。

4

1 つのジョブのみを表示するようにフィルター処理しました。列は 1 つだけにする必要があります。

余分な行を取得しますが、必要なすべてのデータを持っています

SELECT h.jhhold, h.jhjob, h.jhrev, o.jadesc, h.jhpqty, 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 japcmp = 0 AND p.hdjob = h.jhjob 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 japcmp = 0 AND o.japo = 0 AND o.jaopr != 'PT')
ORDER BY h.jhjob, o.jaseq
4

1 に答える 1

0

とテーブルに関する詳細情報を表示したいと思いますが、テーブルにある集計情報を表示したいだけです。jheadjjopshpodt

その場合は、次のようにする必要があります。

SELECT
    h.jhhold, h.jhjob, h.jhpart, h.jhrev, h.jhcust, h.jhextd,
    o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend,
    (SELECT COUNT(*) FROM hpodt p WHERE p.jhjob = h.hdjob) AS po_line_count,
    CASE WHEN EXISTS (SELECT * FROM hpodt p WHERE p.jhjob = h.hdjob)
        THEN 'found it'
        ELSE 'not found'
    END AS info_on_hpodt
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 japcmp = 0 
ORDER BY
    h.jhjob

テーブルからどの特定の情報が必要かはわかりませんが、hpodtサブクエリを使用するこの戦略は、WHERE句に他の基準を追加するだけで機能すると思います。

別のオプションはウィンドウ関数を使用することですが、サブクエリのアプローチはより単純です。

于 2012-10-31T21:55:27.920 に答える