SQL - 根据另一个表中的字段值排除行

时间:2014-10-24 17:26:02

标签: sql oracle

我很难根据另一个表中的字段值排除内部联接表中的整行。这就是我的意思:

不同的ID(TableA内部联接表B)

    ID    |     Date     |    Bldg_Nbr   
----------+--------------+------------------
     1    |  10/20/2014  |       92       
     2    |  10/20/2014  |       92      
     3    |  10/20/2014  |       92       
     4    |  10/20/2014  |       92       
     5    |  10/20/2014  |       92       

代码表(TableC)

    ID    |     Date     |    Code    |    Bldg_Nbr   
----------+--------------+------------+----------------
     1    |  10/20/2014  |     11     |       92
     1    |  10/20/2014  |     02     |       45
     3    |  10/20/2014  |     15     |       85
     3    |  10/20/2014  |     95     |       66
     4    |  10/21/2014  |     11     |       92

我想要做的是排除内部连接表中具有代码11的ID行,代码表中列出了相同的日期和bldg编号(TableC)。请注意,代码表(TableC)可以具有包含许多不同代码且具有相同日期和/或bldg的ID。在这个例子中,我希望ID 1被排除,但不是ID 4,因为它有不同的日期。

这是第一个表(TableA Inner Join TableB)的代码;我只需要结合TableC约束:

SELECT DISTINCT 
          I.DATE,
          I.BLDG_NBR,
          I.ID
FROM TableA I 
INNER JOIN TableB D ON I.ID = D.ID  
WHERE I.DATE = '20-OCT-2014' AND I.BLDG_NBR = 92 

2 个答案:

答案 0 :(得分:0)

这将排除Inner表中代码表中具有bldg_nbr和date的代码11行:

SELECT DISTINCT 
    I.DATE, 
    I.BLDG_NBR, 
    I.ID    
FROM TableA I INNER JOIN TableB D 
    ON I.ID = D.ID
    AND I.Bldg_Nbr = D.Bldg_Nbr
    AND I.Date = D.Date
    AND D.Code != 11

WHERE I.DATE = '20-OCT-2014' 
AND I.BLDG_NBR = 92 

答案 1 :(得分:0)

SELECT DISTINCT I.DATE, I.BLDG_NBR, I.ID
FROM TableA I
     INNER JOIN TableB D ON I.ID = D.ID
WHERE I.DATE = TO_DATE('20-10-2014', 'DD-MM-YYYY') AND I.BLDG_NBR = 92 
  AND NOT EXISTS (SELECT 1 FROM TableC C WHERE C.ID = I.ID AND I.DATE = C.DATE AND I.BLDG_NBR = C.BLDG_NBR AND C.CODE = 11)