2015-08-19 57 views
-3

我有一個項目表和另一個包含項目組的表(不是所有項都在一個組中)。加入兩個表的SQL查詢幫助

我想從項目表中獲取所有內容,如果它存在於組表中,我只想爲每個組獲得一個項目,請向我展示SQL查詢。

+0

包括與樣本數據的表結構和預期產出和你嘗試過什麼到目前爲止? – HaveNoDisplayName

+0

項目表和ItemGroups表 項目表具有itemid,ItemGroups具有groupid和itemid, 想要從ItemsGroups表中不存在的Items表中獲取所有ItemID,並且如果它們是組的一部分,那麼每個組只需要1個itemid。 – user4195342

+0

如果一個項目與2個不同的組映射,那麼你需要兩行該項目?或只有一行 – HaveNoDisplayName

回答

0

我正在定義一個示例項目和itemGroups表。

項目

ITEMID,ITEMNAME,ItemDescription

itemGroups

itemGroupId,itemGroupname,ItemGroupDescription,ITEMID

我們得到的所有項目從項目表,如果它在itemsgroups表中存在您必須比較項目表中應該使用主鍵的itemID,並將其與應存儲在項目組表中的項目進行比較。因此,SQL查詢看起來是這樣的

SELECT * FROM項目 其中ITEMID中(從itemGroups選擇ITEMID)

你coloumns名稱可能是不同的,但是這是一般概念

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

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