SQL当任何外键2出现在第二个表中时,查找具有外键1的所有行

时间:2016-08-19 15:34:00

标签: sql sql-server

我反对我的查询写作专业知识的极限。 我有下表,其中extid + extdt的组合使用了一种复合键:

 ents
 entid | extid |    extdt     | itemid |
 =======================================
  1000 |  100  | '2016-08-01' |   1    |
  1001 |  100  | '2016-08-01' |   2    |
  1002 |  200  | '2016-08-01' |   3    |
  1003 |  100  | '2016-08-02' |   4    |
  1004 |  200  | '2016-08-02' |   5    |
  1005 |  100  | '2016-08-02' |   6    |

因此,如果itemid(1或2)在items表中,则查询将返回第1000行和第1001行。如果itemid 3存在,则返回行1002,依此类推......

items
    itemid | itemDesc | 
    ===================  
       1   |   'fu'   | 
       3   |   'bar'  |
       4   |  'blah'  |

使用上面的项目表,我希望能够回来:

 entid | extid |    extdt     | itemid |
 =======================================
  1000 |  100  | '2016-08-01' |   1    |
  1001 |  100  | '2016-08-01' |   2    |
  1002 |  200  | '2016-08-01' |   3    |
  1003 |  100  | '2016-08-02' |   4    |
  1005 |  100  | '2016-08-02' |   6    |

我无法想到一个可以完成我所寻找的聚合功能,也不会认为ANY / EXISTS会起作用。我已经挂断了对项目组合的分组......任何人都可以指出我正确的方向吗?

5 个答案:

答案 0 :(得分:2)

首先,您需要获取与您的商品匹配的复合键,但包括DISTINCT以避免重复

SELECT  DISTINCT extid,  extdt
FROM ents
JOIN items
  ON ents.itemid = items.itemid 

现在,您将检索与所选复合键匹配的每一行

SELECT *
FROM ents
JOIN ( SELECT  DISTINCT extid,  extdt
       FROM ents
       JOIN items
         ON ents.itemid = items.itemid 
     ) comp_key
 ON ents.extid = comp_key.extid
AND ents.extdt = comp_key.extdt

答案 1 :(得分:1)

select * 
from ents e1 
where e1.extid in
    (select extid 
     from ents e2 
     where e2.itemid in (select itemid from items))

也许?您还可以修改您特定需要的项ID的最后一个内部查询。

答案 2 :(得分:1)

根据逻辑

加入em
SELECT e.*
-- records from the ents table
FROM ents e
-- with an extid that matches
JOIN ents extid on e.extid = extid.extid
-- all the records with an itemid in the items table.
JOIN items i on extid.itemid = i.itemid

如果唯一键是id和date,则使用

JOIN ents extid on e.extid = extid.extid and e.extdt = extid.extdt

答案 3 :(得分:0)

从您的描述(但不是示例,似乎与之相矛盾):

SELECT e.*
FROM item i
JOIN ent e ON e.itemid = i.itemid

但我怀疑问题不是那么简单吗?

答案 4 :(得分:-1)

SELECT e.* 
FROM [Test].[dbo].[ents] e,[Test].[dbo].[items] i
WHERE e.extid in (SELECT extid from [Test].[dbo].[ents] oe where oe.itemid=i.itemid)
and e.extdt in (SELECT extdt from [Test].[dbo].[ents] oe where oe.itemid=i.itemid)
order by itemid