有没有更好的方法返回不在表 Sql 中的列表值?

我有一个数字列表,例如 [300420,300421,300422,300423],以及一个包含从 300000 到 400000 的所有值(300422 和 300423 除外)的表。我需要从列表中返回不在表中的第一个值,现在我正在使用以下代码,但它太慢了。


foreach ($notas as $tuple) {

    $key = $tuple[0];

    $value = $tuple[1];


    if ($value) {

        $res = $PDO2->query("SELECT DISTINCT Num_Nota FROM itensnfs WHERE Num_Nota='$value'");

        $counter_codes = ($res->rowCount());

        

        if($counter_codes == 0){

            echo "Value " .$value. " don't exist";

            die();          

        }

    }

}


慕尼黑的夜晚无繁华
浏览 62回答 1
1回答

智慧大石

您可以枚举派生表中的值,然后使用not exists和聚合:select min(v.num) numfrom (    select 300420 num    union all select 300421    union all select 300422    union all select 300423) vwhere not exists (select 1 from itensnfs i where i.Num_Nota = v.num)根据您的数据库,有更简洁的替代方案union all 来生成派生表。一些数据库支持行构造函数values():select min(v.num) numfrom (values (300420), (300421), (300422), (300423)) v(num)where not exists (select 1 from itensnfs i where i.Num_Nota = v.num)MySQL 是一个值得注意的例外 - 但最近的版本支持values row():select min(v.num) numfrom (values row (300420), row (300421), row (300422), row (300423)) v(num)where not exists (select 1 from itensnfs i where i.Num_Nota = v.num)
打开App,查看更多内容
随时随地看视频慕课网APP