【问题标题】:SQL - Exclude values of a column which meet a requirement at least onceSQL - 排除至少一次满足要求的列的值
【发布时间】:2018-02-23 08:03:25
【问题描述】:

有两个表ClientStock

Table Client
    Column IDC       (primary key, int, not null)

Table Stock
    Column IDS       (primary key, int, not null)
    Column IDC       (int, not null)
    Column Type      (bit, not null)
    Column Price     (decimal(10,2), null)

它们将被Client.IDC = Stock.IDC视为连接。

使用Type = 1Price not NULL 获取IDC 的客户是微不足道的。但是,获得剩余IDC 的列表对我来说并非易事。以下尝试未提供正确的 IDC 列表:

SELECT [Client].[IDC]
FROM [Client] LFEFT JOIN [Stock] on [Client].[IDC] = [Stock].[IDC]
WHERE NOT([Stock].[Type] = 1 AND [Stock].[Price] IS NOT NULL)

此语句返回一些 IDC 应该被排除在外,因为对于它们来说,确实有带有 Type = 0 的行,但也有带有 Type = 1Price not NULL 的其他行。我应该如何继续获得与Type = 1Price not NULL 完全没有行的IDC

【问题讨论】:

    标签: sql sql-server select join


    【解决方案1】:

    移动ON 子句中的条件。

    这意味着ON 子句中的条件将在加入Client 之前过滤表Stock 中的行。

    SELECT [Client].[IDC]
    FROM [Client] 
         LEFT JOIN [Stock] 
             on [Client].[IDC] = [Stock].[IDC]
                  AND [Stock].[Type] = 1 
                  AND [Stock].[Price] IS NOT NULL
    WHERE [Stock].[IDC] IS NULL
    

    这也可以使用NOT EXISTS进行转换

    SELECT [Client].[IDC]
    FROM [Client] c
    WHERE NOT EXISTS
    (
        SELECT 1
        FROM [Stock] s
        WHERE c.[IDC] = s.IDC
                  AND s.[Type] = 1 
                  AND s.[Price] IS NOT NULL
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多