查询未在sql中使用“not in”

hfsqlsce  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(288)

我如何写下查询不使用不在。由于性能原因,不在是不可取的。 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)

yhxst69z

yhxst69z1#

假设您的查询是正确的,您可以使用 not exists :

select d.cert_serial_number as str
from mdm_device d
where d.client_id in (:CLIENT_IDS) and
      not exists (select 1
                  from mdm_device d2
                  where d2.cert_serial_number = d.cert_serial_number and
                        d2.client_id not in (:CLIENT_IDS)
                 );

也可以使用聚合:

select d.cert_serial_number as str
from mdm_device d
group by d.cert_serial_number
having sum(d2.client_id in (:CLIENT_IDS)) = count(*);

也就是说,只返回具有这些序列号的设备,而不返回其他设备。

bvn4nwqk

bvn4nwqk2#

您的问题是性能方面的:如果您缺少有价值的索引或重要的列来捕获系统的基本需求,那么任何查询都不能解决您的性能问题。
你不想在结果中包含证书序列号的客户来自哪里?有没有可能您错过了一个专栏,它将极大地帮助您从结果中区分那些客户机证书?
我的解决办法:我建议你回到你的要求,重新估价。我很肯定其中一个会在某个地方生成一个列,并将帮助您获得预期性能的结果。

相关问题