3

私はテーブルA、B、Cを持っています

B は A と多対 1 で関連付けられている

CがBの完全なサブセットであるすべてのAを見つけたい.

次の LINQ クエリ (疑似コード) は、取得したいものを表しています。

class A
{
    public B[] Bs { get; set; }
}

class B
{
    public string Text { get; set; }
}

class C
{
    public string Text { get; set; }
}

private static IEnumerable<A> Search(C[] C, A[] A)
{
    return from a in A
            where C.All(c => a.Bs.Any(b => SomeCondition(b, c)))
            select a;
}

private static bool SomeCondition(B b, C c)
{
    //There we comparing B and C
    throw new NotImplementedException();
}

次のテーブル構造があります

A ( a_ID INT PRIMARY KEY )
B ( b_ID INT PRIMARY KEY, a_ID INT, Text NVARCHAR(MAX) )
C ( c_ID INT PRIMARY KEY, Text NVARCHAR(MAX) )

B がすべての C に一致するすべての A を取得する必要があります。

A | a_ID |
  | 1    |
  | 2    |
  | 3    |

B | b_ID | a_ID | Text  |
  | 1    | 1    | Cat   |
  | 2    | 1    | Dog   |
  | 3    | 1    | Rabbit| 
  | 4    | 2    | Cat   | 
  | 5    | 2    | Cat   | -- B can contain duplicates
  | 6    | 2    | Rabbit|

C | c_ID | Text |
  | 1    | Cat  |
  | 2    | Dog  |

出力

| a_ID |
| 1    |
4

2 に答える 2

1

UPDATED3:個別の c_id を数えます

SELECT b.a_id
  FROM b
  JOIN c ON b.Text = c.Text
GROUP BY b.a_id
HAVING COUNT(distinct c.c_id) = (SELECT COUNT(*) FROM C)

出力:

| A_ID |
--------
|    1 |

ここにsqlfiddleの例があります

于 2013-03-07T03:00:25.983 に答える
0

わかりました、私はそれを作る方法を理解しました。

x=>x.All(e => predicate(e))それがに変換できると仮定してx=>!x.Any(e => !predicate(e))

元の式を次の式に変換できます

from a in A
where !C.Any(c => !a.Bs.Any(b => SomeCondition(b, c)))
select a;

existsキーワードを使用してSQLに変換できます

SomeCondition私はそれがちょうど等しいと仮定します

最初!a.Bs.Any(b => SomeCondition(b, c))にSQLに変換する

NOT EXISTS (
    SELECT 1 FROM B b
        WHERE a.a_id = b.a_id -- a will be added later
          AND c.Text = b.Text -- c will be added later
)

次の変換!C.Any(c => !a.Bs.Any(b => SomeCondition(b, c)))

NOT EXISTS (
    SELECT 1 FROM C c
    WHERE NOT EXISTS (
        SELECT 1 FROM B b
        WHERE a.a_id = b.a_id -- a will be added later
          AND c.Text = b.Text
    )
)

そして最後に全体の表現

SELECT * FROM A a
WHERE NOT EXISTS (
    SELECT 1 FROM C c
    WHERE NOT EXISTS (
        SELECT 1 FROM B b
        WHERE a.a_id = b.a_id
          AND c.Text = b.Text
    )
)

これで、いくつかの最適化を行うことができます

于 2013-03-07T21:33:22.613 に答える