① sql如何比較兩個表數據是否一致
1、創建兩張測試表;create table test_aa(id number);
create table test_bb(id number);
② SQL如何對2個表的數據進行對比
a表與b表通過哪個欄位可以關聯起來,關系是1對多還是多對多
select * from tablesA a
left join tablesB b on a.xx=b.xx
where a.xx1=b.xx1
類似這種
③ sql 中如何比較數據,並返回一個結果,簡單語句能實現嘛,存儲過程能實現嘛,詳細如下
1.
1條sql語句能寫,只是分支太多,語句效率估計會慢死。
(1)三表關聯(新糧表,化驗單,檢驗單,根據grainID關聯),組成一個新的有別名的臨時表。
(select語句) as XX
根據grainID的相同的關系,找到你要的數據,比如新糧表的grainType,檢驗單的 testResult等。
(2)上面的XX臨時表與制度表關聯(根據grainType)
按照你的說法,項目一共有,蟲蝕,病斑,破碎,生芽,發霉,損傷六項,必須全部合格,才顯示testResult,否則顯示「某某不合格」,那麼就存在一個問題,如果有兩項或者三項不合格,那麼是不是兩項或者三項都要顯示,如果這樣的話,那麼case when的分支就要寫的非常多,是一個組合的關系,有一項不合格的有6個,有兩項不合格的有15個,有三項不合格的有30個,四項15種,5項6種,6項1種,再加上合格的1種情況,加起來case when 要寫1+6+15+20+15+6+1=64種情況,那麼這條語句會很長,而且運行起來真的很慢。
如果只是每次找出一個就行,那麼就可能會出現這次是蟲蝕不合格,下次是病斑不合格這種可能,這樣也不太好,個人覺得最好一次說明白。
2.存儲過程怎麼辦
存儲過程自己實現的話,那麼和上面的一條語句差不多,也是比較麻煩的,畢竟他要返回所有可能的結果,然後反饋給前台,這樣的話,其實和一條語句差不太多。
3.個人認為比較靠譜的辦法
也是存儲過程的,但是並不是用存儲過程輸出全部結果,只輸出對比結果,比如(僅為舉例)輸出一個結果集(010100),那麼前台就可以解讀這個字元串為「病斑生芽不合格」,這樣速度就會快很多。
④ 如何比較兩個SQL資料庫的欄位差別
不同的表及不同的欄位,我做過這樣的介面程序。我當時的方案大致如下:首先,建立關鍵業務表的觸發器,當發生變化時,將插入或修改分別觸發到一個臨時表中。然後,用設計的第3方程序,讀取臨時表,根據臨時表中記錄的是插入標志還是修改標志,分別寫入另一個資料庫的對應表中。反之,從另一資料庫寫到這個資料庫方式相同。不知表達明白沒有。
⑤ SQL資料庫比較
如果是結構改變,網上有很多比較的sql語句,就是把每種對象有不同的比較語句,如果只是數據有變動,可以寫存儲過程一個個的比較.這些比較都很麻煩
但我想你為什麼要比較呢,是為了使用新的結構和最新的數據對嗎?
如果是這樣,你可以把最新的結構導成腳本執行,生成一個新的只有最新結構的資料庫,然後你在把你的最新的數據導進來,然後把這個資料庫做為使用資料庫,我認為這樣比較方便,中斷時間比較少.
希望對你有幫助
下面是我給你找的表結構比較腳本:
/*--比較兩個資料庫的表結構差異
--*/
/*--調用示例
exec p_comparestructure 'xzkh_model','xzkh_new'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_comparestructure]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[p_comparestructure]
GO
create proc p_comparestructure
@dbname1 varchar(250), --要比較的資料庫名1
@dbname2 varchar(250) --要比較的資料庫名2
as
create table #tb1(表名1 varchar(250),欄位名 varchar(250),序號 int,標識 bit,主鍵 bit,類型 varchar(250),
佔用位元組數 int,長度 int,小數位數 int,允許空 bit,默認值 varchar(500),欄位說明 varchar(500))
create table #tb2(表名2 varchar(250),欄位名 varchar(250),序號 int,標識 bit,主鍵 bit,類型 varchar(250),
佔用位元組數 int,長度 int,小數位數 int,允許空 bit,默認值 varchar(500),欄位說明 varchar(500))
--得到資料庫1的結構
exec('insert into #tb1 SELECT
表名=d.name,欄位名=a.name,序號=a.colid,
標識=case when a.status=0x80 then 1 else 0 end,
主鍵=case when exists(SELECT 1 FROM '+@dbname1+'..sysobjects where xtype=''PK'' and name in (
SELECT name FROM '+@dbname1+'..sysindexes WHERE indid in(
SELECT indid FROM '+@dbname1+'..sysindexkeys WHERE id = a.id AND colid=a.colid
))) then 1 else 0 end,
類型=b.name, 佔用位元組數=a.length,長度=a.prec,小數位數=a.scale, 允許空=a.isnullable,
默認值=isnull(e.text,''''''),欄位說明=isnull(g.[value],'''''')
FROM '+@dbname1+'..syscolumns a
left join '+@dbname1+'..systypes b on a.xtype=b.xusertype
inner join '+@dbname1+'..sysobjects d on a.id=d.id and d.xtype=''U'' and d.name<>''dtproperties''
left join '+@dbname1+'..syscomments e on a.cdefault=e.id
left join '+@dbname1+'..sysproperties g on a.id=g.id and a.colid=g.smallid
order by a.id,a.colorder')
--得到資料庫2的結構
exec('insert into #tb2 SELECT
表名=d.name,欄位名=a.name,序號=a.colid,
標識=case when a.status=0x80 then 1 else 0 end,
主鍵=case when exists(SELECT 1 FROM '+@dbname2+'..sysobjects where xtype=''PK'' and name in (
SELECT name FROM '+@dbname2+'..sysindexes WHERE indid in(
SELECT indid FROM '+@dbname2+'..sysindexkeys WHERE id = a.id AND colid=a.colid
))) then 1 else 0 end,
類型=b.name, 佔用位元組數=a.length,長度=a.prec,小數位數=a.scale, 允許空=a.isnullable,
默認值=isnull(e.text,''''''),欄位說明=isnull(g.[value],'''''')
FROM '+@dbname2+'..syscolumns a
left join '+@dbname2+'..systypes b on a.xtype=b.xusertype
inner join '+@dbname2+'..sysobjects d on a.id=d.id and d.xtype=''U'' and d.name<>''dtproperties''
left join '+@dbname2+'..syscomments e on a.cdefault=e.id
left join '+@dbname2+'..sysproperties g on a.id=g.id and a.colid=g.smallid
order by a.id,a.colorder')
--and not exists(select 1 from #tb2 where 表名2=a.表名1)
select 比較結果=case when a.表名1 is null and b.序號=1 then '庫1缺少表:'+b.表名2
when b.表名2 is null and a.序號=1 then '庫2缺少表:'+a.表名1
when a.欄位名 is null and exists(select 1 from #tb1 where 表名1=b.表名2) then '庫1 ['+b.表名2+'] 缺少欄位:'+b.欄位名
when b.欄位名 is null and exists(select 1 from #tb2 where 表名2=a.表名1) then '庫2 ['+a.表名1+'] 缺少欄位:'+a.欄位名
when a.標識<>b.標識 then '標識不同'
when a.主鍵<>b.主鍵 then '主鍵設置不同'
when a.類型<>b.類型 then '欄位類型不同'
when a.佔用位元組數<>b.佔用位元組數 then '佔用位元組數'
when a.長度<>b.長度 then '長度不同'
when a.小數位數<>b.小數位數 then '小數位數不同'
when a.允許空<>b.允許空 then '是否允許空不同'
when a.默認值<>b.默認值 then '默認值不同'
when a.欄位說明<>b.欄位說明 then '欄位說明不同'
else '' end,
*
from #tb1 a
full join #tb2 b on a.表名1=b.表名2 and a.欄位名=b.欄位名
where a.表名1 is null or a.欄位名 is null or b.表名2 is null or b.欄位名 is null
or a.標識<>b.標識 or a.主鍵<>b.主鍵 or a.類型<>b.類型
or a.佔用位元組數<>b.佔用位元組數 or a.長度<>b.長度 or a.小數位數<>b.小數位數
or a.允許空<>b.允許空 or a.默認值<>b.默認值 or a.欄位說明<>b.欄位說明
order by isnull(a.表名1,b.表名2),isnull(a.序號,b.序號)--isnull(a.欄位名,b.欄位名)
go
⑥ plsql怎麼對比兩個資料庫的表
將兩個表做差。 select 列1,列2...列n from A minus select 列1,列2...列n from B 結果就是A表裡有B表裡沒有的。
⑦ 我有兩個SQL資料庫,A和B,如果對比它兩個的不同
SELECT TABLE_NAME+'.'+COLUMN_NAME as lie FROM INFORMATION_SCHEMA.COLUMNS
這句話是查詢出資料庫的所有列名,2個資料庫都執行一次,然後放到excel中
=IF(COUNTIF(行,列)=0,"不重復","")這樣就能找出新增的列啦,然後在進行排序
大功告成,C列顯示不重復的A列就是我們的新增列
⑧ 用sql語句比對2個表A和表B,並將比對出不同的數據存放在表C中,表A,B,C所以的列都是一樣的,跪求。。。。
都幾個列啊,列名都什麼啊?要不沒法寫呀
而且不一樣的,是A與B只要不一樣都插入C里嗎?還是只插A里有的,B里無的;或者B里有的,A里無的?
哎我,樓下那大哥,我估計人家用的不是oracle
----補充----
假設三個表都有欄位1,欄位2兩個欄位
你要插入的是,A,B都完全不相同的數據
insert into c
select a.欄位1,a.欄位2 from a,(select a.欄位1,a.欄位2 from a,b where a.欄位1=b.欄位1 and a.欄位2=b.欄位2) as d
where a.欄位1<>d.欄位1 and a.欄位2<>d.欄位2
union all
select b.欄位1,b.欄位2 from a,(select a.欄位1,a.欄位2 from a,b where a.欄位1=b.欄位1 and a.欄位2=b.欄位2) as d
where a.欄位1<>d.欄位1 and a.欄位2<>d.欄位2
⑨ sql怎樣對比兩個相同資料庫的存儲過程
select name from sys.objects where type='p'可以查處本資料庫下的所有資料庫名,同樣在另外資料庫下也能查到另外資料庫下的存儲過程,可以通過跨數據連接查詢,進行對比