-1

我的 sql 查询有什么问题?我正在尝试使用 aJoin并同时使用 aUNION从另一个表中获取所有表,同时根据关系将其他表连接在一起..

但是我收到以下错误:

"The used SELECT statements have a different number of columns"

我的查询:

SELECT a.ESN, a.UnixTime, a.Payload, a.Timestamp
                ,b.AlarmingStatus
                ,b.STxModel
                ,c.GroupID
                FROM STxMessage a
                JOIN STx b ON b.ESN = a.ESN
                JOIN GroupInfo c ON b.GroupID = c.GroupID
                WHERE b.STxModel = 190
                AND a.AlarmsChecked="y"
                AND c.AlertsMasterSwitch="on"
               UNION ALL 
      SELECT d.ESN , d.UnixTime,  d.Payload,  d.Timestamp FROM STxMessageArchive d
4

4 回答 4

5

错误消息说明了一切。

使用时UNION,组合语句返回的列SELECT必须相同,例如。

SELECT col1, col2, col3 FROM table1
UNION
SELECT col1, col2, col3 FROM table2

如果列不匹配,您仍然可以组合它,前提是您必须为列提供虚拟数据,例如

SELECT col1, col2, col3 FROM table1
UNION
SELECT col1, col2, '' AS col3 FROM table2

所以在你的查询中,它应该是这样的

SELECT  a.ESN, a.UnixTime, a.Payload, a.Timestamp ,
        b.AlarmingStatus, b.STxModel, c.GroupID
FROM    STxMessage a
        INNER JOIN STx b 
            ON b.ESN = a.ESN
        INNER JOIN GroupInfo c 
            ON b.GroupID = c.GroupID
WHERE   b.STxModel = 190 AND 
        a.AlarmsChecked="y" AND 
        c.AlertsMasterSwitch="on"
UNION ALL 
SELECT  d.ESN, d.UnixTime, d.Payload, d.Timestamp,
        NULL AS AlarmingStatus, NULL AS STxModel, NULL AS GroupID
FROM    STxMessageArchive d
于 2013-01-18T09:34:12.740 回答
1

您好,这是您的第一个查询中的额外列

 ,b.AlarmingStatus
 ,b.STxModel
 ,c.GroupID

您需要在第二个查询中执行相同的列,union或者您需要删除此列才能执行union操作

于 2013-01-18T09:33:50.317 回答
0

正如错误所说,第一部分有 7 列,而第二部分只有 4 列。联合需要两边都有相同的列。要么删除

b.AlarmingStatus ,b.STxModel ,c.GroupID 

从第一部分开始,或在第二部分添加(甚至是虚假的)列。

于 2013-01-18T09:34:01.423 回答
0

您的第一个查询选择了 7 列,而第二个查询只选择了 4 个。您需要确保第二个查询选择的列数与第一个查询相同才能Union All正常工作。

SELECT a.ESN, a.UnixTime, a.Payload, a.Timestamp
                ,b.AlarmingStatus
                ,b.STxModel
                ,c.GroupID
                FROM STxMessage a
                JOIN STx b ON b.ESN = a.ESN
                JOIN GroupInfo c ON b.GroupID = c.GroupID
                WHERE b.STxModel = 190
                AND a.AlarmsChecked="y"
                AND c.AlertsMasterSwitch="on"
               UNION ALL 
      SELECT d.ESN , d.UnixTime,  d.Payload,  d.Timestamp, 'null' as AlarmingStatus,
      'null' as STxModel, 'null' as GroupID FROM STxMessageArchive d
于 2013-01-18T09:35:10.690 回答