我反对我的查询写作专业知识的极限。 我有下表,其中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会起作用。我已经挂断了对项目组合的分组......任何人都可以指出我正确的方向吗?
答案 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)
根据逻辑
加入emSELECT 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