有关连接2个表的SQL查询帮助

时间:2015-08-19 18:42:08

标签: sql oracle

我有一个项目表和另一个包含项目组的表(并非所有项目都在一个组中)。

我想从items表中获取所有内容,如果它存在于groups表中,我只希望每个组获得一个项目,请为此向我显示SQL查询。

3 个答案:

答案 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表中的所有记录(但每组只能获得一项)。然后,执行某种聚合,例如MAXMIN,只为每个组获取一个值,如下所示:

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)        |
+--------+----------+-------------+---------------+

SQL Fiddle Demo

答案 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)
)