我如何写下查询不使用不在。由于性能原因,不在是不可取的。 select d.cert_serial_number as str from mdm_device d where d.client_id in (:CLIENT_IDS) and d.cert_serial_number not in (Select cert_serial_number from mdm_device where client_id not in (:CLIENT_IDS))
表中感兴趣的列:
| cert_serial_number | client_id |
+--------------------+------------+
| 102 | 1073741835 |
| 102 | 1073741836 |
| 102 | 1073741837 |
| 102 | 1073741838 |
| 102 | 1073741839 |
| 103 | 1073741840 |
| 103 | 1073741831 |
+--------------------+------------+------------+
如果cliend id输入为10737418351073741836,则输出应为空。
如果cliend id输入为1073741835107374183610737418381073741839,则输出应为102。
编辑:我最终使用了下面的查询:从mdm\u设备d中选择d.cert\u serial\u number作为str,其中d.client\u id在(:client\u id)中,并且不存在(从mdm\u设备e中选择1,其中d.cert\u serial\u number=e.cert\u serial\u number和d.client\u id!=e、 客户id)
2条答案
按热度按时间yhxst69z1#
假设您的查询是正确的,您可以使用
not exists
:也可以使用聚合:
也就是说,只返回具有这些序列号的设备,而不返回其他设备。
bvn4nwqk2#
您的问题是性能方面的:如果您缺少有价值的索引或重要的列来捕获系统的基本需求,那么任何查询都不能解决您的性能问题。
你不想在结果中包含证书序列号的客户来自哪里?有没有可能您错过了一个专栏,它将极大地帮助您从结果中区分那些客户机证书?
我的解决办法:我建议你回到你的要求,重新估价。我很肯定其中一个会在某个地方生成一个列,并将帮助您获得预期性能的结果。