从表B中选择表E - 从B中拉出E中存在和不存在的记录

时间:2013-09-27 14:56:03

标签: sql sql-server

我有2张桌子 - E& B由列Breaktime链接。表B包含所有可用时间并将它们提供给表E.如果表E没有使用时间,则表E中不再显示该时间的记录。我需要从E中选择*以获得使用时间但是需要不使用的时间不在E但在B中,并标记为"未使用"。查询有很多参数,所以这里是短版本:

SELECT 
    e.BreakDate, b.Breaktime,
        (CASE WHEN...) to separate the times into categories
FROM
    event e, break b, *several more tables*
WHERE
    e.breakdate = b.breakdate
and e.breaktime = b.breaktime
and *linking additional tables*

我尝试过使用

WHERE NOT EXISTS (SELECT e.breaktime FROM E,B WHERE e.breaktime = b.breaktime) 

我尝试使用

IF EXISTS (
    SELECT e.breaktime
    FROM E,B
    WHERE e.breaktime = b.breaktime
) THEN (
    SELECT b.breaktime
    FROM E,B
    where NOT EXISTS (
        SELECT *
        FROM E,B
        WHERE e.breaktime = b.breaktime
    )

提前致谢。

1 个答案:

答案 0 :(得分:0)

考虑从B中选择:

SELECT ...
FROM B
    LEFT JOIN E ...

通过执行LEFT JOIN,您将从B获得所有行,并从E获得匹配行。请记住,您将获得多个B值,因为它们将存在于E中的每个匹配行。数据可能如下所示:

B.Field1          B.Field2          E.Field1
============================================
1                 A                 NULL
2                 B                 Value 1
2                 B                 Value 2

E.Field1NULL的行表示EB匹配行。相比之下,请注意B字段似乎重复。在某种程度上他们是。但那是因为E多个匹配B

您现在可以轻松地将这一点抽象出来,即使只是在精神上,您可以对可以对子查询进行分组和不同操作的地方进行抽象,以确保您只从E得到您想要的内容。也许你做这样的内部查询:

SELECT ...
FROM E
WHERE E.field IN (
    SELECT e.field
    FROM B
        LEFT JOIN E ...
    GROUP BY ....
)

这只是一个例子。