0

例 1

+--------------------------+
| IDENT | CURRENT | SOURCE |
+--------------------------+
| 12345 | 12345   | A      |
| 23456 | 12345   | B      |
| 34567 | 12345   | C      |
+--------------------------+

例 2

+--------------------------+
| IDENT | CURRENT | SOURCE |
+--------------------------+
| 12345 | 55555   | A      |
| 23456 | 55555   | B      |
+--------------------------+

CURRENT count = 2 で、SOURCE に A と B の両方が含まれている (C ではない) すべてのレコードを表示する選択クエリを作成しようとしています。

レコードがソース C にリンクされているため、CURRENT には 3 つのエントリがあるため、例 A は表示されません
。 B'.

現在、「where SOURCE = A or SOURCE = B」のようなものを実行すると、結果は A、または A+C の SOURCE を持つレコードになります。注: IDENT は常に一意の値です。CURRENT は、異なる SOURCE からの複数の IDENTS をリンクします。

4

5 に答える 5

0
  1. SOURCE値が ごとに一意であることが保証されている場合CURRENT:

    SELECT CURRENT
    FROM atable
    GROUP BY CURRENT
    HAVING COUNT(SOURCE) = 2
       AND COUNT(CASE WHEN SOURCE IN ('A', 'B') THEN SOURCE END) = 2
    ;
    
  2. SOURCEが一意ではなく、 orの重複エントリを持つ sCURRENTが許可されている場合:CURRENT'A''B'

    SELECT CURRENT
    FROM atable
    GROUP BY CURRENT
    HAVING COUNT(DISTINCT SOURCE) = 2
       AND COUNT(DISTINCT CASE WHEN SOURCE IN ('A', 'B') THEN SOURCE END) = 2
    ;
    
  3. SOURCEが一意ではなく、重複するSOURCEエントリを持つグループが許可されていない場合:

    SELECT CURRENT
    FROM atable
    GROUP BY CURRENT
    HAVING COUNT(SOURCE) = 2
       AND COUNT(DISTINCT SOURCE) = 2
       AND COUNT(DISTINCT CASE WHEN SOURCE IN ('A', 'B') THEN SOURCE END) = 2
    ;
    

CURRENTすべてのクエリは、要件に一致する個別の値のみを返します。クエリを派生データセットとして使用し、それをテーブルに結合して詳細を取得します。

SOURCE上記のすべてのオプションは、いずれかがNOT NULL列であるか、または NULL を無視できることを前提としています。

于 2013-10-17T01:58:16.427 に答える
0

現在のカウント = 2 のレコード:

SELECT CURRENT
FROM table
GROUP BY CURRENT
HAVING COUNT(*) = 2

C が SOURCE 値にあるレコード:

SELECT CURRENT
FROM table
WHERE SOURCE = 'C'

グローバル クエリ:

SELECT t.*
FROM TABLE t
WHERE t.CURRENT IN (
    SELECT CURRENT
    FROM table
    GROUP BY CURRENT
    HAVING COUNT(*) = 2
) AND t.CURRENT NOT IN (
    SELECT CURRENT
    FROM table
    WHERE SOURCE = 'C'
)
于 2013-10-15T18:28:24.607 に答える
0

http://sqlfiddle.com/#!2/69be9/8/0

select * from test where current in (

    select test_a.current 

    from 

       (select * 
        from   test 
        where  source = 'A') as test_a

       join (select * 
             from   test 
             where  source = 'B') as test_b
          on test_b.current = test_a.current

    where test_a.current not in 
            (select current from test where source='C')
)
于 2013-10-15T18:34:10.497 に答える