2013-04-01 97 views
0

我會保持這種簡單 - 我想知道是否有一種很好的方法來選擇列中的所有值,而不會在另一列中出現空值。例如。SQL(TSQL) - 在另一列不爲空的列中選擇值?

A  B 
----- ----- 

    1  7 
    2  7 
NULL  7 
    4  9 
    1  9 
    2  9 

從上面的設置我只想從9 B和沒有7,因爲7具有A的NULL很顯然,我可以換這是一個子查詢和使用IN子句等但這已經是一部分一個非常獨特的設置,並希望保持這種高效。

我要指出,我的目的,這將只是一個單向的比較......我只會在返回B值和審查A.

我想有一個簡單的方法來做到這一點,我很想念,但是現在我沒有看到它。

回答

1

你可以做這樣的事情:

select * 
from t 
where t.b not in (select b from t where a is null); 

如果你想只不同B值,那麼你可以做:

select b 
from t 
group by b 
having sum(case when a is null then 1 else 0 end) = 0; 

最後,你可以使用窗口功能:

select a, b 
from (select t.*, 
      sum(case when a is null then 1 else 0 end) over (partition by b) as NullCnt 
     from t 
    ) t 
where NullCnt = 0; 
+0

第二個例子非常適合我的目的!我應該指出,所有這些都是避免關係分工的一部分。 –

1

以下查詢將只在最終結果中輸出一列。記錄按列B分組,並測試記錄是否爲null或不。當記錄爲null時,該組的值將每次遞增1. HAVING子句僅過濾值爲0的組。

SELECT B 
FROM TableName 
GROUP BY B 
HAVING SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0 

如果要從記錄中獲取所有行,可以使用連接。

SELECT a.* 
FROM TableName a 
     INNER JOIN 
     (
      SELECT B 
      FROM TableName 
      GROUP BY B 
      HAVING SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0 
     ) b ON a.b = b.b 
相關問題