问题描述
我有两个表:表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
)
通常要找到孤儿,您可以使用以下模式之一:
-
使用每行
NOT EXISTS
条条件对孤立/子表进行直接查询。SELECT <fields> FROM <child table> WHERE NOT EXISTS ( <expression to select the parent> )
- 与使用子查询来生成计数并使用
WHERE <count result> = 0
的变体相比,这提供了更好的性能,因为它不需要寻求匹配的 all 匹配记录,这意味着它应该失败比计算计数更快。 -
NOT EXISTS
通常也更容易阅读
- 与使用子查询来生成计数并使用
-
使用
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 中存在,并且联接中存在匹配项,并且我们专门排除了这些行。
- 此技术无需使用
-
使用
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