Board logo

主題: [DB] SQL 2008查詢條件的問題 修改問題 [打印本頁]

發表人: bobbook    時間: 2011-3-28 01:45 PM     主題: SQL 2008查詢條件的問題 修改問題

2011-03-29

總算解決了

TIPS

left join:       返回「表名1」的全部行,對於「表名2」中,不滿足on條件的記錄用空值替換。
rigth join:     返回「表名2」的全部行,對於「表名1」中,不滿足on條件的記錄用空值替換。

設定指定欄位 ISNULL查詢即可

2011-03-29

哈哈哈哈哈哈哈哈
寫程式寫太多阿達了
居然連敘述問題也敘述錯  抱歉

大家  
好久不見
廢業目前在一家NPO做MIS

目前被荼毒中......

OK...廢話不多說
這是這幾天廢業被荼毒的原因

目前有兩個TableA以及TableB

TableA紀錄訂單編號、數量、下訂日期......等等
TableB則紀錄訂單A.訂單編號的收費紀錄(如實收訂金以及實收租金......等等)

現在大頭出了一個問題
他要列出訂單編號、數量、下訂日期......等等條件作為查詢依據下
SQL如下(舉例)
SELECT dbo.TableA.*, dbo.TableB.* FROM dbo.TableA INNER JOIN dbo.TableB ON dbo.TableA.訂單編號 = dbo.TableB.訂單編號 WHERE + 程式的搜尋條件

大頭目前要在這個搜尋條件下
列出哪一筆訂單沒有收費紀錄

也就是在同一筆TableA的訂單編號下找TableA以及TableB中"TableA.訂單編號" <> EOF AND  "TableB.訂單編號" = EOF的條件下
列出所有TableA的的資料

這我要如何做呀

[bobbook 在  2011-3-29 11:00 AM 作了最後編輯]
發表人: shinnuei    時間: 2011-3-28 05:39 PM

where  a.訂單編號 = 條件值 and a.數量 = 條件值 and a.下訂日期 = 條件值
AND B.收費紀錄 = NULL

不知道對不對
發表人: bobbook    時間: 2011-3-28 05:43 PM


引用:
shinnuei寫到:
where  a.訂單編號 = 條件值 and a.數量 = 條件值 and a.下訂日期 = 條件值
AND B.收費紀錄 = NULL

不知道對不對


這個我試過了
得到的結果都是NULL
最主要是因為"B.收費紀錄 = NULL"

原因是大頭在作系統分析的時候設定
產生訂單不會對TableB有影響
除非交訂金或交租金

哈哈哈哈哈哈哈哈哈哈哈哈哈哈    淚流滿面中......

另外我有嘗試使用

[SQL 語句 1]
MINUS
[SQL 語句 2]

結果還是被打槍
SQL 2008里面把它當作兩個查詢條件來看
快哭死了

目前在跟大頭裝死......

[bobbook 在  2011-3-28 05:47 PM 作了最後編輯]
發表人: vivi123456    時間: 2011-3-28 08:00 PM

試試看吧
SELECT dbo.TableA.*, dbo.TableB.*
   FROM dbo.TableA
  INNER JOIN dbo.TableB ON dbo.TableA.訂單編號 = dbo.TableB.訂單編號
WHERE dbo.TableA.訂單編號 = 條件
     AND dbo.TableA.數量 = 條件
     AND dbo.TableA.下訂日期 = 條件值
     AND ISNULL(dbo.TableB.收費紀錄,'') = ''
發表人: aaronwang    時間: 2011-3-28 10:16 PM

應該是 TableB.收費紀錄 is NULL 不是 TableB.收費紀錄 = NULL
發表人: dayi    時間: 2011-3-28 10:55 PM

這很簡單啊

提示
用left, right
不要用inner
發表人: bobbook    時間: 2011-3-29 10:55 AM

感謝呀

我終於找到了

關鍵在於LEFT JOIN 以及TableB.訂單編號 ISNULL

目前在View底下已經可以找到正確的資料了

SQL

SELECT dbo.TableA.*,dbo.TableB.*
FROM dbo.TableA LEFT OUTER JOIN dbo.TableB ON dbo.TableA.訂單編號 = dbo.TableB.訂單編號
WHERE     (dbo.TableB.訂單編號 IS NULL)

總算可以把萬惡的不繳訂金以及租金的成員抓出來了

感謝各位的提醒以及解惑



TIPS

left join:       返回「表名1」的全部行,對於「表名2」中,不滿足on條件的記錄用空值替換。
rigth join:     返回「表名2」的全部行,對於「表名1」中,不滿足on條件的記錄用空值替換。

設定指定欄位 ISNULL查詢即可

[bobbook 在  2011-3-29 10:59 AM 作了最後編輯]
發表人: akbarchinaman    時間: 2011-4-2 03:35 PM

借用來問兩個問題:
1. 為什麼要用 Is NULL而不是 = NULL
2. SQL底下的萬用字元到底是%還是*?
發表人: chourain    時間: 2011-4-4 11:49 PM


引用:
akbarchinaman寫到:
借用來問兩個問題:
1. 為什麼要用 Is NULL而不是 = NULL
2. SQL底下的萬用字元到底是%還是*?


1.null這個值,在SQL中算是特殊的資料,不是''(空白)也不是0,是一個空的欄位型態,也就是說,這個欄位資料是不存在的,所以不能用=或其他方式來比對出來,所以用 is null 或isnull() 內建的判斷才能比對.
2.就自己所了解%這個是用在做where判斷是的萬用字元.如
where aaa like '%tw' 表示 找出所有aaa欄位 最後二個字是 tw的資料如 12tw,abctw,tw都會給比對出來.
where aaa like '%tw%' 表示 找出所有aaa欄位 只要有tw這二個字的資料如 12tw,abctw,tw123,tw,abtwsdfasdf1都會給比對出來.
而* 是用來設定要顯示所有資料表中的欄位
官方說明:指定應該傳回 FROM 子句中所有資料表和檢視的所有資料行
select * from abc
傳回所有abc這個資料表的欄位資料
所以*和%在用法上是不同的.

select a.*,b.欄位1 from a
inner join b on a.欄位1=b.欄位1 where b.欄位1 like '%tw'
這是說.傳回.所以a資料表的欄位資料及b資料表的欄位1資料,並在資料中篩選出符合b.欄位1中最後二個字是tw的所有資料
發表人: yfan    時間: 2011-5-18 06:55 AM

select A.*

from A

where A.id not in
(
  select b.id from B where B.amount>0
)
發表人: ma1111    時間: 2011-5-18 11:35 AM

設計schma時候,有些欄位特性一定會有值,請直接指定NOT NULL,
尤其是KEY Field,
否則app實作時,會多出很多特殊情況




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0