2013-07-22 45 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;