从一个表中选择第二个表中不可用的行

时间:2013-05-31 09:05:28

标签: sql oracle

我需要一个查询,我可以在一个表中选择不在另一个表中的记录

我有2张桌子

TABLE 1: LOGS
TABLE 2: MASTER LIST

Logs =记录日志
主列表=所有注册名称的列表。

示例:

LOGS
HOST | USER | NAME
==================
1    | A    | A1 
1    | A    | A1
1    | A    | A1
1    | A    | D1

MASTER
HOST | USER | NAME
===================
1    | A    | A1
1    | A    | B1
1    | A    | C1

结果应该是:

HOST | USER | NAME
==================
1    | A    | D1

选择表2中未包含的行:Masterlist。

2 个答案:

答案 0 :(得分:2)

只需使用LEFT JOIN,就像这样:

   SELECT L.* 
     FROM Logs L
LEFT JOIN Master M
       ON L.Name = M.Name
     WHERE M.Name IS NULL

结果:

╔══════╦══════╦══════╗
║ HOST ║ USER ║ NAME ║
╠══════╬══════╬══════╣
║    1 ║ A    ║ D1   ║
╚══════╩══════╩══════╝

此处WHERE M.Name IS NULL排除了两个表中常见的所有记录。

请参阅this SQLFiddle

答案 1 :(得分:-1)

select * from table1 
where not exists
(
  select host, user, name
  from table2
  where table2.host = table1.host and 
        table2.user = table1.user and 
        table2.name = table1.name
)