无法创建视图,否则语句运行正常每个视图或函数中的列名必须是唯一的

atmip9wb  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(586)

如果我不创建视图,那么这个语句可以正常工作。但是当我试图创建一个视图时,它给了我一个错误:
msg 4506,level 16,state 1,procedure uv\u azrcrv\u sopoplink,每个视图或函数中的第3行列名必须唯一。视图或函数“uv\u azrcrv\u sopoplink”中的列名“popRequestionNumber”指定了多次。

  1. CREATE VIEW uv_AZRCRV_SOPPOPLink AS SELECT
  2. ['Purchase Order Requisition'].*
  3. ,['Purchase Order Requisition Line'].*
  4. ,['Purchase Order'].*
  5. ,['Purchase Order Line'].* FROM
  6. (SELECT
  7. POPRequisitionNumber
  8. ,DOCDATE
  9. FROM
  10. POP10200
  11. UNION ALL
  12. SELECT
  13. POPRequisitionNumber
  14. ,DOCDATE
  15. FROM
  16. POP30200) AS ['Purchase Order Requisition Line']
  17. INNER JOIN
  18. (SELECT
  19. POPRequisitionNumber
  20. ,ORD
  21. ,ITEMNMBR
  22. ,QTYORDER
  23. FROM
  24. POP10210
  25. UNION ALL
  26. SELECT
  27. POPRequisitionNumber
  28. ,ORD
  29. ,ITEMNMBR
  30. ,QTYORDER
  31. FROM
  32. POP30210) AS ['Purchase Order Requisition']
  33. ON ['Purchase Order Requisition'].POPRequisitionNumber = ['Purchase Order Requisition Line'].POPRequisitionNumber
  34. LEFT JOIN
  35. SOP60100 AS ['SOP_POPLink']
  36. ON
  37. ['SOP_POPLink'].SOPNUMBE = ['Purchase Order Requisition'].POPRequisitionNumber
  38. AND
  39. ['SOP_POPLink'].LNITMSEQ = ['Purchase Order Requisition'].ORD
  40. LEFT JOIN
  41. (SELECT
  42. PONUMBER
  43. ,ORD
  44. FROM
  45. POP10110
  46. UNION ALL
  47. SELECT
  48. PONUMBER
  49. ,ORD
  50. FROM
  51. POP30110) AS ['Purchase Order Line']
  52. ON
  53. ['Purchase Order Line'].PONUMBER = ['SOP_POPLink'].PONUMBER
  54. AND
  55. ['Purchase Order Line'].ORD = ['SOP_POPLink'].ORD
  56. LEFT JOIN
  57. (SELECT
  58. PONUMBER
  59. ,DOCDATE
  60. FROM
  61. POP10100
  62. UNION ALL
  63. SELECT
  64. PONUMBER
  65. ,DOCDATE
  66. FROM
  67. POP30100) AS ['Purchase Order']
  68. ON
  69. ['Purchase Order'].PONUMBER = ['Purchase Order Line'].PONUMBER
  70. GO
wqsoz72f

wqsoz72f1#

视图定义的输出中有多个同名的列。例如 POPRequisitionNumber 两者都有 ['Purchase Order Requisition'] 以及 ['Purchase Order Requisition Line'] 因为您在select语句中从这两个表中选择了select*(所有列)。
您必须单独指定所需的确切列,或者对它们进行别名以使它们唯一。
单独运行select语句时,这是正常的,因为结果中的列名不会存储在任何位置,但如果尝试创建视图,则不能有两个同名的列。
如果将此查询用作子查询,则会面临相同的问题。

z0qdvdin

z0qdvdin2#

SELECT * 快速简单,但有时有害。这是有害的情况之一。
特别是引用戴夫·马克尔对这个问题的回答:
绑定问题。选择时,可以从两个不同的表中检索同名的两列。这通常会使数据使用者崩溃。假设一个查询连接两个表,两个表都包含一个名为“id”的列。消费者怎么知道哪个是哪个?当底层表结构发生变化时,select也会混淆视图(至少在某些版本的sql server中是这样)——视图没有重建,返回的数据可能是无意义的。最糟糕的是,你可以小心地给你的专栏取你想要的名字,但是下一个来的人可能不知道,他不得不担心添加一个专栏会与你已经开发的名字相冲突。
在您的示例中,要从中选择的两个或多个表都有一个名为 POPRequisitionNumber . 如果数据是冗余的,只需选择一次。如果数据不是冗余的,可以使用别名为这些列中的每一列指定一个更具描述性和唯一性的名称。

相关问题