【问题标题】:SQL Match exact set of values between two tablesSQL 匹配两个表之间的精确值集
【发布时间】:2014-03-21 09:17:47
【问题描述】:

好的,这有点难以解释,但我会尽力而为。

我有两张桌子,我们称它们为 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 是否有任何包含与表 1 中的一个活动组匹配的包集的订单。对于上面的示例,John Smith 的订单 155 将匹配 CampaignID 1、GroupID 2。Dave Jones 的订单 177 匹配 CampaignID 1、GroupID 1。但是订单 178 和 179 不匹配任何内容。因此,订单中的每组包都需要包含给定组的所有包才能匹配它

出于选择语句的目的,我有客户的 id 和 orderID,我只是想看看他订单中的包裹是否符合任何活动的标准。

我知道我可能没有很好地解释这一点,所以让我知道需要澄清什么。

编辑:

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

CampaignID | GroupID
     1     |    2

也许考虑到 GroupID 1 也符合条件,它可以返回符合最大数量包的 groupID。

【问题讨论】:

  • 请澄清一下,Table1Table2 之间的关系是什么? PackageID 或其他?
  • 对于 John Smith 的订单,为什么 GroupID 1 不匹配?这些表似乎仅通过 Package 列连接?以表格形式添加所需的结果。顺便说一句,您的表格未标准化。阅读它并更改您的数据库设计肯定是一个好主意。
  • ClientIDGroupID之间有没有关系你没有表达?
  • 如果 orderID 155,clientID 1111,那么为什么是 CampaignID |组ID 1 | 2.请校准
  • 也许考虑到 GroupID 1 也符合条件.....为什么只使用 Group 1?第 3 组也有资格。

标签: sql


【解决方案1】:

这是你想要的吗?

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

【讨论】:

  • 我已经尝试过类似的方法。问题出在以下事实,例如,搜索订单 155(clientID 1111),它返回 table1 的前 3 行,而它应该返回第 2 行和第 3 行
【解决方案2】:

我想我明白了:

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。只是因为人们似乎在问,这里的表格显示方式并不完全是它们的实现方式,它只是为了这个问题的目的而简化的等价物。

【讨论】:

    【解决方案3】:

    这是我的 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
    

    【讨论】:

      猜你喜欢
      • 2020-02-23
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多