2011-06-02 76 views
0

我有一個複雜的SQL查詢,寫了很多連接和條件。使用連接查詢過濾SQL查詢

ComplexQuery有幾列,最值得注意的列名是WeightCodeDrugName

[假設]:Select * from ComplexQuery

我有第二個表:Select DrugName from Table2

我的要求是這樣的方式,

如果WeightCode = 2,DrugName從ComplexQuery從表2匹配DrugName的前五個字母然後前五個字母應被刪除。

我很困惑接近..!我應該如何定義一個帶有過濾條件的單連接查詢?

回答

2

利用Case..When可以解決您的問題

SELECT column1, column2 
FROM TABLE 
WHERE 
column1 = 
    CASE @locationType 
     WHEN 'val1' THEN column1 
     WHEN 'val2' THEN column1 
    END 

注意:這僅僅是例子

+0

它真的是一個不完整的!我在期待可以幫助我一點的語法邏輯。 – goofyui 2011-06-02 20:39:59

+0

好吧等待幾分鐘我會過去的例子 – 2011-06-02 20:44:46

+0

select * from ComplexQuery其中WeightCode = 2和Left(DrugName,5)<>(在Table2中選擇Left(DrugName,5)) - 我的僞代碼 – goofyui 2011-06-02 21:06:39

0

您還可以使用子查詢與NOT INEXISTS

列出您想要在子查詢中排除的內容,並使用連接條件將其重新綁定到外部查詢。

I.E.

WHERE MainTableKey NOT IN (SELECT ForeignKey from MyTable2 
          WHERE DoNotInclude = 1) 

編輯:

替代的解決方案,使用EXCEPT

僞代碼將是:

SELECT col1, col2, col3 
FROM ComplexQuery 
EXCEPT 
SELECT Col1, Col2, Col3 
FROM MyTable t1 
INNER JOIN Table2 t2 
    ON LEFT(t1.Drugname, 5) = LEFT(t2.drugname, 5) 
    AND t1.WeightCode = 2 

除了去除第二結果從第一結果集設置。唯一的問題是你需要返回兩組中的相同字段,就像在UNION中那樣。

+0

我不會能夠使用SubQuery,光標!左(Table1.Drugname,5)=左(Table2.Drugname,5) - >某種邏輯,我期待 – goofyui 2011-06-02 20:39:01

+0

@Chok - 你能否澄清那個評論,我不確定這是什麼意思。 – JNK 2011-06-02 20:39:58

+0

你的僞代碼不攜帶子查詢或遊標語法! – goofyui 2011-06-02 21:06:15

0

所以,如果 ComplexQuery.WeightCode = 2,和如果 WeightCode.DrugName的前五個字母可以匹配來自Table2.DrugName任何記錄的前五個字母,您要刪除的第一個五年ComplexQuery.WeightCode中的字母?

如果是的話,試試這個:

SELECT cq.*, 
    CASE cq.WeightCode WHEN 2 THEN RIGHT(cq.DrugName, LEN(cq.DrugName)-5) ELSE cq.DrugName END DrugName 
FROM ComplexQuery cq 
    LEFT OUTER JOIN Table2 t 
     ON cq.WeightCode = 2 AND LEFT(cq.DrugName, 5) = LEFT(t2.DrugName, 5) 
+0

我認爲你很困惑。讓我解釋一下這個查詢。表1是ComplexQuery,表2是Table2.So,ComplexQuery.WeightCode = 2和Left(ComplexQuery.DrugName,5)= Left(Table2.DrugName,5),然後從ComplexQuery中刪除這些行 – goofyui 2011-06-02 20:45:13

+0

是否要物理刪除這些行來自底層表的行?或者只是將它們從ComplexQuery的結果中排除? – 2011-06-03 15:52:08

0

使用2個查詢和UNION ALL在一起的結果。

在第一個查詢中獲取WeightCode = 2的數據。執行連接和子字符串以返回您需要的結果。

第二個查詢獲取WeightCode!= 2所在的數據。以相同的順序返回相同的字段名稱和類型。

在它們之間放置一個聯合以將結果加入到一個結果集中。

+1

select * from ComplexQuery 其中WeightCode = 2 和Left(DrugName,5)<>(在Table2中選擇Left(DrugName,5)) – goofyui 2011-06-02 21:05:22