我刚刚开始学习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'
真管用!我怎样才能解决这个问题?请原谅我的新手编码技能。
1条答案
按热度按时间l0oc07j21#
看来
product_template.product_variant_ids
以及sale_order_line.product_id
属于不兼容的数据类型,属于integer
另一个是字符串类型(text
,varchar
,…)-如错误消息所示。在涉及多列的查询中,使表限定所有列名成为一种习惯。
从列名猜测,
product_id
是integer
,和product_variant_ids
是字符串类型,这很可能是设计错误。如果它实际上在字符串表示形式中包含一个有效整数,如您的最终查询所示,那么对数据模型中的pk约束进行更多假设,您的查询可以如下工作:注意转换为整数:
product_variant_ids::int
. 但这只是把口红贴在Pig身上。列应为类型integer
首先。再说一遍,名字
product_variant_ids
表示多个值,暗示int[]
,整数数组。那你需要做更多。。。使用
JOIN
表示法,而不是嵌套多个级别的x IN (subquery)
. 更简单,通常更快。只要子查询返回不同的值,二者都是相同的。否则
IN
表示法折叠重复项,而联接不折叠。这种差异也会导致x IN (subquery)
内部执行更复杂,因此成本更高。最后,一个名为
product_variant_ids
通常表示在任何情况下数据库设计有误。通常,您不会在一个列中填充多个值。如果该列上面有一个字符串类型,那就是双重否定。您必须进一步研究关系设计和数据库规范化。