2009-06-03 67 views
0

對於像這樣的訪問數據庫: (所有文字字段)複雜的訪問SQL查詢排除

 
Co1 Co2 Co3 Co4 
A k t N1 
B k t N2 
A m t N3 
B k z N4 
A k z N5 
C m t N6 
C k z N7 
C k t N8 
A k t N9 
C m t N10 

我需要建立某種形式的報告會做到以下幾點:

結果需要選擇行:

  1. 下令CO1第一
  2. 然後通過二氧化碳
  3. 訂購
  4. 只包括數據,其中的Co = T或R
  5. 時的Co不是T也不r,則與現有C04其中 CO1和CO2所有其它行中的相同的當前行也排除

1,2和3是非常容易(通過和地點分別句序),但 可以#4訪問SQL來完成呢? 如果不能,我會通過數據環路小C#應用程序,但我覺得這 必須能夠在SQL做的,如果它可以說肯定會好很多。

的實際查詢和數據庫更加複雜,但#4是我卡住。

隨着例如我給的結果將是:

 
A m t N3 
A k t N9 
C m t N6 
C m t N10 
C k t N8

我相信這涵蓋所有可能的情況。

精度,我們使用第四列(本例中爲C4)來確定訂單 ,但它是一個包含字符和數字的文本字段。 領域是一個字母后跟2個數字:A01,A02,A99 ...,B01等.. 精密#2,我不應該爲此負責數據庫設計的一個。 :P

所以,到SQL大師的我們之間,是否可以在訪問SQL做了什麼?怎麼樣?

非常感謝您提供的任何幫助。

+0

我不明白你的約束#4。你能重述嗎? 「那麼所有其他行與之前的C04」是什麼意思? – 2009-06-03 18:55:32

+0

@未知谷歌: 當他通過顛倒我的#4改善了我的#4的措辭時,Andomar非常正確:我們需要排除其後有一行的行,其中Co3不是t也不是r,而後面的行具有相同的行Co1和Co2 – 2009-06-03 19:28:19

回答

0

如果我正確地讀出你:

時的Co不是T也不是r,則所有 其他行與現有C04其中CO1 和CO2均同當前 行也排除

這相當於不包括其後面的行有一定的條件下存在的行。你可以用NOT EXISTS子句做到這一點:

select * 
from YourTable cur 
where cur.Co3 in ('t','r') 
and not exists (
    select * 
    from YourTable later 
    where cur.Co1 = later.Co1 
    and cur.Co2 = later.Co2 
    and later.Co3 not in ('t','r') 
    and CInt(Mid(later.Co4,2)) > CInt(Mid(cur.Co4,2)) 
) 
order by cur.Co1, cur.Co2 desc, CInt(Mid(cur.Co4,2)) 

現在N10通常不會大於N5。這就是CInt(Mid(...,2))的用途:它將N10轉換爲數字10,將數字N5轉換爲5.

+0

非常感謝Andomar,我不得不修改它,但總的來說,這正是我需要的。 – 2009-06-04 19:13:36

0

對Andomar查詢的修改,考慮到Co4中的值用不同的字母通過使用字符代碼的ASCII值來確定順序。我假設範圍是A01 ... A99,B01 ... B99等,並且B01應該被認爲比A99「晚」。

select * 
from Table1 cur 
where not exists (
    select 1 
    from Table1 later 
    where cur.Co1 = later.Co1 
    and cur.Co2 = later.Co2 
    and later.Co3 not in ('t','r') 
    and (asc(left(later.Co4,1)) * 100) + CInt(Mid(later.Co4,2)) > (asc(left(cur.Co4,1)) * 100) + CInt(Mid(cur.Co4,2)) 
) 
and cur.Co3 in ('t','r') 
order by cur.Co1, cur.Co2 
0

不是一個答案,但是,爲同胞回答者設置代碼。

create table #boost (
    Co1 char(1), 
    Co2 char(1), 
    Co3 char(1), 
    Co4 char(3) 
) 

insert into #boost values ('A', 'k', 't', 'N1') 
insert into #boost values ('B', 'k', 't', 'N2') 
insert into #boost values ('A', 'm', 't', 'N3') 
insert into #boost values ('B', 'k', 'z', 'N4') 
insert into #boost values ('A', 'k', 'z', 'N5') 
insert into #boost values ('C', 'm', 't', 'N6') 
insert into #boost values ('C', 'k', 'z', 'N7') 
insert into #boost values ('C', 'k', 't', 'N8') 
insert into #boost values ('A', 'k', 't', 'N9') 
insert into #boost values ('C', 'm', 't', 'N10')