首页 > 解决方案 > 识别 2 个表(月 1、月 2)之间的变化。我正在使用联合/相交/除外

问题描述

结果返回随机顺序。表month1,month2对于大多数记录,但在记录中混合返回month2,month1。我需要一致的第 1 个月、第 2 个月。我看过很多类似的回复,但没有任何效果。我已经尝试过 cte,子查询,我已经将 1 添加到 month1 和 2 添加到 month2结果将其视为“更改”并返回所有记录。我的实际表有超过 5000 条记录,所以不确定这个小组是否会遇到与我相同的排序问题。

预期结果将是 2 行,都是 Bob Marley 行,因为第 3 列从一个月更改为另一个月。union/intersect/except 确实做到了这一点,但结果并没有一致地显示为表 a、表 b。每隔一段时间,记录将在表 b 中,表 a 顺序。

SELECT
    *
FROM
    (
        SELECT
            column1,
            column2,
            column3,
            1 AS sortby
        FROM
            tbl_Month1
        UNION
        SELECT
            column1,
            column2,
            column3,
            0 AS sortby
        FROM
            tbl_Month2
        INTERSECT
        SELECT
            column1,
            column2,
            column3,
            1 AS sortby
        FROM
            tbl_Month1
        EXCEPT
        SELECT
            column1,
            column2,
            column3,
            0 AS sortby
        FROM
            tbl_Month2
    ) results
ORDER BY
    column1,
    column2

CREATE TABLE #month1 (
    id INT
    , name NVARCHAR(200)
    , value_changed nvarchar(10)
    )

CREATE TABLE #month2 (
    id INT
    , name NVARCHAR(200)
    , value_changed nvarchar(10)
    )

INSERT INTO #month1 (id, name, value_changed)
VALUES (12345, 'Bob Marley','11233456')
, (12346, 'Bob Seger','55223366')
, (12346, 'Bob Dylan','47895645')
, (12346, 'Bob Plant','74185296')

INSERT INTO #month2 (id, name, value_changed)
VALUES (12345, 'Bob Marley','32565221')
, (12346, 'Bob Seger','55223366')
, (12346, 'Bob Dylan','47895645')
, (12346, 'Bob Plant','74185296')

标签: sql-serverunionintersectexcept

解决方案


正如您在将 sortBy 列 0 添加到 tbl_month2 和 1 到 tbl_month1 时提到的那样,这两个表中的任何行都不会相交。

但是,如果您删除 sortby 列,它也没有任何意义。您在 tbl_Month2 和 tbl_Month1 上使用 intersect ,这将返回所有公共行,然后您正在与 tbl_Month1 进行联合,最终将仅返回 tbl_month1 中的所有行。然后你已经排除了 tbl_month2 。

所以条件变成了除了 tbl_month2 之外的 tbl_Month1。是你在找什么吗?然后你可以使用 not exists 代替 except,如下所示:

SELECT * FROM ( SELECT id , name , value_changed, 0 as sortby FROM tbl_Month1 tm

where not exists(SELECT id
    , name
    , value_changed
    , 1 as sortby
FROM tbl_Month2 tbm where tbm.id=tm.id and tbm.name=tm.name and tbm.value_changed=tm.value_changed)

) results
ORDER BY id , name ,sortby

推荐阅读