2

私は、サイト、ジョブ、メモ、PO の 4 つの異なるテーブルを持っています。サイトは場所であり、1 つのサイトには複数のジョブを含めることができます。ジョブには複数のメモと注文書を含めることができます。単一のクエリでメモと注文書の数を使用してサイト番号に基づいてすべてのジョブを選択するのが好きです。単一のクエリでこれを行うにはどうすればよいですか. このクエリを使用しましたが、これは PO 数のみを示しています。SQL サーバー DB の使用

SELECT jobid, job_title, po_id, count(po.po_id) PO_count, count(notes) note_count
FROM notes
LEFT JOIN job ON jobid = notes_job_id
LEFT JOIN po ON po_job_id = job_id
LEFT JOIN site_detail ON site_id = _job_si_id
LEFT JOIN site_list ON sitelist_id  = site_sitelist_id
WHERE site_id = 116291
GROUP BY  jobid, job_title, po_id

助けてください、事前に感謝します、

4

3 に答える 3

3

このようなもの:

select jobid, job_title, 
    (select count(po.po_id) from po where po.po_job_id=jobid) as PO_count,
    (select count(note.id) from notes where notes.notes_job_id=jobid) as note_count,
from job
where site_id = 116291

さまざまなカウントを取得するために、任意の数の「列としてサブ選択」パターンを使用できる必要があります。これのもう 1 つの良い点は、実際のメイン クエリを再構築する必要がないことです。

列名と結合構造は正確ではありません。ギャップを埋める必要があります。

あなたのDBと命名規則が不明確で、かなり貧弱であることがわかりました。テーブル名/エイリアスを修飾子として使用しないのはなぜですか? これは、外部キー列に異なるテーブルで同じ名前を付けることができることを意味するため、結合は、この醜い接頭辞のハックではなく、非常に明確で明白になります。

私はそれを非常に簡単に設計します:

notes.FK_JOB      -> job.ID
po.FK_JOB         -> job.ID
site_jobs.FK_SITE -> site.ID
site_jobs.FK_JOB  -> job.ID

それは簡単ではありませんか?

また、PO とは何かもわかりませんが、競合が発生しやすく (エイリアス、他の列、一時的な名前と)、有益ではありません。どちらも極度の短さによるものです。

于 2013-09-24T09:46:36.020 に答える
0

1 つの方法はcount(distinct ...)、テーブルの主キーで使用することです。

SELECT  jobid
,       job_title
,       count(distinct po.po_id) po_count
,       count(distinct site.site_id) site_count
,       count(distinct note.note_id) note_count
,       ...
于 2013-09-24T09:44:50.023 に答える