我有一个项目表和另一个包含项目组的表(并非所有项目都在一个组中)。
我想从items表中获取所有内容,如果它存在于groups表中,我只希望每个组获得一个项目,请为此向我显示SQL查询。
答案 0 :(得分:0)
我正在定义一个示例项和itemGroups表。
项
itemID,itemName,ItemDescription
itemGroups
itemGroupId,itemGroupname,ItemGroupDescription,itemID
现在要获取项目表中的所有项目(如果它存在于itemsgroups表中),您必须比较项目ID,该项目ID应该是项目表中的主键,并将其与应该存储在项目组中的项目的外部键进行比较表。所以SQL查询看起来像这样
从项目中选择* 其中itemID在(从itemGroups中选择itemID)
您的coloumns名称可能不同,但这是一般概念
答案 1 :(得分:0)
假设您有类似于此的表结构:
create table items (itemid int, itemname varchar2(50));
insert all
into items (itemid, itemname) values (1,'Apples')
into items (itemid, itemname) values (2,'Bananas')
into items (itemid, itemname) values (3,'Ford')
into items (itemid, itemname) values (4,'Honda')
into items (itemid, itemname) values (5,'Football')
select * from dual;
create table itemgroups (itemgroupid int, itemid int, itemgroupname varchar2(50));
insert all
into itemgroups (itemgroupid, itemid, itemgroupname) values (1,1,'Fruits')
into itemgroups (itemgroupid, itemid, itemgroupname) values (1,2,'Fruits')
into itemgroups (itemgroupid, itemid, itemgroupname) values (2,3,'Cars')
into itemgroups (itemgroupid, itemid, itemgroupname) values (2,4,'Cars')
select * from dual;
您可以执行left join
来获取items
表中的所有记录(但每组只能获得一项)。然后,执行某种聚合,例如MAX
或MIN
,只为每个组获取一个值,如下所示:
select min(i.itemid) as itemid,
min(i.itemname) as itemname,
ig.itemgroupid,
ig.itemgroupname
from items i
left join itemgroups ig on i.itemid = ig.itemid
group by ig.itemgroupid,
ig.itemgroupname
order by min(i.itemid);
<强>结果:强>
+--------+----------+-------------+---------------+
| itemid | itemname | itemgroupid | itemgroupname |
+--------+----------+-------------+---------------+
| 1 | Apples | 1 | Fruits |
| 3 | Ford | 2 | Cars |
| 5 | Football | (null) | (null) |
+--------+----------+-------------+---------------+
答案 2 :(得分:0)
如果每个项目行都存储了一个groupid,请尝试以下方法:
select *
from items i
where groupid is null or itemid = (
select min(itemid) from items i2
where i2.groupid = i.groupid
)
如果您没有以这种方式建立联系,则可能需要采用这种方法:
select *
from items i
where itemid = (
select coalesce(min(ig.itemid), i.itemid)
from itemgroups ig
where ig.groupid = (select groupid from itemgroups ig2 where ig2.itemid = i.itemid)
)