學習Microsoft SQL Server 2008技術內幕:T-SQL語法基礎--第4章

第4章 子查詢ide

4.2.1 Exist 謂語:post

use TSQLFundamentals2008
select * 
from Sales.Customers as C
where c.country=N'Spain'

select * 
from Sales.Customers as C
where c.country=N'Spain' and exists(select * from Sales.Orders as O where o.custid=C.custid)

select * 
from Sales.Customers as C
where c.country=N'Spain' and not exists(select * from Sales.Orders as O where o.custid=C.custid)
View Code

 

 4.3.2 連續聚和ui

select OBJECT_ID('Sales.OrderTotalsByYear')
if OBJECT_ID('Sales.OrderTotalsByYear') is not null  drop view Sales.OrderTotalsByYear

go
create view Sales.OrderTotalsByYear with schemabinding 
as 
  select 
    YEAR(o.orderdate) as orderyear,
    SUM(od.qty) as qty  
  from 
  Sales.Orders as o
    join Sales.OrderDetails as od on o.orderid=od.orderid
  group by YEAR(o.orderdate)
go
View Code

 查詢:spa

select O1.orderyear, o1.qty,
    (select  SUM(o2.qty) from 
      Sales.OrderTotalsByYear as o2
      where o2.orderyear <= o1.orderyear
    ) as runqty
from  Sales.OrderTotalsByYear as O1
order by o1.orderyear
View Code

4.3.3 行爲不當的子查詢code

SELECT custid, companyname
FROM Sales.Customers AS C
WHERE custid NOT IN(SELECT O.custid
                    FROM Sales.Orders AS O);
View Code

返回:blog

custid   companyname
22        Customer DTDMN
57        Customer WVAXSip

插入一條custid=NULL的記錄:ci

INSERT INTO Sales.Orders
  (custid, empid, orderdate, requireddate, shippeddate, shipperid,
   freight, shipname, shipaddress, shipcity, shipregion,
   shippostalcode, shipcountry)
  VALUES(NULL, 1, '20090212', '20090212',
         '20090212', 1, 123.00, N'abc', N'abc', N'abc',
         N'abc', N'abc', N'abc');
View Code
SELECT custid, companyname
FROM Sales.Customers AS C
WHERE custid NOT IN(SELECT O.custid
                    FROM Sales.Orders AS O);
View Code

返回0行qt

緣由:it

      NOT(22=1 Or 22=2 Or 22=NULL)

      NOT(False or False Or UnKnown)

      NOT UnKnow

      Unknow

      查詢條件過濾UnKnown

而:

SELECT custid, companyname
FROM Sales.Customers AS C
WHERE  not exists (SELECT *
                    FROM Sales.Orders AS O where C.custid=O.custid);
View Code

SELECT custid, companyname
FROM Sales.Customers AS C
WHERE custid NOT IN(SELECT O.custid
                    FROM Sales.Orders AS O where O.custid is NOT null);
View Code

 

返回:

custid   companyname22        Customer DTDMN57        Customer WVAXS

相關文章
相關標籤/搜索