单列联合

Union by single column

我在不同的数据库中有 2 个表,我希望能够 select 来自 names_new 的所有行和来自 names 的缺失行,并且想知道每一行在哪里来自.

+---------------+              +---------------+ 
|     NAMES     |              |   NAMES_NEW   |
+---------------+              +---------------+
| ID |   NAME   |              | ID |   NAME   |
+----+----------+              +----+----------+
|  1 |  Name1   |              |  1 |  Name1!  |
+----+----------+              +----+----------+
|  2 |  Name2   |              |  3 |  Name3   |
+----+----------+              +----+----------+

              +----------------------+ 
              |       RESULTS        |  <-- I want this result
              +----------------------+ 
              | ID |   NAME   | FROM | 
              +----+----------+------+
              |  1 |  Name1!  |  NEW |
              +----+----------+------+
              |  2 |  Name2   |  OLD |
              +----+----------+------+
              |  3 |  Name3   |  NEW |
              +----+----------+------+

类似这样的东西,但确实有效

(
  SELECT
    n.ID as [ID],
    n.NAME as [NAME],
    'OLD' AS [FROM]
  FROM NAMES n
  UNION
  SELECT
    nn.ID as [ID],
    nn.NAME as [NAME],
    'NEW' as [FROM]
  FROM NAMES_NEW nn
)
ORDER BY NAME ASC OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;

我要在网页上展示这个。所以我需要能够添加分页和不同的 where 子句。

我在这里创建了一个 JDoodle:https://jdoodle.com/a/U9k

我会这样使用 union all

select nn.id, nn.name, 'new' as which
from names_new nn
union all
select n.id, n.name, 'old' as which
from names_old n
where not exists (select 1 from names_new nn where nn.id = n.id);

这是比较id。我不确定您是否要比较 ID 或名称(或两者)以进行优先排序。

我认为这里不需要 UNION,我认为 FULL OUTER JOIN 可能会提供更好的解决方案:

SELECT ISNULL(NN.ID,N.ID) AS ID,
       ISNULL(NN.[NAME], N.[NAME]) AS [Name],
       CASE WHEN NN.ID IS NOT NULL THEN 'NEW' ELSE 'OLD' END AS [From]
FROM dbo.NAMES N
     FULL OUTER JOIN dbo.NAMES_NEW NN ON N.ID = NN.ID;