SQL匹配两个表之间的精确值集

时间:2014-03-21 09:17:48

标签: sql

好的,这有点难以解释,但我会尽我所能。

我有两张桌子,我们称之为table1和table2。 table1看起来像这样:

ID | CampaignID | Package | GroupID
1  |     1      |    1    |   1  
2  |     1      |    1    |   2  
3  |     1      |    2    |   2  
4  |     2      |    1    |   3  
5  |     2      |    2    |   3  
6  |     2      |    3    |   3  

Table2看起来像这样:

ID | ClientID | ClientName | Package | OrderID
1  |   1111   | John Smith |    1    |   155  
2  |   1111   | John Smith |    2    |   155    
4  |   2222   | Dave Jones |    1    |   177  
5  |   2222   | Dave Jones |    2    |   178    
6  |   2222   | Dave Jones |    3    |   179    

我尝试做的是,例如,John Smith是否有任何订单包含与table1中的某个广告系列组相匹配的套餐。对于上面的示例,John Smith的订单155将匹配CampaignID 1,GroupID 2.Dave Jones的订单177匹配CampaignID 1,GroupID 1.但是订单178和179不匹配任何内容。因此,订单中的每组包都需要包含给定组的所有包以匹配它

出于select语句的目的,我有客户的ID和orderID,我只是想看看他的订单中的包是否符合任何广告系列的条件。

我知道我可能还没有解释过这个问题,所以让我知道需要澄清什么。

编辑:

如果我们说我们搜索orderID 155,clientID 1111,那么所需的结果将是:

CampaignID | GroupID
     1     |    2

也许鉴于GroupID 1也符合条件,它可以返回符合最大数量的软件包的groupID。

3 个答案:

答案 0 :(得分:0)

这是你想要的吗?

select table1.CampaignID  from Table2  
left join table1 on table1.Package =table2.Package 
where Table2.ClientID =@ClientID 
and Table2.OrderID =@OrderID 

答案 1 :(得分:0)

我想我明白了:

SELECT top 1 pcr1.GroupID FROM table1 pcr1
Where Not Exists (Select CampaignID from table1 as pcr2
where CampaignID = @campaignID and pcr2.GroupID= pcr1.GroupID Except
Select t2.Package from table2 as t2 where t2.OrderID = @ordID)
GROUP BY pcr1.GroupID 
ORDER BY COUNT(pcr1.GroupID) DESC

鉴于客户正在尝试申请的已知订单和广告系列,这为我提供了与给定订单(就包裹而言)最匹配的组ID(如果存在)。而且正因为人们似乎在问,这里表格的显示方式并不完全是它们实现的方式,它只是为了解决这个问题的简化等价物。

答案 2 :(得分:0)

这是我的Linkedin文章,有更深入的解释: https://www.linkedin.com/pulse/profile-matching-mike-inman?lipi=urn%3Ali%3Apage%3Ad_flagship3_profile_view_base_post_details%3Bqj89uO7mTSyVtHet9544VA%3D%3D

CREATE TABLE Campaign(
    ID INT,
    CampaignID INT,
    Package INT,
    GroupID INT)

CREATE TABLE ClientOrder(
    ID INT,
    ClientID INT,
    ClientName VARCHAR(20),
    Package INT,
    OrderID INT)

INSERT Campaign
(ID, CampaignID, Package, GroupID)
VALUES
(1, 1, 1, 1)  
,(2, 1, 1, 2)  
,(3, 1, 2, 2)  
,(4, 2, 1, 3)  
,(5, 2, 2, 3)  
,(6, 2, 3, 3) 

INSERT ClientOrder
(ID, ClientID, ClientName, Package, OrderID)
VALUES
(1, 1111, 'John Smith', 1  , 155)  
,(2, 1111, 'John Smith', 2  , 155)    
,(4, 2222, 'Dave Jones', 1  , 177)  
,(5, 2222, 'Dave Jones', 2  , 178)    
,(6, 2222, 'Dave Jones', 3  , 179) 

查询:

SELECT CO.ClientName, CampaignID
FROM    ClientOrder AS CO
JOIN    Campaign as C1
    ON    CO.Package = C1.Package
GROUP BY CO.ClientName, CampaignID
HAVING COUNT(CO.Package) = (
    SELECT COUNT(Package)
    FROM    Campaign C2
    WHERE    C1.CampaignID = C2.CampaignID)

结果:

ClientName           CampaignID
-------------------- -----------
Dave Jones           1
John Smith           1
Dave Jones           2