无法获取相关表列的名称

mwyxok5s  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(345)

我刚刚开始学习sql,到目前为止(从两天前开始)我设法解决了大部分问题,但现在我需要帮助。
下面的查询将产生1列和1行:“12345”以及一些额外的值为0的行,我需要删除这些行。

SELECT product_id FROM sale_order_line WHERE order_id IN (SELECT id FROM sale_order WHERE name='S00062')

所以我尝试了以下方法:

SELECT product_id FROM sale_order_line WHERE order_id IN (SELECT id FROM sale_order WHERE name='S00062') AND NOT product_id='0'

现在我得到了我期待的结果“12345”。但当我试图从另一个表中获取与“12345”相关的列的名称时….:

SELECT name FROM product_template WHERE product_variant_ids IN (SELECT product_id FROM sale_order_line WHERE order_id IN (SELECT id FROM sale_order WHERE name='S00062') AND NOT product_id='0')

我得到一个错误:“无法将整型数据类型与字符串进行比较”。不知怎的,上面的代码似乎试图读取所有0的产品标识,然后才将它们全部删除。我猜是吧。
但是,如果我直接这么做,比如:

SELECT name FROM product_template WHERE product_variant_ids = '12345'

真管用!我怎样才能解决这个问题?请原谅我的新手编码技能。

l0oc07j2

l0oc07j21#

看来 product_template.product_variant_ids 以及 sale_order_line.product_id 属于不兼容的数据类型,属于 integer 另一个是字符串类型( text , varchar ,…)-如错误消息所示。
在涉及多列的查询中,使表限定所有列名成为一种习惯。
从列名猜测, product_idinteger ,和 product_variant_ids 是字符串类型,这很可能是设计错误。如果它实际上在字符串表示形式中包含一个有效整数,如您的最终查询所示,那么对数据模型中的pk约束进行更多假设,您的查询可以如下工作:

SELECT pt.name
FROM   sale_order       so
JOIN   sale_order_line  sol ON sol.order_id = so.id
JOIN   product_template pt  ON pt.product_variant_ids::int = sol.product_id  -- !
WHERE  so.name = 'S00062'
AND    NOT sol.product_id = 0;  -- numeric literal without

注意转换为整数: product_variant_ids::int . 但这只是把口红贴在Pig身上。列应为类型 integer 首先。
再说一遍,名字 product_variant_ids 表示多个值,暗示 int[] ,整数数组。那你需要做更多。。。
使用 JOIN 表示法,而不是嵌套多个级别的 x IN (subquery) . 更简单,通常更快。
只要子查询返回不同的值,二者都是相同的。否则 IN 表示法折叠重复项,而联接不折叠。这种差异也会导致 x IN (subquery) 内部执行更复杂,因此成本更高。
最后,一个名为 product_variant_ids 通常表示在任何情况下数据库设计有误。通常,您不会在一个列中填充多个值。如果该列上面有一个字符串类型,那就是双重否定。您必须进一步研究关系设计和数据库规范化。

相关问题