使用MySQL UNION

时间:2017-03-20 12:01:20

标签: mysql asp-classic

我有一张推荐书。有些标记为内部,有些标记为外部。我想要做的是产生一个记录集,输出所有内部的记录集,然后输出5个外部记录集,这些是随机排序的。我已经在我的数据库中直接成功构建了SQL,它返回了我想要的内容。它看起来像这样:

(SELECT tText, tName FROM tblTestimonials WHERE tExternal = 0 ORDER BY RAND())
UNION
(SELECT tText, tName FROM tblTestimonials WHERE tExternal = 1 ORDER BY RAND() LIMIT 5)

然而,当我将它插入到我的经典ASP页面中时,它非常适用于非常类似性质的简单非UNION SQL语句,当我尝试输出tText时,它会失败。使用tName很好(如果我将它添加到SELECT语句中,它也很高兴输出tExternal)。

我收到此错误:

  

错误' 80020009'
  多步OLE DB操作生成错误。检查每个OLE DB状态值(如果可用)。没有工作。

tName(有效)是可以为空的varchar(500)

tText(哪些错误)是可以为空的varchar(8000)

看起来UNION正在对较大文本字段的数据类型执行某些操作。我能够使它工作的唯一方法是使用:

(SELECT CONVERT(tText, CHAR(500)) AS tText, tName FROM tblTestimonials WHERE tExternal = 0 ORDER BY RAND())
UNION
(SELECT CONVERT(tText, CHAR(500)) AS tText, tName FROM tblTestimonials WHERE tExternal = 1 ORDER BY RAND() LIMIT 5)

然后我最终失去了大量数据。我只能输出不完整的评论。

如果有人对此有任何经验,我真的很感激。

1 个答案:

答案 0 :(得分:2)

之前我遇到过这个问题。

如果您使用UNION ALL代替UNION,您会发现它会神奇地发挥作用。

它们之间的差异是UNION对行进行重复数据删除(动态使用临时表),UNION ALL则不行。由于您不需要重复数据删除,因此使用Union All应该没问题。

为什么会这样?我只能推测。

在重复数据删除过程中(或之后),数据可能已损坏并成为无法在客户端处理的内容(位于ASP和MySQL ODBC驱动程序之间的OLEDB Provider for ODBC(MSDASQL))。

UNION Syntax