如何返回没有活动位置的记录

问题描述

我有两个表:表1列出了设施,表2列出了设施位置(通过facility_no字段链接到设施

我需要归还所有处于活动状态的设施 ,至少没有一个处于活动状态的位置。位置表具有edate(结束日期)字段,如果该字段为null,则表示该记录处于活动状态。无法将客户引荐到没有活动地点的设施,因此必须查找孤立的设施记录。

#token and set proxy
token = 'token'
bot = telebot.TeleBot(token,threaded= False)
apihelper.proxy = {'https':'socks5://'}

@bot.message_handler(commands=['start'])
def start_message(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    Showcase = types.KeyboardButton('---')
    Vakancy = types.KeyboardButton('---')
    City = types.KeyboardButton('---')
    Account = types.KeyboardButton('---')
    markup.add(Showcase,Vakancy)
    markup.add(City)
    markup.add(Account)
    bot.send_message(message.chat.id,'Приветсвую тебя',reply_markup=markup)


if __name__ == "__main__":
    bot.polling()

select fc.facility_no,fc.facility_fname,fc.facility_lname,fc.facility_sdate,fc.edate,loc.loctrackingno,loc.sdate,loc.edate
from facility fc
inner join Locations loc
on loc.facility_trackingNo = fc.facility_no
where isnull(count(loc.EDate)) >= 1

以上两种方法均无效

解决方法

您的请求中的关键信息:

找到孤立的设施记录

如果您可以确定“活动位置”的条件确实是联接表达式的一部分,那么这并不比通常的 orphan 查找难。


我从结果集中删除了loc字段,因为孤儿不存在“ loc”

不存在

SELECT fc.facility_no,fc.facility_fname,fc.facility_lname,fc.facility_sdate,fc.edate
loc.edate
FROM facility fc
WHERE NOT EXISTS (
        SELECT loc.facility_trackingNo
        FROM Locations loc
        WHERE loc.facility_trackingNo = fc.facility_no
              AND loc.edate IS NULL
    )

左加入

SELECT fc.facility_no,fc.edate
FROM facility fc
LEFT OUTER JOIN Locations loc
        ON loc.facility_trackingNo = fc.facility_no
           AND loc.edate IS NULL
WHERE loc.facility_trackingNo IS NULL

禁止进入

SELECT fc.facility_no,fc.edate
loc.edate
FROM facility fc
WHERE fc.facility_no NOT IN (
        SELECT loc.facility_trackingNo
        FROM Locations loc
        WHERE loc.edate IS NULL
    )

通常要找到孤儿,您可以使用以下模式之一:

  1. 使用每行NOT EXISTS条条件对孤立/子表进行直接查询。

    SELECT <fields> 
    FROM <child table> 
    WHERE NOT EXISTS ( <expression to select the parent> )
    
    • 与使用子查询来生成计数并使用WHERE <count result> = 0的变体相比,这提供了更好的性能,因为它不需要寻求匹配的 all 匹配记录,这意味着它应该失败比计算计数更快。
    • NOT EXISTS通常也更容易阅读
  2. 使用LEFT [OUTER] JOIN并仅返回在联接的父端具有NULL的分组结果

    SELECT <fields> 
    FROM <child table> 
    LEFT OUTER JOIN <parent table> ON <linking expression>
    WHERE <field on parent expression> IS NULL
    
    • 此技术无需使用GROUP BY,因为记录中的重复仅在 if 中存在,并且联接中存在匹配项,并且我们专门排除了这些行。
  3. 使用NOT IN条件在孤立/子表上直接查询。

    SELECT <fields> 
    FROM <child table> 
    WHERE <linking field> NOT IN ( <linking field select query on the parent> )
    
    • 开发人员通常希望它具有更高的性能,但这只有在父记录的数量明显少于
    • 的情况下才是正确的。
    • 错误的假设是,由于我们不直接将行从一个结果集映射到另一个结果集,而只是比较值,因此工作量会减少...

注意::欲了解更多信息并了解性能问题,请访问:T-SQL commands performance comparison – NOT IN vs SQL NOT EXISTS vs SQL LEFT JOIN vs SQL EXCEPT

性能可能不是您选择其中一项的唯一原因,这些解决方案是供您在自己的环境中进行比较的,有时一种表达方式比其他表达方式更易于读取/写入/维护。

em>

通过您的尝试,INNER JOIN将在两个表中都存在记录的地方找到结果,因此INNER JOIN专门排除了您实际上要尝试查找的行它专门排除了 only 您要查找的行。

  • 您可以说“孤立”记录是INNER JOIN结果中不存在的记录。

因此,相反,我们需要使用 OUTER JOIN 来检索孤立的记录,因为这将返回联接双方均不匹配的行。然后找到孤儿。

此处提供更多信息:Inner Join vs Outer Join