create table it191211a (
id int not null primary key
);
create table it191211b (
id int not null primary key
);
insert into it191211a values
(1),(2),(3),(4),(5);
insert into it191211b
select id + 2
from it191211a;
select a.id
from it191211b b
, it191211a a
where a.id = b.id;
+----+
| id |
+----+
| 3 |
| 4 |
| 5 |
+----+
(3 rows)
若查詢的SQL Command 不出現等號 (=) , 能有哪些查詢方式呢??
感謝大家提供了許多答案,就不重複大家已經寫出來的了.
在此補充一個.
select a.id
from it191211b b
natural join
it191211a a;
+----+
| id |
+----+
| 3 |
| 4 |
| 5 |
+----+
(3 rows)
我唯一能想到的第一個方式就是in了。
其它方式還想不太到。
not雖然也是個方式,不過總結也是用in的方式。
啊,剛還有想到一招是用if的方式。不過這可能要試試就是了。
試了一下,用跑漏洞的方式
SELECT * FROM `db` where if(id>0 AND id<2,true,false)
這樣也是沒用到=。不過有點偷吃步的感覺
剛沒注意到要用上面的範例。如果是兩張表的話。因該有很多用法才對
SELECT * FROM `it191211a` join it191211b USING(id)
SELECT * FROM `it191211a` WHERE id IN (SELECT id FROM it191211b)
有些想法雖然可以達到效果,但考量效能問題就不用了。如 union 的方式
恩?不用等號的查詢方式?
like charindex 印象都可以用@@a
select a.id
from it191211b b
, it191211a a
where a.id like b.id;
select a.id
from it191211b b
, it191211a a
where charindex(',' + Convert(varchar,a.id) + ',' , ',' + Convert(varchar,b.id) + ',') > 0;
還有這個算不算..
select a.id
from it191211b b
, it191211a a
where not (a.id <> b.id);
沒想過的問題,感謝大大提供給大家思考
個人目前想到的方式 :
select id
from it191211b
where id in (select id from it191211a)
union
select id
from it191211a
where id in (select id from it191211b)
select a.id
from it191211b b
inner join it191211a a using (id)
交集用法: INTERSECT
從兩個資料表取出同時存在的記錄。
SELECT id FROM it191211a
INTERSECT
SELECT id FROM it191211b
這個讚 !
謝謝。剛好前陣子看到一篇文章提到,我才知道有這個語法。
INTERSECT 這還真的沒用過。
補充另一個語法:
差集用法: EXCEPT
只取出A資料表中不包含與B資料表內相同的資料。
SELECT id FROM it191211a as A
EXCEPT
SELECT id FROM it191211b as B
這可能還是需要比較一下效能的差異。畢竟用in的方式也是可以做到這樣的事。
但如果有這樣的新語法出來。(是新的語法嘛??我不確定)
理論上因該要比用in還要好才對。
我上次看到的文章是提到說,使用in,執行效率會不好。
我曾經有過一段語法,使用in進行查詢(非常大量的查詢),大約要13-15秒才有回應。
至於使用in的執行效率是否真的不好(也有可能是我的查詢語法寫的不好),可能要請教各位大神了。
in(小表)的效率比較好。但如果是大表就不建議用in
一般大表比較佳的方式用join或是子查尋處理過再做處理。
allenlwh iT邦研究生 3 級 ‧ 2019-12-11 13:43:42
謝謝。剛好前陣子看到一篇文章提到,我才知道有這個語法。
https://ithelp.ithome.com.tw/articles/10229333
是我寫的這篇嗎?
抱歉,不是。
我在一些情況下用了不少 EXCEPT
,跟大家分享一下我用的經驗。
它除了可以多欄位比較,還可以不指定欄位。
如果使用 in 或是 exists,則必須指定欄位。
但 EXCEPT
可以這樣用
SELECT * FROM TableA
EXCEPT
SELECT * FROM TableB
使用的情境是做單向資料複寫
因為要注意的是它是以 TableA 來判斷與 TableB 不同的資料,換句話說是:找出存在 TableA 之中,但不存在 TableB 之中的資料。
如果是
SELECT * FROM TableB
EXCEPT
SELECT * FROM TableA
就是:找出存在 TableB 之中,但不存在 TableA 之中的資料。
範列:(借用原PO的範列)
DECLARE @TableA table(
id INT NOT NULL PRIMARY KEY
);
DECLARE @TableB table(
id INT NOT NULL PRIMARY KEY
);
INSERT INTO @TableA
VALUES (1),(2),(3),(4),(5);
INSERT INTO @TableB
SELECT id + 2
FROM @TableA;
SELECT * FROM @TableA;
id
.....
1
2
3
4
5
SELECT * FROM @TableB;
id
.....
3
4
5
6
7
SELECT * FROM @TableA
EXCEPT
SELECT * FROM @TableB
id
.....
1
2
SELECT * FROM @TableB
EXCEPT
SELECT * FROM @TableA
id
.....
6
7
SELECT * FROM @TableB
INTERSECT
SELECT * FROM @TableA
id
.....
3
4
5
thwu 如果 tableA 和 tableB的Schema不相同,好像就不能使用了
//員工基本資料
create table Emp (
id int not null primary key,
name varchar(50) null
);
//禮金領取記錄
create table Emp_Gift (
id varchar(10) not null primary key,
pickdatetime datetime
);
insert into Emp values ('1','張三')
insert into Emp values ('2','李四')
insert into Emp values ('3','王五')
insert into Emp_Gift values ('2',getdate())
//查詢未領取禮金的員工
select id,name from Emp
EXCEPT
select id FROM Emp_Gift
使用 UNION、INTERSECT 或 EXCEPT 運算子結合的所有查詢,其目標清單中的運算式數量必須相等。
還可以用 regexp 不需要等號
(regexp不使用索引)
話說...為什麼不能用等號??
in、<>、like、regexp
union + in 、 inner join + using
INTERSECT、EXCEPT
我的最沒效率,又臭又長,但為了符合題旨,又要與眾不同,只有出此下策。
SELECT id
FROM (
SELECT id, 'a' AS yyy FROM it191211a
UNION SELECT id, 'b' AS yyy FROM it191211b
) c
GROUP BY id
HAVING length(group_concat( DISTINCT yyy ))>1
我們等樓主頒獎,我打算角逐【最佳劇組獎】我的道具最多,聽說是4K電視機一台。
哥哥你用的奇技淫巧,是看了什麼奇怪的東東...
SELECT id
FROM (SELECT id
, 'a' as yyy
FROM it191211a
UNION
SELECT id
, 'b' as yyy
FROM it191211b
) c
GROUP BY id
HAVING cardinality(array_agg(distinct yyy)) > 1;
+----+
| id |
+----+
| 3 |
| 4 |
| 5 |
+----+
(3 rows)
我是想說,多塞一點指令進去,顯得了比較有學問,您也沒有要求要有效能。