私は 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 つだけ残っている場合:
両方の左結合の場合:
ご覧のとおり、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 フィールドが、実際には行ごとに異なるはずの最初の結果を複製していることです。
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