2011-10-10 44 views
0

我有这个疑问,但我需要为所有人制作一个联盟。但是,每个查询有列在选择列表中不同数量,这给我的错误:在选择列表中联合不同数量的列?

All queries combined using a UNION, INTERSECT or EXCEPT operator must have the same number of expressions in their target lists.

我怎样才能解决这个问题,以避免错误?

 Select 'Pregunta:(8-9-10)Totales No Coinciden' as Descripcion_Error, c_Fk_IdBoleta as Boleta, 
     f_TotalAreaExtensionFinca as Extension_Total, f_TotalAreaDedicadaFinca 
     as Area_Dedicada_Finca, f_TotalAreaTenenciaFinca as Tenencia_Finca 
     from Fnc_TenenciaUsoTierra 
     where (f_TotalAreaExtensionFinca <> f_TotalAreaDedicadaFinca OR f_TotalAreaExtensionFinca <> f_TotalAreaTenenciaFinca) 
     AND Fnc_TenenciaUsoTierra.c_Fk_IdBoleta = @id_Boleta 


UNION 

SELECT 'Pregunta (12) El área sembrada es mayor al área dedicada a cultivos' as Descripcion_Error, 
    c_Fk_IdBoleta as Boleta, 
    (SELECT SUM(f_AreaDedicadaCultivos) 
     FROM Fnc_TenenciaUsoTierra 
     WHERE c_Fk_IdBoleta = sembrado.c_Fk_IdBoleta) 
    AS AreaDedicadaCultivos, 
    SUM(sembrado.f_AreaSiembra) as AreaSembrada 
FROM 
    Clt_Sembrado as sembrado 
WHERE 
    sembrado.c_Fk_IdBoleta = 45550711 
GROUP BY sembrado.c_Fk_IdBoleta 
HAVING SUM(sembrado.f_AreaSiembra) > (SELECT SUM(f_AreaDedicadaCultivos) 
     FROM Fnc_TenenciaUsoTierra 
     WHERE c_Fk_IdBoleta = sembrado.c_Fk_IdBoleta) 

回答

3

您必须在UNION的每一侧具有相同数量的列。您可以随时添加虚拟列来实现 - 并填充NULL或您选择的“不适用”值。

SELECT 'Pregunta (12) El área sembrada es mayor al área dedicada a cultivos' as Descripcion_Error, 
    c_Fk_IdBoleta as Boleta, 
    (SELECT SUM(f_AreaDedicadaCultivos) 
     FROM Fnc_TenenciaUsoTierra 
     WHERE c_Fk_IdBoleta = sembrado.c_Fk_IdBoleta) 
    AS AreaDedicadaCultivos, 
    SUM(sembrado.f_AreaSiembra) as AreaSembrada, 
    NULL as Tenencia_Finca 
FROM Clt_Sembrado as sembrado 
7

问题是查询的每个部分中的列数,而不是结果的数量。你必须在顶部

  1. Descripcion_Error 5列,
  2. Boleta
  3. Extension_Total,
  4. Area_Dedicada_Finca,
  5. Tenencia_Finca底部

和4。

  1. Descripcion_Error,
  2. Boleta,
  3. AreaDedicadaCultivos,
  4. AreaSembrada

把这些回一个结果集必须有相同数量的列,并且在列相同的序号位置需要兼容的数据类型。

目前尚不清楚您的期望结果应该是什么样子。如果在第二个查询中没有合适的列添加,那么您可以添加一个常量表达式来代替其中一列。在这种情况下,您可能需要UNION ALL而不是UNION(两者之间的区别在于UNION增加了一个额外的重复删除步骤),或者应该将它们作为两个单独的结果带回到您的应用程序。

+1

如果需要,可以在短列表中为长列表中出现的额外列添加一个值,例如零或空值。 –

+0

是的,这是问题,但如果你有其他选择不同的联盟的建议,请告诉我。谢谢 – ale

+1

@ale - 如果你能描述所期望的结果应该是什么样子?按照乔纳森的建议,你可以添加一个常量表达式来表示底部的缺失列? –