【问题标题】:Unknown column 'ID' in 'field list', but the column IS in the list“字段列表”中的未知列“ID”,但该列在列表中
【发布时间】:2019-06-30 09:33:37
【问题描述】:

错误:

“字段列表”中的未知列“ID”

我很困惑。如下所示,ID wp_posts 表下的一列:

create table wp_posts (
  ID integer primary key auto_increment,
  post_title varchar(30),
  post_type varchar(30)
);


create table wp_postmeta (
  ID integer primary key auto_increment,
  post_id integer,
  meta_key varchar(30) not null default '_regular_price',
  meta_value integer not null
);

产生错误的查询:

DELETE FROM wp_posts 
WHERE  id IN (SELECT id 
              FROM   (SELECT id, 
                             post_title, 
                             post_type, 
                             meta_value 
                      FROM   (SELECT wp_postmeta.post_id, 
                                     post_title, 
                                     post_type, 
                                     meta_value, 
                                     Row_number() 
                                       OVER( 
                                         partition BY post_title 
                                         ORDER BY wp_postmeta.meta_value) rn 
                              FROM   wp_postmeta 
                                     JOIN wp_posts 
                                       ON wp_postmeta.post_id = wp_posts.id 
                              WHERE  wp_posts.post_type = 'Product' 
                                     AND wp_postmeta.meta_key = '_regular_price' 
                             ) t 
                      WHERE  t.rn <> 1) AS aliasx); 

) t where t.rn <> 1
) AS aliasx
);

dbfiddle here

【问题讨论】:

  • 在您的第二个子查询中您选择了字段 Id,但在第三个子查询@ptrcao 中不存在这样的字段

标签: sql syntax mariadb


【解决方案1】:

不管数据库,你有这个代码:

                 (SELECT id, 
                         post_title, 
                         post_type, 
                         meta_value 
                  FROM   (SELECT wp_postmeta.post_id, 
                                 post_title, 
                                 post_type, 
                                 meta_value, 
                                 Row_number() 
                                   OVER( 
                                     partition BY post_title 
                                     ORDER BY wp_postmeta.meta_value) rn 

子查询中没有id。据推测,您打算使用post_id 而不是id

【讨论】:

    【解决方案2】:

    Gordon Linoff 是对的(- 我会接受他的回答),我不小心从子查询中省略了 wp_posts.ID。解决方法是在低阶子查询的SELECT列表中加入wp_posts.ID,,这样就可以在高阶子查询中被选中:

    (SELECT wp_posts.ID, wp_postmeta.post_id,post_title,post_type ,meta_value,
    

    【讨论】:

      【解决方案3】:

      您可以使用EXISTS 来简化您的查询,如下所示

      DELETE wp 
      FROM   wp_posts wp 
      WHERE  EXISTS (SELECT 1 
                     FROM   wp_postmeta md 
                     WHERE  md.post_id = wp.id 
                            AND wp.post_type = 'Product' 
                            AND md.meta_key = '_regular_price') 
      

      【讨论】:

      • DELETE 和 FROM 之间的 wp 实例是什么?我不熟悉这种语法,因为它似乎不符合结构 DELETE FROM table [WHERE conditions];?
      • Wp 是别名,这与您的原始查询相同。这是一个有效的 SQL 语法。您可以执行并检查它
      • 啊,好吧,我对别名很熟悉,但是,我从来不知道您必须在 DELETE 和 FROM 之间插入别名才能使其工作。真奇怪,你每天都学到新东西:)
      • No.. 它只是一个返回 1 或 null 的 falg,删除仅适用于它返回 1 的行。您可以在 google 中检查 Exist。它在很多方面都非常有用,而且比 IN 子句更好
      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多