我有不同的表4其中有网站,工作,笔记和PO。站点是位置,一个站点可以有多个作业,作业可以有多个笔记和PO,现在我想根据站点编号选择所有作业,单个查询中的笔记和PO的数量如何使用单个查询执行此操作。我使用了这个查询,但这只显示了PO计数。使用SQL-Server 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
请帮助,提前致谢,
答案 0 :(得分:4)
这样的事情:
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
您应该能够使用任意数量的“subselect as column”模式来获取不同的计数。另一个好处是它不需要重构您的实际主查询。
列名称&连接结构不准确..你必须填补空白。
我找到了你的DB&命名惯例不明确&相当差。为什么不使用表名/别名作为限定符?这意味着您可以在不同的表中将外键列命名为相同,因此连接将非常清晰&很明显,而不是这个丑陋的黑客为他们添加前缀。
我的设计非常简单:
notes.FK_JOB -> job.ID
po.FK_JOB -> job.ID
site_jobs.FK_SITE -> site.ID
site_jobs.FK_JOB -> job.ID
不是那么容易吗?这么简单多了?
我也不知道PO是什么,除了它容易发生冲突(使用别名,其他列,临时名称)和无法提供信息。两者都是由于它的极端短缺。
答案 1 :(得分:0)
一种方法是在表的主键上使用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
, ...
答案 2 :(得分:0)
我会在加入之前聚合计数,我认为这是最有效的方法:
select
j.jobid, j.job_title, po.po_count,
...
from job as j
left outer join (
select count(*) as po_count, po.po_job_id
from po as po
group by po.po_job_id
) as po on po.po_job_id = j.job_id
...
where j.site_id = 116291
顺便说一下,当你没有使用<table name>.<column name>
表示法时,很难读取查询,我强烈建议对表使用别名并对所有列使用点表示法