报错:There is no supertype for types Int32, String because some of them are String/FixedString and som

SELECT *
FROM (
    SELECT
        occurTime AS recordTimestamp,
        tenant AS tenant,
        uuId AS uuId,
        hostIp AS hostIp,
        source AS source,
        type AS type,
        name AS name,
        score AS score,
        severity AS severity,
        engineName AS engineName,
        CAST(NULL AS Nullable(String)) AS srcIp,
        CAST(NULL AS Nullable(String)) AS dstIp,
        CAST(NULL AS Nullable(Int64)) AS IcmpType,
        CAST(NULL AS Nullable(String)) AS srcRegionId,
        CAST(NULL AS Nullable(String)) AS dstRegionId,
        regionId AS regionId
    FROM `business`.`ioa_log`
    WHERE
        (
            (`recordTimestamp` >= 1678723200)
            AND (`recordTimestamp` <= 1694707199)
            AND (`tenant` = '98013586')
        )
    ORDER BY `recordTimestamp` DESC, `uuId` DESC
    LIMIT 50

    UNION ALL

    SELECT
        recordTimestamp AS recordTimestamp,
        tenant AS tenant,
        uuId AS uuId,
        CAST(NULL AS Nullable(String)) AS hostIp,
        CAST(NULL AS Nullable(String)) AS source,
        CAST(NULL AS Nullable(String)) AS type,
        CAST(NULL AS Nullable(String)) AS name,
        CAST(NULL AS Nullable(Int32)) AS score,
        CAST(NULL AS Nullable(Int32)) AS severity,
        [] AS engineName,
        srcIp AS srcIp,
        dstIp AS dstIp,
        type AS IcmpType,
        srcRegionId AS srcRegionId,
        dstRegionId AS dstRegionId,
        CAST(NULL AS Nullable(String)) AS regionId
    FROM `business`.`icmp_log`
    WHERE
        (
            (`recordTimestamp` >= 1678723200)
            AND (`recordTimestamp` <= 1694707199)
            AND (`tenant` = '98013586')
        )
    ORDER BY `recordTimestamp` DESC, `uuId` DESC
    LIMIT 50
)
WHERE
    (
        (`recordTimestamp` >= 1678723200)
        AND (`recordTimestamp` <= 1694707199)
        AND (`tenant` = '98013586')
    )
ORDER BY `recordTimestamp` DESC, `uuId` DESC
LIMIT 0, 50;

① UNION ALL语法用于将两个或多个SELECT语句的结果集合并为一个结果集。它的语法如下:

SELECT column1, column2, ... FROM table1
UNION ALL
SELECT column1, column2, ... FROM table2;

其中,column1, column2, ...是要查询的列名,table1table2是要查询的表名。注意,两个SELECT语句的列数必须相同,且对应的列的数据类型也必须相同。

UNION ALL与UNION的区别在于,UNION会去重,而UNION ALL不会去重。因此,如果需要合并两个结果集并保留重复的行,可以使用UNION ALL。

② CAST语法用于将一个值转换为指定的数据类型。用于创建一些空的列,这些空的列在UNION ALL操作中被用于匹配两个SELECT语句的列,以便在结果集中创建一个完整的表格。

这里之所以会报错是因为:type字段的类型在ioa_log表中为字符串类型,在icmp_log表中为int64类型。可以将ioa_log表中的 type 字段重命名为IoaType,则SQL就会变为:

SELECT *
FROM (
    SELECT
        occurTime AS recordTimestamp,
        tenant AS tenant,
        uuId AS uuId,
        hostIp AS hostIp,
        source AS source,
        type AS IoaType,
        name AS name,
        score AS score,
        severity AS severity,
        engineName AS engineName,
        CAST(NULL AS Nullable(String)) AS srcIp,
        CAST(NULL AS Nullable(String)) AS dstIp,
        CAST(NULL AS Nullable(Int64)) AS IcmpType,
        CAST(NULL AS Nullable(String)) AS srcRegionId,
        CAST(NULL AS Nullable(String)) AS dstRegionId,
        regionId AS regionId
    FROM `business`.`ioa_log`
    WHERE
        (
            (`recordTimestamp` >= 1678723200)
            AND (`recordTimestamp` <= 1694707199)
            AND (`tenant` = '98013586')
        )
    ORDER BY `recordTimestamp` DESC, `uuId` DESC
    LIMIT 50

    UNION ALL

    SELECT
        recordTimestamp AS recordTimestamp,
        tenant AS tenant,
        uuId AS uuId,
        CAST(NULL AS Nullable(String)) AS hostIp,
        CAST(NULL AS Nullable(String)) AS source,
        CAST(NULL AS Nullable(String)) AS IoaType,
        CAST(NULL AS Nullable(String)) AS name,
        CAST(NULL AS Nullable(Int32)) AS score,
        CAST(NULL AS Nullable(Int32)) AS severity,
        [] AS engineName,
        srcIp AS srcIp,
        dstIp AS dstIp,
        type AS IcmpType,
        srcRegionId AS srcRegionId,
        dstRegionId AS dstRegionId,
        CAST(NULL AS Nullable(String)) AS regionId
    FROM `business`.`icmp_log`
    WHERE
        (
            (`recordTimestamp` >= 1678723200)
            AND (`recordTimestamp` <= 1694707199)
            AND (`tenant` = '98013586')
        )
    ORDER BY `recordTimestamp` DESC, `uuId` DESC
    LIMIT 50
)
WHERE
    (
        (`recordTimestamp` >= 1678723200)
        AND (`recordTimestamp` <= 1694707199)
        AND (`tenant` = '98013586')
    )
ORDER BY `recordTimestamp` DESC, `uuId` DESC
LIMIT 0, 50;

猜你喜欢

转载自blog.csdn.net/qq_42764468/article/details/132884545