2012-12-26 67 views
1

我有兩個查詢,在同一張表上做相同的條件選擇。你能幫我解決這個重複問題嗎?如何刪除此SQL子句重複?

if exists(select count(1)  
       from (<table>) t 
       where (<condition>) 
       having count(1) = 1) 
    set @yes = 1  

if @yes = 1  
    select @x = X 
     from (<table>) t 
     where (<condition>) 
+0

您可以添加具有預期結果的樣本記錄嗎? –

回答

1

請檢查U是否意味着這樣的:

select 
     @x = X 
    from 
     (<table>) t 
    where 
     (<condition>) 
    group by X 
    having count(*) = 1 

OR

select 
    @x = X 
from(
    select 
     count(*) over() cnt, X  
    from 
     (<table>) t 
    where 
     (<condition>) 
)a 
WHERE a.cnt=1 
+0

如果我理解了正確的問題,那麼根據,具有*不同*'X'的多行合格時將失敗。 –

+0

您是否添加了GROUP BY,因爲「列'X'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。」? – SKINDER

+0

@ErwinBrandstetter我猜即使SKINDER的示例查詢也會有同樣的問題。 SKINDER - 是 – TechDo

1

EXISTS可以作爲只是另WHERE條件:

SELECT @x = X 
FROM <table> t 
WHERE <condition> 
AND EXISTS (
    SELECT 1 
    FROM <table> t1 
    WHERE <condition> 
    HAVING count(*) = 1 
    ); 

基本上它選擇來自<table>X僅當存在只有排出線
或(可能更快):

SELECT @x = X 
FROM <table> t 
WHERE <condition> 
AND NOT EXISTS (
    SELECT 1 
    FROM <table> t1 
    WHERE <condition> 
    AND t1.id <> t.id  -- no other row satisfies same conditions 
    ); 

id是主密鑰或<table>
反向邏輯:只選擇合格行,如果沒有其他行合格

+0

看來這是正確的事情... – SKINDER

+0

是的,它是同一張桌子。 – SKINDER

0

如果你的表沒有空,你可以使用此查詢 'X' 領域:

SET @x = null 

SELECT @x = X 
     FROM (<table>) t 
     WHERE (<condition>) 
IF (@x IS NOT NULL) BEGIN SET @yes = 1 END 
+0

如果

只包含需要的一行,則需要得到X SKINDER

2

你代碼相當於:

select @yes = 1,@x=max(X) from (<table>) t 
     where (<condition>) 
     having count(1) = 1 
+0

如果我們有0或2行需要,則@x應該爲空 SKINDER

+0

在這種情況下它將爲NULL(儘快@yes也將爲NULL)。嘗試運行此查詢。 – valex