Sql 其中不存在多个条件

Sql 其中不存在多个条件,sql,ms-access,Sql,Ms Access,如何设置多个和多个条件? 前 我知道这在我的桌子上是有效的,有一张桌子在哪里&和条件,但有几张桌子不行 我需要上面条件不匹配的两个表的结果。我在这两个表中没有相同的键。现在有了这段代码,我得到了表中的所有结果 以下是多个表的语法: WHERE NOT EXISTS (...) AND NOT EXISTS (...) AND NOT EXISTS (...) 但是,如果数据库太大,以至于您关心性能,那么您将需要一个不太明显的语法,如下所示: LEFT JOIN Some_Table t ON

如何设置多个和多个条件? 前

我知道这在我的桌子上是有效的,有一张桌子在哪里&和条件,但有几张桌子不行


我需要上面条件不匹配的两个表的结果。我在这两个表中没有相同的键。现在有了这段代码,我得到了表中的所有结果

以下是多个表的语法:

WHERE NOT EXISTS (...) AND NOT EXISTS (...) AND NOT EXISTS (...)
但是,如果数据库太大,以至于您关心性能,那么您将需要一个不太明显的语法,如下所示:

LEFT JOIN Some_Table t ON (t.xxx = Main_Table.xxx)
LEFT JOIN Another_Table t2 ON (t2.xxx = Main_Table.xxx)
LEFT JOIN Yet_Another_Table t3 ON (t3.xxx = Main_Table.xxx)
...
WHERE t.id IS NULL AND t2.id IS NULL AND t3.id IS NULL
对于一个表和一个组合条件,如您问题中的SQL示例:

LEFT JOIN Some_Table t ON
        t.xxx = Main_Table.xxx
    AND t.yyy = Main_Table.yyy
    AND t.zzz = Main_Table.zzz
WHERE t.id IS NULL
这将返回主_表中存在的行,但在某些_表中没有匹配行,假设列xxx等不可为空

例如,如果xxx可为空,则需要进一步修改查询:

LEFT JOIN Some_Table t ON
        (t.xxx = Main_Table.xxx OR (t.xxx IS NULL AND Main_Table.xxx IS NULL))
    AND t.yyy = Main_Table.yyy
    AND t.zzz = Main_Table.zzz
WHERE t.id IS NULL

以下是多个表的语法:

WHERE NOT EXISTS (...) AND NOT EXISTS (...) AND NOT EXISTS (...)
但是,如果数据库太大,以至于您关心性能,那么您将需要一个不太明显的语法,如下所示:

LEFT JOIN Some_Table t ON (t.xxx = Main_Table.xxx)
LEFT JOIN Another_Table t2 ON (t2.xxx = Main_Table.xxx)
LEFT JOIN Yet_Another_Table t3 ON (t3.xxx = Main_Table.xxx)
...
WHERE t.id IS NULL AND t2.id IS NULL AND t3.id IS NULL
对于一个表和一个组合条件,如您问题中的SQL示例:

LEFT JOIN Some_Table t ON
        t.xxx = Main_Table.xxx
    AND t.yyy = Main_Table.yyy
    AND t.zzz = Main_Table.zzz
WHERE t.id IS NULL
这将返回主_表中存在的行,但在某些_表中没有匹配行,假设列xxx等不可为空

例如,如果xxx可为空,则需要进一步修改查询:

LEFT JOIN Some_Table t ON
        (t.xxx = Main_Table.xxx OR (t.xxx IS NULL AND Main_Table.xxx IS NULL))
    AND t.yyy = Main_Table.yyy
    AND t.zzz = Main_Table.zzz
WHERE t.id IS NULL

您可以将所有的=替换为,并且应该得到所有与所有条件不匹配的结果

SELECT *
FROM CONFIRMED
WHERE EXISTS 
( 
    SELECT * 
    FROM Import_Orders
    WHERE Import_Orders.Customer <> CONFIRMED.Customer
        AND Import_Orders.Reference <> CONFIRMED.Reference
        AND Import_Orders.[Index] <> CONFIRMED.[Index]  
        AND Import_Orders.QuantityToDeliver <> CONFIRMED.QuantityToDeliver  
        AND Import_Orders.DateToDeliver <> CONFIRMED.DateToDeliver  

);

您可以将所有的=替换为,并且应该得到所有与所有条件不匹配的结果

