代码之家  ›  专栏  ›  技术社区  ›  Dizzy49

如何基于记录可能共享值的多个字段排除记录

  •  1
  • Dizzy49  · 技术社区  · 3 年前

    我有两张地址表。它们的格式非常相似,to[main]表也有客户名称

    CREATE TABLE [shipTo] 
    (
        [id] int IDENTITY(1,1),
        [custID] int,
        [address1] varchar(255),
        [address2] varchar(255),
        [city] varchar(255),
        [state] varchar(255),
        [zip] varchar(255)
    )
    

    这个 shipto 表中有每个主要客户的多个地址,很多时候,主要地址也列为 希普托 .我不想在结果中包含该主地址,但我无法使其正常工作,因为在许多情况下,其他地址可能共享一个城市或州,甚至是一个空白地址2。

    这是我的。。。

    SELECT 
        @tmpCustID = [id], 
        @chkAddress1 = [Address 1], 
        @chkAddress2 = [Address 2], 
        @chkCity = [City], 
        @chkState = [State],  
        @chkZip = [Zip] 
    FROM 
        [main] 
    WHERE 
        [id] = @cnt
    
    SELECT * 
    FROM [shipTo]  
    WHERE [custID] = @tmpCustID
      AND [Address 1] <> @chkAddress1
      AND [Address 2] <> @chkAddress2
      AND [City] <> @chkCity
      AND [State] <> @chkState
      AND [Zip] <> @chkZip
    

    以下是数据:

    主要的

    |id| address1     | address2      | city     | state | zip   |
    |2 | 123 baker st |               | columbus | oh    | 43081 |
    

    希普托

    |id| custid| address1       | address2       | city         | state | zip   |
    |1 | 2     | 123 baker st   |                | columbus     | oh    | 43081 |
    |2 | 2     | 626 oak point  |                | cleveland    | oh    | 43092 |
    |3 | 2     | 17 purple blvd |                | columbus     | ga    | 81265 |
    |4 | 2     | 851 brawny     |                | grand rapids | mi    | 49417 |
    |5 | 2     | 101 olive rd   | suite #3       | grand rapids | mi    | 49417 |
    

    我希望它返回id 2-5,但它只返回#5,因为它将主地址的某些元素与shipto匹配,但我需要它来查看整个记录。

    我还试着添加一个AND和括号,以为它会起作用,但也没有起作用。

    SELECT * 
    FROM [shipTo]  
    WHERE [custID] = @tmpCustID
      AND ([Address 1] <> @chkAddress1
      AND [Address 2] <> @chkAddress2
      AND [City] <> @chkCity
      AND [State] <> @chkState
      AND [Zip] <> @chkZip)
    
    2 回复  |  直到 3 年前
        1
  •  1
  •   DhruvJoshi    3 年前

    也许可以试试这个问题

    SELECT * FROM [shipTo]  
    WHERE [custID] = @tmpCustID
    AND NOT
    ([Address 1] = @chkAddress1
     AND [Address 2] = @chkAddress2
     AND [City] = @chkCity
     AND [State] = @chkState
     AND [Zip] = @chkZip)
    
        2
  •  0
  •   D-Shih    3 年前

    我们可以尝试使用 OR 用括号来表达你的逻辑。

    SELECT * 
    FROM [shipTo]  
    WHERE [custID] = @tmpCustID 
    AND 
    (
        [Address 1] <> @chkAddress1
        OR [Address 2] <> @chkAddress2
        OR [City] <> @chkCity
        OR [State] <> @chkState
        OR [Zip] <> @chkZip
    )
    

    sqlfiddle