2013-07-22 46 views
2

我在SQL Server 2008下表,與醫院的ID及其部門:獲取列表SQL

HID DEPT 
5 neuro 
2 derma 
3 cardio 
2 ent 
1 neuro 
5 optha 
3 ent 
3 optha 
4 derma 
1 optha 
5 derma 

需要得到它不」的ID和部門名稱的列表有,使用SQL。 如:

HID DEPT 
1 derma 
1 cardio 
1 ent 
2 cardio 
2 neuro 
2 optha 

等謝謝

+1

你怎麼知道它沒有? –

回答

6

試試這個:

;WITH CTE AS 
(
    SELECT * 
    FROM ( SELECT DISTINCT HID 
      FROM YourTable) A 
    CROSS JOIN (SELECT DISTINCT DEPT 
       FROM YourTable) B 
) 
SELECT * 
FROM CTE A 
WHERE NOT EXISTS(SELECT 1 FROM YourTable 
       WHERE HID = A.HID AND DEPT = A.DEPT) 

Here is與演示的sqlfiddle。

+0

非常感謝Lamak。有效。你可以告訴我'從'選擇1'嗎? – Ruby

+2

@Ruby'EXISTS'驗證是否返回了一行,如果是「SELECT 1」,「SELECT *」,「SELECT NULL」或「SELECT whatevercolumn」,則無關緊要。我發現'SELECT 1'使得它更清晰,我不想從那個'SELECT'的任何列,我只是檢查存在 – Lamak

3

對於這種類型的查詢,你要開始一個「驅動程序」子查詢產生的所有可能的組合。然後,做一個left outer join到存在的,並選擇不匹配的:

select driver.hid, driver.dept 
from (select hid, dept 
     from (select distinct hid from hd) h cross join 
      (select distinct dept from hd) d 
    ) driver left outer join 
    hd 
    on driver.hid = hd.hid and 
     driver.dept = hd.dept 
where hd.hid is null; 

編輯:

這與數據修正查詢:

with hd as (
     select 5 as hid, 'neuro' as dept union all 
     select 2, 'derma' union all 
     select 3, 'cardio' union all 
     select 2, 'ent' union all 
     select 1, 'neuro' union all 
     select 5, 'optha' union all 
     select 3, 'ent' union all 
     select 3, 'optha' union all 
     select 4, 'derma' union all 
     select 1, 'optha' union all 
     select 5, 'derma' 
    ) 
select driver.hid, driver.dept 
from (select hid, dept 
     from (select distinct hid from hd) h cross join 
      (select distinct dept from hd)d 
    ) driver left outer join 
    hd 
    on driver.hid = hd.hid and 
     driver.dept = hd.dept 
where hd.hid is null; 

注意它會返回一個比問題長的列表。我認爲這份名單不完整。

+0

謝謝。它說:靠近')'[line5]附近的關鍵字交叉和附近語法時的語法不正確。還嘗試了'(從高清選擇不同的隱藏)交叉加入 (從高清選擇不同部門)....但給出了相同的錯誤 – Ruby

+0

@Ruby。 。 。錯誤消息是由於子查詢中缺少別名。 –

+0

謝謝戈登。 – Ruby

3

要的選項的詳細列表,這裏也是一個EXCEPT的解決方案:

SELECT h.HID, d.DEPT 
FROM  (SELECT HID FROM atable) h 
CROSS JOIN (SELECT DEPT FROM atable) d 
EXCEPT 
SELECT HID, DEPT 
FROM atable; 

根據多少次值在任一列是重複的,你也可以嘗試越過前加入唯一的值申請除外:

SELECT h.HID, d.DEPT 
FROM  (SELECT DISTINCT HID FROM atable) h 
CROSS JOIN (SELECT DISTINCT DEPT FROM atable) d 
EXCEPT 
SELECT HID, DEPT 
FROM atable;