【问题标题】:Error while using Union in SQL Server query在 SQL Server 查询中使用联合时出错
【发布时间】:2020-09-15 09:02:18
【问题描述】:

我正在尝试组合来自 2 个视图的相同信息,并且两个查询分别产生结果。但是,一旦我使用 Union 将它们组合起来,就会出现错误:

将数据类型 varchar 转换为 bigint 时出错。

我也尝试使用别名作为表名,但它显示相同的错误。

这是我的查询

SELECT DISTINCT
       syn.sourcename,
       syn.propertyname,
       syn.IATA,
       syn.iataagencyname,
       syn.iataagencyaffiliation,
       syn.nightsstayed,
       syn.reservationstatus,
       syn.departuredate,
       syn.reservationroomrate
FROM dbo.vwIATAfactreservationSynXis syn
WHERE syn.reservationstatus != 'C'
  AND syn.departuredate >= CONVERT(datetime, '01/01/2020')
  AND syn.departuredate <= CONVERT(datetime, GETDATE())
UNION
SELECT DISTINCT
       ws.sourcename,
       ws.propertyname,
       ws.IATA,
       ws.iataagencyname,
       ws.iataagencyaffiliation,
       ws.nightsstayed,
       ws.reservationstatus,
       ws.departuredate,
       ws.reservationroomrate
FROM dbo.vwIATAfactreservationSHR ws
WHERE ws.reservationstatus != 'C'
  AND ws.departuredate >= CONVERT(datetime, '01/01/2020')
  AND ws.departuredate <= CONVERT(datetime, GETDATE());

【问题讨论】:

  • 选择列表中的一列是两个不同查询之间的不同类型。 SQL 将尝试转换为更精确的类型,即 bigint。您应该检查数据类型并将 bigint 显式转换为查询中的 varchar。
  • 你的列数据类型在两个表中是不同的,对于union/union所有操作符表的结构需要兼容
  • 既然已经在使用DISTINCT,为什么还要使用UNION
  • 能否提供创建表语句。也可能是这个答案会帮助stackoverflow.com/questions/1237784/…
  • 为什么你有两个几乎相同的表?

标签: sql sql-server union


【解决方案1】:

你需要弄清楚哪些列不一样。 . .然后转换它们。为此,您可以使用INFORMATION_SCHEMA.COLUMNS

select column_name, data_type, count(*)
from information_schema.columns c
where table_name in ('vwIATAfactreservationSynXis', 'vwIATAfactreservationSHR')
group by column_name, data_type
having count(*) <> 2
order by column_name;

这应该足够接近(除非两个视图有无数列未在查询中提及)。如果有很多单例列,则过滤原始查询中使用的列。然后,无论列有不同的类型——好吧,整数应该转换为字符串。

如果您不想麻烦,您可以将两个子查询中的所有列(或所有可疑列)转换为字符串:

SELECT CONVERT(VARCHAR(255), syn.sourcename) as sourcename,
       CONVERT(VARCHAR(255), syn.propertyname) as proprtyname,
       . . . 

【讨论】:

  • 谢谢,更改了数据类型,它对我有用。
  • @Vaibhav 。 . .我觉得你不接受这个答案很奇怪。
【解决方案2】:

尝试将两个 select 语句中的字段一一转换为字符串,以找到导致问题的字段,如下例所示:

SELECT DISTINCT
       cast(syn.sourcename as nvarchar(max)),
       syn.propertyname,
       syn.IATA,
       syn.iataagencyname,
       syn.iataagencyaffiliation,
       syn.nightsstayed,
       syn.reservationstatus,
       syn.departuredate,
       syn.reservationroomrate
FROM dbo.vwIATAfactreservationSynXis syn
WHERE syn.reservationstatus != 'C'
  AND syn.departuredate >= CONVERT(datetime, '01/01/2020')
  AND syn.departuredate <= CONVERT(datetime, GETDATE())
UNION
SELECT DISTINCT
       cast(syn.sourcename as nvarchar(max)),
       ws.propertyname,
       ws.IATA,
       ws.iataagencyname,
       ws.iataagencyaffiliation,
       ws.nightsstayed,
       ws.reservationstatus,
       ws.departuredate,
       ws.reservationroomrate
FROM dbo.vwIATAfactreservationSHR ws
WHERE ws.reservationstatus != 'C'
  AND ws.departuredate >= CONVERT(datetime, '01/01/2020')
  AND ws.departuredate <= CONVERT(datetime, GETDATE());

【讨论】:

  • 然而,当查询使用UNION 时,SELECT 中仍然不需要DISTINCT 关键字。它们的使用只会给数据引擎带来额外的开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多