iT邦幫忙

0

指定某幾個欄位 比較兩張相同欄位的Table內的資料的差異(SQL Server)

各位大神好:

現在有兩張相同欄位的資料表,資料表內容如下:

Table_1

https://ithelp.ithome.com.tw/upload/images/20210914/20123439r8ExN4pyaO.png

Table_2

https://ithelp.ithome.com.tw/upload/images/20210914/20123439xBgKwMP2Ok.png

請問要如何只針對 name 及 no 兩個欄位,去比較兩張資料表的差異,然後再將差異的資料 select 出 name , no , area , country (所有欄位)到新的 Table 。

使用 EXCEPT 及 INTERSECT 似乎都會針對所有欄位進行比對。

再麻煩各位大神求解了,感謝。

迷路 iT邦新手 5 級 ‧ 2021-09-15 08:44:29 檢舉
不明白如何比較
第一張表有一個小美2和一個小美7
第二張表有一個小美2和兩個小美7
所以比較的結果是?
他只要比較name,no差異
所以結果應該是這樣
小咚咚 8 台北 台灣
小宗 5 高雄 台灣
小泥 1 台中 台灣
阿明 6 東京 日本
5
rogeryao
iT邦大師 1 級 ‧ 2021-09-14 19:15:50
最佳解答
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

Demo
請參閱 : SQL Joins Explained (x-post r/SQL)

螃蟹哥一出手,便知有沒有
我嘗試去改下where AB name不相等 或 AB no不相等,發現只要有null是不能做判斷的,只會回傳false,又學了一課

0
jasonOuO
iT邦新手 5 級 ‧ 2021-09-14 18:12:45

粗淺的寫了一下,有錯還請不吝指正

環境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的結果是否是樓主想要的?

0
a243318490
iT邦新手 5 級 ‧ 2021-09-15 08:58:05

來個笨方法

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)
0
一級屠豬士
iT邦大師 1 級 ‧ 2021-09-15 11:01:16

使用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)

Demo

vfpmaster iT邦新手 5 級 ‧ 2021-09-17 15:09:06 檢舉

select * from table_1
where name+no+area+country not in(select name+no+area+country from table_2)
union
select * from table_2
where name+no+area+country not in(select name+no+area+country from table_1)

Demo

小美...
vfp , Visual FoxPro .... 😄

我要發表回答

立即登入回答