【问题标题】:NOT EXISTS sub-query not quite working on joinNOT EXISTS 子查询不太适用于连接
【发布时间】:2014-05-29 02:29:17
【问题描述】:

我已阅读 MSDN / Technet 并了解子选择内部应该有一个来自外部选择的列来加入,但我的表结构并不完全是我所追求的。我有一个有 2 列的表,比如 NameType。可能有Name 的重复条目和Type 的重复条目,但NameType 的记录不重复(就像这两列的唯一键一样)。

小提琴样例:http://sqlfiddle.com/#!3/95f3b/3

示例代码:

DECLARE @food AS TABLE (FoodName NVARCHAR(200), FoodType NVARCHAR(200))
DECLARE @NEWfoods AS TABLE (FoodName NVARCHAR(200), FoodType NVARCHAR(200))

INSERT INTO @food (FoodName, FoodType) VALUES 
 ('Apples', 'Fruit')
,('Avocado','Fruit')
,('Bananas', 'Fruit')
,('Mangos', 'Fruit')
,('Bread', 'Grain')
,('Cottage Cheese', 'Dairy')
,('Tacos', 'Meals')
,('Carrots', 'Vegetables')
,('Celery', 'Vegatables')

INSERT INTO @NEWfoods ( FoodName, FoodType ) VALUES  
 ('Avocado','Vegetables')
,('Apples','Fruit')
,('Salt','Preservative')
,('Turkey','Protein')
,('Bread','Grain')
,('Bread','Grain')
,('Tacos','Meals')


SELECT
     f.FoodName
    ,f.FoodType 
FROM @food AS f
WHERE NOT EXISTS (
    SELECT * FROM @NEWfoods
    )

我期望发生的是 Avocado:Vegetables 将被插入,因为基表包含 Avocado:Fruit 但不包含 Avocado:Vegetables(请记住,我使用 both 列作为唯一键), Bread:GrainTacos:Meals 根本不会被插入,因为它们已经存在于基表中,而且 Salt:Preservative 也会被插入。

所以在所有这一切结束时,我似乎没有在这里使用正确的功能 - NOT EXISTS 本身不是正确的方法。编码器的块!任何帮助,将不胜感激。 :)

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql exists


    【解决方案1】:

    试试这个。

       SELECT
             f.FoodName
            ,f.FoodType 
        FROM @food AS f
        WHERE NOT EXISTS (
            SELECT * FROM @NEWfoods
            where FoodName = f.FoodName
            AND FoodType = f.FoodType
            )
    

    【讨论】:

    • 谢谢,但在我的情况下,Avocado 不会被插入为 @NEWfoods 的 Vegetable,因为 @food 中存在 Avocado 作为 Fruit :( 这正是我卡住了。
    • 然后也加入 FoodType。
    • 魔术!呃,为什么我不考虑加入 2 列? :-\
    • (SELECT * FROM @NEWfoods WHERE FoodName = f.FoodName AND FoodType = f.FoodType)
    【解决方案2】:
    DECLARE @food AS TABLE (FoodName NVARCHAR(200), FoodType NVARCHAR(200))
    DECLARE @NEWfoods AS TABLE (FoodName NVARCHAR(200), FoodType NVARCHAR(200))
    
    INSERT INTO @food (FoodName, FoodType) VALUES 
     ('Apples', 'Fruit')
    ,('Avocado','Fruit')
    ,('Bananas', 'Fruit')
    ,('Mangos', 'Fruit')
    ,('Bread', 'Grain')
    ,('Cottage Cheese', 'Dairy')
    ,('Tacos', 'Meals')
    ,('Carrots', 'Vegetables')
    ,('Celery', 'Vegatables')
    
    INSERT INTO @NEWfoods ( FoodName, FoodType ) VALUES  
     ('Avocado','Vegetables')
    ,('Apples','Fruit')
    ,('Salt','Preservative')
    ,('Turkey','Protein')
    ,('Bread','Grain')
    ,('Bread','Grain')
    ,('Tacos','Meals')
    
    
    SELECT
         f.FoodName
        ,f.FoodType 
    FROM @food AS f
    WHERE f.FoodType  NOT IN (
        SELECT N.FoodType FROM @NEWfoods N
        WHERE f.FoodName = n.FoodName AND F.FoodType = n.FoodType
        )
       **--- EITHER THS WAY** 
        select DISTINCT FF.FoodName,FF.FoodType from 
        (select f.FoodName,f.FoodType from @food f
         )AS FF LEFT JOIN @NEWfoods N ON N.FoodName = FF.FoodName AND N.FoodType = FF.FoodType
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-27
      • 2022-01-17
      • 1970-01-01
      • 2021-03-02
      • 2020-08-18
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      相关资源
      最近更新 更多