SQL从两个表中选择

时间:2011-12-12 13:07:07

标签: sql sql-server sql-server-2008

我的第一张表如下(不重要):

tbl_Item

ItemId,ItemName
1     ,'test'
2     ,'test2'
3     , 'test3'

和第二个表是(重要表),这个表告诉我们ItemId有什么规格?例如,ItemId 1具有规格5和6以及7

tbl_Spec

ItemId , SpecId
1      ,5
1      ,6
1      ,7
2      ,5
2      ,8
3      ,5
3      ,7

如何选择同时具有SpecId 5和7

的项目

结果必须是:

ItemId
1
3

SQL In(...)将OR作为默认值,但我需要使用And Function。

我的DBMS是SQL Server 2008

7 个答案:

答案 0 :(得分:4)

我敢肯定必须有更优雅的方式,但这应该给你你想要的东西(编辑:根据MichaełPowaga的建议修复)。

SELECT ItemId
FROM tbl_Spec
WHERE SpecId=5 OR SpecId=7
GROUP BY ItemId
HAVING COUNT(DISTINCT SpecId)=2

P.S。阿里,如果你需要一个更容易扩展的解决方案,你看过Mikael Eriksson的答案吗?

答案 1 :(得分:3)

select itemid from
(
    select itemid from tbl_spec where specid = 5
) subset1 inner join
(
    select itemid from tbl_spec where itemid = 7
) subset2 on subset1.itemid = subset2.itemid

答案 2 :(得分:3)

declare @T table
(
  ItemId int,
  SpecId int
)

insert into @T values
(1      ,5),
(1      ,6),
(1      ,7),
(2      ,5),
(2      ,5),
(2      ,8),
(3      ,5),
(3      ,7),
(4      ,5),
(4      ,5)

;with C(SpecId) as
(
  select 5 union all
  select 7
)
select T.ItemId
from @T as T
  inner join C
    on T.SpecId = C.SpecId
group by T.ItemId
having count(distinct T.SpecId) = (select count(*) from C)

结果:

ItemId
1
3

答案 3 :(得分:0)

这将提供您所要求的所需输出,但我不能100%确定这是否是您所要求的。

select distinct itemID
from tbl_Spec
where SpecId in (5,7)

答案 4 :(得分:0)

执行以下sql查询

从tbl_Spec中选择ItemId,其中SpecId在(5,7)

答案 5 :(得分:0)

select distinct ItemId from tbl_Item, tbl_Spec 
where tbl_Item.ItemId=tbl_Spec.ItemId 
and tbl_SPec.SpecId not in (select SpecId from tbl_Spec where SpecId not in (5,7))

我希望它适合你。

答案 6 :(得分:0)

select * from (select Count(ItemID)Counted from tbl_Spec where Itemid in (select Itemid  from tbl_Item )and SpecId in(5,7) group by ItemID) a where Counted>=2