1樓:匿名使用者
首先,在sql中(以sql server為例),查詢存在一個表而不在另一個表中的資料記錄的方法有很多,介紹其中4種:
1、方法一(僅適用單個欄位):使用 not in ,比較容易理解,缺點是效率低
如:select a.id from a where a.id not in (select id from b);
2、方法二(適用多個欄位匹配):使用 left join...on... , "b.id isnull" 表示左連線之後在b.id 欄位為 null的記錄。
如:select a.id from a left join b on a.id=b.id where b.id is null ;
3、方法三(適用多個欄位匹配)
如:select * from b where (select count(1) as num from a where a.id = b.id) = 0;
4、方法四(適用多個欄位匹配)
如:select * from a where not exists(select 1 from b where a.id=b.id)
接著,我們來分析你的sql語句為什麼返回資料不準確的原因。
從你的sql基礎語句來看,你使用了方法一和方法四這兩種,兩種語法本身都是正確的,但是卻沒有達到預期的效果,初步分析,問題可能出在gsdj和swdj這兩張表的qymc欄位的判斷比較上。
舉個例子:'企業名稱'和'企業名稱 '這兩個字串看似相同,實際卻並不相同,因為第二個“企業名稱 ”的後面跟了一個空格字元。就因為這個空格字元導致這個"'企業名稱'='企業名稱 '"等式不成立。
考慮到你qymc這個欄位的型別是字元型,建議你在原有sql基礎上做一個微調如下:
select * from gsdj gs where not exists (select * from swdj sw where rtrim(ltrim(sw.qymc )) )=rtrim(ltrim(gs.qymc )));
其中ltrim()可以去除左側空格,rtrim()可以去除右側的空格,也就是說我們是對去除空格後的企業名稱進行比較,排除了空格的干擾。
擴充套件資料:
在sql中,對於字元型文字資料,經常需要用到去空格的操作,對oracle資料來說可以通過trim()函式來簡單實現,而sql server中並沒有trim()函式,只有ltrim()和rtrim()兩個函式。
sql 中使用ltrim()去除左邊空格 ,rtrim()去除右邊空格 ,沒有同時去除左右空格的函式,要去除所有空格可以用replace(字串,' ',''),將字串裡的空格替換為空。
例:去除空格函式
declare @temp char(50)
set @temp = ' hello sql '
print ltrim(@temp) --去除左邊空格
print rtrim(@temp) --去除右邊空格
print replace(@temp,' ','') --去除字串裡所有空格
print @temp
>> 輸出結果
hello sql
hello sql
hellosql
hello sql
2樓:妗妗歘歘
我有兩張表如何查詢在一個表姑在另一個表中的資料
3樓:煙染暖陽
select * from swdj where qymc not in (select qymc from gsdj)
4樓:匿名使用者
select * from gsdj t1 where not exists (select * from swdj where qymc=t1.qymc )
5樓:匿名使用者
select * from gsdj gsdj where gsdj.qymc not in (select swdj.qymc from swdj swdj) 或者
select * from gsdj gs where not exists (select * from swdj sw where sw.qymc=gs.qymc )
試試加上表別名
6樓:丶我是週週
select * from gsdj where gsdj.qymc =swdj.qymc and gsdj.
qymc not in (select swdj.qymc from swdj )這兩個表之間必須要有一個相連線的列
7樓:匿名使用者
select * from gsdj where not exists (select * from swdj where gsdj.qymc=swdj.qymc)
8樓:鎖映僪鶴騫
只需判斷一下即可,根據你的題目意思應該是a表的id和b表的id相關聯。
select *, case when (select count(*) from b where id = a.id)>0 then 1 else 0 end as flag from a如果你是想a表和b表的欄位和id這兩列都一樣,才將flag顯示為1的話,用下面的查詢:
select *, case when (select count(*) from b where id = a.id and 欄位 = a.欄位)>0 then 1 else 0 end as flag from a
在excel中如何查詢字段對應的多個欄位的內容
1 首先以乙個簡單的例子做示範,列數相對較少,看起來也比較清楚 在奧運會或其他比賽上可以看到各個國家的獎牌數的變化 2 用到的函式是vlookup,它是乙個縱向查詢函式,通過按列查詢返回該列查詢列序所對應的值 可以直接在單元格輸入 vlookup 此時excel就會提示4個引數 也可以在空白欄處點選...
access資料庫如果a表中a欄位等於b表中b欄位則
璀璨星空 你的資料庫設計不合理,aa c 警察 王剛 警察 李明 b b不應該有c欄位b警察 小偷類似的方法應該用 left join 左連線,是和一對多的情況 select a.a,a.c from a left join b where a.a b.a 解0人 這個用vba去做好點 用vba寫自...
access中如何查詢字母與數字的組合
大魔王愛詩書 假設 查詢 欄位值為 9abc 的欄位,sql 語句寫法select 欄位 from 表名 where 欄位 like 0 9 a z 萬用字元意義 表示匹配任意字元,一個或多個範圍內的任意一個 0 9 從0到9的任意一個 a z 從a z 的任意一個 希望對你有用。 在查詢之中,是根...