代码之家  ›  专栏  ›  技术社区  ›  Arsen Mkrtchyan

在sql中使用IN时出现问题

  •  0
  • Arsen Mkrtchyan  · 技术社区  · 17 年前


    你能帮我弄清楚问题在哪里吗?

    SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec
    


    SELECT mz_t_Services.p_ID from mz_t_Services
    

    上述脚本返回id为2000000000115的记录集

    SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec)
    

    我正在使用MSSQL
    编辑:

    3 回复  |  直到 17 年前
        1
  •  4
  •   RBarryYoung    17 年前

        2
  •  1
  •   Jonas Elfström    17 年前
    SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT ISNULL(mz_t_NaznExec.p_Services,0) FROM mz_t_NaznExec)
    

    SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec WHERE mz_t_NaznExec.p_Services is not null)
    
        3
  •  0
  •   Steve Broberg    17 年前

    这也将奏效:

    SELECT p_id
      FROM mz_t_services
     WHERE NOT EXISTS
           ( SELECT 1
               FROM mz_t_naznexec
              WHERE mz_t_naznexec.p_services = mz_t_services.p_id
           )
    

    与上述解决方案相比,我更喜欢它,因为它更可靠地使用索引(根据我的经验)。无论是否存在空值,它都是有效的,因此您可以随时使用该表单,而不管您对表内容的期望如何,也不用担心人们问您为什么要在不允许的列中检查空值。

    无论如何,你应该尝试这两种解决方案,看看哪种更适合你。