【问题标题】:SQL – Find all records in one table where linked records don’t existSQL – 查找一个表中不存在链接记录的所有记录
【发布时间】:2014-06-26 03:08:24
【问题描述】:

我对我见过的其他“在一个表中但不是另一个”线程略有不同。

我有 3 张桌子:

ProductFeed ProductFeedID INT 产品名称 NVARCHAR(30) 产品 产品ID INT ProductFeedID INT StorefrontID INT 店面 StorefrontID INT 店面名称 NVARCHAR(30)
  • ProductFeed 表的每条记录都有一个唯一的产品。
  • Product 表可以有多个相同的 ProductFeedID,但每个店面只能有 0 或 1 个唯一的 ProductFeedID 记录。
  • Storefront 表的每个店面有 1 条记录。

我想要做的是显示所有 ProductFeed 记录的查询,其中包含 StorefrontID 和 StorefrontName,其中不包含该店面的产品记录。所以是这样的:

ProductFeedID ProductName StorefrontID StorefrontName 123 iPod 1 我的商店 1 123 iPod 4 MyStore4 234 T恤2我的商店2 234 T恤4 MyStore4 345 咖啡杯 5 MyStore5 等等。

我使用的是 SQL Server 2012。有人可以帮忙吗?

【问题讨论】:

标签: sql tsql sql-server-2012


【解决方案1】:

--我觉得这样比较好理解。

    select pf.*, sf.*
    from productfeed pf  
    cross join storefront sf 
    where not exists (select 1 
                      from product p
                      where p.ProductFeedID = pf.ProductFeedID
                      and p.StoreFrontID = sf.StoreFrontID)

【讨论】:

    【解决方案2】:

    如果我理解正确,您可以通过生成产品提要和店面的所有可能组合来解决此问题,然后使用left join。不匹配的组合就是你想要的组合:

    select pf.*, sf.*
    from productfeed pf cross join
         storefront sf left join
         product p
         on p.ProductFeedID = pf.ProductFeedID and
            p.StoreFrontId = pf.StoreFrontId
    where p.ProductId is null
    

    【讨论】:

    • 两个答案都可以解决问题。交叉连接是关键。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多