SELECT *
FROM CONFIRMED
WHERE EXISTS 
( 
    SELECT * 
    FROM Import_Orders
    WHERE Import_Orders.Customer <> CONFIRMED.Customer
        AND Import_Orders.Reference <> CONFIRMED.Reference
        AND Import_Orders.[Index] <> CONFIRMED.[Index]  
        AND Import_Orders.QuantityToDeliver <> CONFIRMED.QuantityToDeliver  
        AND Import_Orders.DateToDeliver <> CONFIRMED.DateToDeliver  

);

我猜您在导入订单上有一个ID,如果不使用查询中显示为空的任何字段名的话。您最好使用字段名,而不是*。我添加了一个导入订单的示例

SELECT CONFIRMED.*, Import_Orders.ID, Import_Orders.Customer
FROM CONFIRMED 
LEFT JOIN Import_Orders
ON Import_Orders.Customer = CONFIRMED.Customer
AND Import_Orders.Reference = CONFIRMED.Reference
AND Import_Orders.[Index] = CONFIRMED.[Index]  
AND Import_Orders.QuantityToDeliver = CONFIRMED.QuantityToDeliver  
AND Import_Orders.DateToDeliver = CONFIRMED.DateToDeliver  
WHERE Import_Orders.ID Is Null
更多信息


我猜您在导入订单上有一个ID,如果不使用任何在查询中显示为空的字段名的话。您最好使用字段名,而不是*。我添加了一个导入订单的示例

SELECT CONFIRMED.*, Import_Orders.ID, Import_Orders.Customer
FROM CONFIRMED 
LEFT JOIN Import_Orders
ON Import_Orders.Customer = CONFIRMED.Customer
AND Import_Orders.Reference = CONFIRMED.Reference
AND Import_Orders.[Index] = CONFIRMED.[Index]  
AND Import_Orders.QuantityToDeliver = CONFIRMED.QuantityToDeliver  
AND Import_Orders.DateToDeliver = CONFIRMED.DateToDeliver  
WHERE Import_Orders.ID Is Null
更多信息



您遇到了什么错误?预期/实际输出是什么?您所显示的看起来是一个非常合理的查询-因此您需要做更多的工作来显示您遇到的实际问题。您能否进一步解释您试图实现的目标?我怀疑您的问题的答案可能是您需要在子查询中使用ORs而不是ANDs,但需要进一步的信息。我需要两个表的结果,其中上述条件不匹配。我在这两个表中没有相同的键。现在,通过这段代码,我得到了表中的所有结果。@gery-例如,如果交付日期为空,则可能发生这种情况。我扩展了我的回答,以说明如何解决这一问题。但是,如果所有列都不可为null,那么查询应该可以正常工作。您会遇到什么错误?预期/实际输出是什么?您所显示的看起来是一个非常合理的查询-因此您需要做更多的工作来显示您遇到的实际问题。您能否进一步解释您试图实现的目标?我怀疑您的问题的答案可能是您需要在子查询中使用ORs而不是ANDs,但需要进一步的信息。我需要两个表的结果,其中上述条件不匹配。我在这两个表中没有相同的键。现在,通过这段代码,我得到了表中的所有结果。@gery-例如,如果交付日期为空,则可能发生这种情况。我扩展了我的回答,以说明如何解决这一问题。但是,如果所有列都不可为空,则您的查询应该可以正常工作。这将返回一个空表,而结果查询中应该有一条记录。@Gerry我错过了开头的NOT,请立即尝试。这将返回一个空表,而结果查询中应该有一条记录。@Gerry我错过了开头的NOT,立即尝试第一个选项返回一个空表,而结果查询中应该有一条记录。我不知道第二个是如何工作的,因为现在我有两个表要与5个不同的表进行比较conditions@Gerry-哇,如果我现在知道你的问题,问题中的SQL就是你的解决方案。为什么你说它不适用于多个AND子句?无论如何,我将编辑我的答案,以添加带有外部联接的案例。第一个选项返回一个空表,而结果查询中应该有一条记录。我不知道第二个是如何工作的,因为现在我有两个表要与5个不同的表进行比较conditions@Gerry-哇,如果我现在知道你的问题,问题中的SQL就是你的解决方案。为什么你说它不适用于多个AND子句?无论如何,我将编辑我的答案,以添加带有外部联接的案例。+1哇,我从来不知道你可以在Import_Orders.ID为空的地方使用。谢谢你的提示+哇,我从来不知道你可以用WHER E Import_Orders.ID像这样为空。谢谢你的提示!