SQL SERVER中,條件陳述式中的子查詢語句的文法沒有檢查

來源:互聯網
上載者:User
create table tb1(id int identity(1,1),name varchar(10),remark varchar(50) default '');
create table tb2(xid int identity(1,1),name varchar(10));

insert into tb1(name)
select 'a'
union all select 'b'
union all select 'c'
insert into tb2(name) select 'x'

select * from tb1 where id in(select id from tb2)
select * from tb1 where id in(select xid from tb2)

drop table tb1
drop table tb2;

結果是:
id          name      remark
----------- ---------- --------------------------------------------------
1          a         
2          b         
3          c         

id          name      remark
----------- ---------- --------------------------------------------------
1          a        

從這段指令碼執行後,就可以發現問題:
為何select * from tb1 where id in(select id from tb2)在執行的時候不對條件中的子查詢語句做語法檢查呢?而且預設的等價於1=1呢?

而且,select * from tb1 where id  in(select id from tb2 where id=1)會按照select * from tb1 where id  in(select xid from tb2 where xid=1)來執行,這說明子查詢語句的文法沒有被檢查,但是過濾卻起到了作用,這的確是很奇怪的事情。

如果我在敲sql語句的時候誤把 select * from tb1 where id in(select xid from tb2)中的select xid敲成select id,那麼取出的資料就會有問題(全取出),但是卻得不到提示,因為語法檢查跳過了。所以,這個在寫sql語句的時候,就是一個潛在的泥坑。

據說在oracle中也存在類似的問題,沒有試。

大家在寫sql指令碼時,還是要謹慎啊,因為今天早上我的sql就出現了這樣的問題,謹記教訓啊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.