各位大神好:
現在有兩張相同欄位的資料表,資料表內容如下:
Table_1
Table_2
請問要如何只針對 name 及 no 兩個欄位,去比較兩張資料表的差異,然後再將差異的資料 select 出 name , no , area , country (所有欄位)到新的 Table 。
使用 EXCEPT 及 INTERSECT 似乎都會針對所有欄位進行比對。
再麻煩各位大神求解了,感謝。
CREATE TABLE TABLE_1 (
NAME NVARCHAR(10),
NO INT,
AREA NVARCHAR(10),
COUNTRY NVARCHAR(10));
INSERT INTO TABLE_1
VALUES(N'小明', 1, N'台中', N'台灣'),
(N'小美', 2, N'桃園', N'台灣'),
(N'小華', 3, N'台南', N'台灣'),
(N'小明', 4, N'台南', N'台灣'),
(N'小宗', 5, N'高雄', N'台灣'),
(N'阿明', 6, N'東京', N'日本'),
(N'小美', 7, N'台北', N'台灣');
CREATE TABLE TABLE_2 (
NAME NVARCHAR(10),
NO INT,
AREA NVARCHAR(10),
COUNTRY NVARCHAR(10));
INSERT INTO TABLE_2
VALUES(N'小明', 1, N'台中', N'台灣'),
(N'小美', 2, N'桃園', N'台灣'),
(N'小華', 3, N'台南', N'台灣'),
(N'小明', 4, N'台南', N'台灣'),
(N'小咚咚', 8, N'台北', N'台灣'),
(N'小美', 7, N'台北', N'台灣'),
(N'小美', 7, N'高雄', N'台灣'),
(N'小泥', 1, N'台中', N'台灣');
SELECT ISNULL(A.NAME,B.NAME) AS NAME,
ISNULL(A.NO,B.NO) AS NO,
ISNULL(A.AREA,B.AREA) AS AREA,
ISNULL(A.COUNTRY,B.COUNTRY) AS COUNTRY,
CASE WHEN B.NAME IS NULL THEN N'TABLE_1 不在 TABLE_2 內'
WHEN A.NAME IS NULL THEN N'TABLE_2 不在 TABLE_1 內' END AS 'DIFFERENCE'
FROM TABLE_1 AS A
FULL OUTER JOIN TABLE_2 AS B ON A.NAME=B.NAME AND A.NO=B.NO
WHERE A.NAME IS NULL OR A.NO IS NULL
OR B.NAME IS NULL OR B.NO IS NULL
粗淺的寫了一下,有錯還請不吝指正
環境MSSQL
Create table table_1(
name varchar(10),
no int,
area varchar(10),
country varchar(10)
)
Create table table_2(
name varchar(10),
no int,
area varchar(10),
country varchar(10)
)
insert into table_1
values('小明', 1, '台中', '台灣'),
('小美', 2, '桃園', '台灣'),
('小華', 3, '台南', '台灣'),
('小明', 4, '台南', '台灣'),
('小宗', 5, '高雄', '台灣'),
('阿明', 6, '東京', '日本'),
('小美', 7, '台北', '台灣')
insert into table_2
values('小明', 1, '台中', '台灣'),
('小美', 2, '桃園', '台灣'),
('小華', 3, '台南', '台灣'),
('小明', 4, '台南', '台灣'),
('小咚咚', 8, '台北', '台灣'),
('小美', 7, '台北', '台灣'),
('小美', 7, '高雄', '台灣'),
('小泥', 1, '台中', '台灣')
select tb2.name, tb2.no, tb2.area, tb2.country
from table_2 tb2
except
select tb1.name, tb1.no, tb1.area, tb1.country
from table_1 tb1
join table_2 tb2 on tb1.name = tb2.name and tb1.no = tb2.no
不知這最後select的結果是否是樓主想要的?
來個笨方法
SELECT *
FROM TABLE_1 AS A
WHERE NOT EXISTS(
SELECT *
FROM TABLE_2 AS B
WHERE A.NAME=B.NAME
AND A.NO=B.NO)
UNION
SELECT *
FROM TABLE_2 AS A
WHERE NOT EXISTS(
SELECT *
FROM TABLE_1 AS B
WHERE A.NAME=B.NAME
AND A.NO=B.NO)
使用PG13
create table it0915a (
id int generated always as identity primary key
, cname text
, cno int
, area text
, country text
);
insert into it0915a(cname, cno, area, country) values
('小明', 1, '台中', '台灣'),
('小美', 2, '桃園', '台灣'),
('小華', 3, '台南', '台灣'),
('小明', 4, '台南', '台灣'),
('小宗', 5, '高雄', '台灣'),
('阿明', 6, '東京', '日本'),
('小美', 7, '台北', '台灣');
create table it0915b (
id int generated always as identity primary key
, cname text
, cno int
, area text
, country text
);
insert into it0915b(cname, cno, area, country) values
('小明', 1, '台中', '台灣'),
('小美', 2, '桃園', '台灣'),
('小華', 3, '台南', '台灣'),
('小明', 4, '台南', '台灣'),
('小咚咚', 8, '台北', '台灣'),
('小美', 7, '台北', '台灣'),
('小美', 7, '高雄', '台灣'),
('小泥', 1, '台中', '台灣');
--
with t1 as (
select cname, cno
from it0915a
), t2 as (
select cname, cno
from it0915b
), t3 as (
select *
from t1
except
select *
from t2
), t3a as (
select a.cname, a.cno, area, country
, 'table1 only' as difference
from t3
join it0915a a
using (cname, cno)
), t4 as (
select *
from t2
except
select *
from t1
), t4a as (
select b.cname, b.cno, area, country
, 'table2 only' as difference
from t4
join it0915b b
using (cname, cno)
)
select *
from t3a
union all
select *
from t4a;
cname | cno | area | country | difference
--------+-----+------+---------+-------------
小宗 | 5 | 高雄 | 台灣 | table1 only
阿明 | 6 | 東京 | 日本 | table1 only
小咚咚 | 8 | 台北 | 台灣 | table2 only
小泥 | 1 | 台中 | 台灣 | table2 only
(4 rows)
寫入資料
CREATE TABLE #TBL1 (
NAME NVARCHAR(10),
NO NVARCHAR(10),
AREA NVARCHAR(10),
COUNTRY NVARCHAR(10),
);
CREATE TABLE #TBL2 (
NAME NVARCHAR(10),
NO NVARCHAR(10),
AREA NVARCHAR(10),
COUNTRY NVARCHAR(10),
);
INSERT INTO #TBL1 VALUES
(N'小明','1',N'台中',N'台灣'),
(N'小美','2',N'桃園',N'台灣'),
(N'小華','3',N'台南',N'台灣'),
(N'小明','4',N'台南',N'台灣'),
(N'小宗','5',N'高雄',N'台灣'),
(N'阿明','6',N'東京',N'日本'),
(N'小美','7',N'台北',N'台灣');
INSERT INTO #TBL2 VALUES
(N'小明','1',N'台中',N'台灣'),
(N'小美','2',N'桃園',N'台灣'),
(N'小華','3',N'台南',N'台灣'),
(N'小明','4',N'台南',N'台灣'),
(N'小咚咚','8',N'台北',N'台灣'),
(N'小美','7',N'台北',N'台灣'),
(N'小美','7',N'高雄',N'台灣'),
(N'小泥','1',N'台中',N'台灣');
比對兩表中,NAME
與NO
是相異的資料,並外掛其AREA
與COUNTRY
SELECT
ISNULL(A.NAME,B.NAME) NAME
,ISNULL(A.NO,B.NO) NO
,ISNULL(A.AREA,B.AREA) AREA
,ISNULL(A.COUNTRY,B.COUNTRY) COUNTRY
FROM #TBL1 A
FULL OUTER JOIN #TBL2 B
ON A.NAME = B.NAME
AND A.NO = B.NO
WHERE A.NAME IS NULL OR B.NAME IS NULL
NAME | NO | AREA | COUNTRY |
---|---|---|---|
小宗 | 5 | 高雄 | 台灣 |
阿明 | 6 | 東京 | 日本 |
小咚咚 | 8 | 台北 | 台灣 |
小泥 | 1 | 台中 | 台灣 |