sql 2005 递归查询的奇怪问题 50jyxhz]

发布时间:2017-6-26 20:26:54 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"sql 2005 递归查询的奇怪问题 50jyxhz]",主要涉及到sql 2005 递归查询的奇怪问题 50jyxhz]方面的内容,对于sql 2005 递归查询的奇怪问题 50jyxhz]感兴趣的同学可以参考一下。

http://www.microsoft.com/china/msdn/library/data/sqlserver/05TSQLEnhance.mspx?mfr=true 给出了使用 CTE 处理材料清单层次结构 CREATE TABLE Items (   itemid   VARCHAR(5)  NOT NULL PRIMARY KEY,   itemname VARCHAR(25) NOT NULL,   /* other columns, e.g., unit_price, measurement_unit */ ) CREATE TABLE BOM (   itemid     VARCHAR(5) NOT NULL REFERENCES Items,   containsid VARCHAR(5) NOT NULL REFERENCES Items,   qty        INT        NOT NULL   /* other columns, e.g., quantity */   PRIMARY KEY(itemid, containsid),   CHECK (itemid <> containsid) ) SET NOCOUNT ON INSERT INTO Items(itemid, itemname) VALUES('A', 'Item A') INSERT INTO Items(itemid, itemname) VALUES('B', 'Item B') INSERT INTO Items(itemid, itemname) VALUES('C', 'Item C') INSERT INTO Items(itemid, itemname) VALUES('D', 'Item D') INSERT INTO Items(itemid, itemname) VALUES('E', 'Item E') INSERT INTO Items(itemid, itemname) VALUES('F', 'Item F') INSERT INTO Items(itemid, itemname) VALUES('G', 'Item G') INSERT INTO Items(itemid, itemname) VALUES('H', 'Item H') INSERT INTO Items(itemid, itemname) VALUES('I', 'Item I') INSERT INTO Items(itemid, itemname) VALUES('J', 'Item J') INSERT INTO Items(itemid, itemname) VALUES('K', 'Item K') INSERT INTO BOM(itemid, containsid, qty) VALUES('E', 'J', 1) INSERT INTO BOM(itemid, containsid, qty) VALUES('C', 'E', 3) INSERT INTO BOM(itemid, containsid, qty) VALUES('A', 'C', 2) INSERT INTO BOM(itemid, containsid, qty) VALUES('H', 'C', 4) INSERT INTO BOM(itemid, containsid, qty) VALUES('C', 'B', 2) INSERT INTO BOM(itemid, containsid, qty) VALUES('B', 'F', 1) INSERT INTO BOM(itemid, containsid, qty) VALUES('B', 'G', 3) INSERT INTO BOM(itemid, containsid, qty) VALUES('A', 'B', 2) INSERT INTO BOM(itemid, containsid, qty) VALUES('A', 'D', 2) INSERT INTO BOM(itemid, containsid, qty) VALUES('H', 'I', 1) 以下 CTE 计算数量的累积乘积: WITH BOMCTE(itemid, containsid, qty, cumulativeqty) AS (   SELECT *, qty   FROM BOM   WHERE itemid = 'A'   UNION ALL   SELECT BOM.*, BOM.qty * BOMCTE.cumulativeqty   FROM BOM     JOIN BOMCTE       ON BOM.itemid = BOMCTE.containsid ) SELECT * FROM BOMCTE 完全没有问题,但我将 qty 改为numeric(18, 4),就出现“Types don't match between the anchor and the recursive part in column "cumulativeqty" of recursive query "BOMCTE".”错误。如何解决?

WITH BOMCTE(itemid, containsid, qty, cumulativeqty) AS (   SELECT *, qty   FROM BOM   WHERE itemid = 'A'   UNION ALL   SELECT BOM.*, cast(BOM.qty * BOMCTE.cumulativeqty as decimal(18,4))   FROM BOM     JOIN BOMCTE       ON BOM.itemid = BOMCTE.containsid ) SELECT * FROM BOMCTE

CTE合并要求的数据类型很严格, 必须完全相同, 无法做隐式转换

多谢邹建老师指点。

上一篇:【交流】SQL 2005溢用之:合并列值 20zjcxc]
下一篇:关于sql 2005的问题 20knowyou28]

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。