0

私は 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
    )

前もって感謝します。

4

1 に答える 1

0

B次のように選択することを検討してください。

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

を実行すると、からすべての行一致する行LEFT JOINが取得されます。の一致する行ごとに値が存在するため、複数の行の値が取得されることに注意してください。データは次のようになります。BEBE

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

である行は、そのに一致する行がないE.Field1ことをNULL意味します。対照的に、フィールドが重複しているように見えることに注意してください。そして、あるレベルではそうです。しかし、それは、それに一致するものが複数あるためです。EBBEB

これを簡単に抽象化して、サブクエリのグループ化と個別の操作を実行して、必要なものだけを確実に取得できるようにすることができますE。おそらく、次のような内部クエリを作成します。

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

これはほんの一例です。

于 2013-09-27T14:59:45.213 に答える