3

次のようなクエリがあるとします。

SELECT *
FROM TABLE

そしてそれはこれを返します:

TABLE
ID | DATA | VAL
===============
01 | ABCD | 1
01 | DEFG | 2
02 | FGHI | 3
02 | HIJK | 2
03 | JKLM | 3
03 | LMNO | 4
04 | NOPQ | 0
04 | PQRS | 1

現在、このような適切な値のみを検索しようとするクエリがありますが、他の行に不正なVALを持つIDが含まれているため、欠陥があります。これは私が望んでいることではありません。

SELECT *
FROM TABLE
WHERE TABLE.VAL IN ("1","2","3")

これを返します(LMNOとPQRSがありません):

TABLE
ID | DATA | VAL
===============
01 | ABCD | 1
01 | DEFG | 2
02 | FGHI | 3
02 | HIJK | 2
03 | JKLM | 3
04 | NOPQ | 0

ただし、IDに不正な値がない行のみが必要です。したがって、01と02は、すべての行が良好な結果をもたらすため、問題ありません。03と04は、他の行の悪い結果に汚染されているため、悪いです。

結果をこのようにしてソフトウェアで処理することもできますが、これはデータベースで可能であるように思われます。原則として、データベースで実行する方がソフトウェアよりも優れています(ご存知のとおり、それは彼らがそこにいるようなものです...)

私が思いつくことができる最高のものはこれです:

SELECT *
FROM TABLE
WHERE COUNT( SELECT ID
             FROM TABLE
             WHERE TABLE.VAL NOT IN ("1","2","3")
           ) = 0

これは実行可能ですか?より良い代替案はありますか?

ありがとう!

4

4 に答える 4

5

使用する:

SELECT * 
  FROM TABLE a
 WHERE a.val IN (1,2,3)
   AND NOT EXISTS(SELECT NULL
                    FROM TABLE b
                   WHERE b.id = a.id
                     AND b.val NOT IN (1, 2, 3))
于 2011-01-28T00:25:16.910 に答える
1

マイナス演算子を使用できます。

疑似クエリ

select everything
from tables
where id in ( select id from table minus select id from table where val is bad )
于 2011-01-28T00:00:51.750 に答える
1

あなたは次のようなことを試すことができます

SELECT *
FROM TABLE
WHERE TABLE.ID NOT IN(
    SELECT ID
    FROM TABLE
    WHERE TABLE.VAL < '1'
    OR TABLE.VAL > '3'
)
于 2011-01-28T00:03:33.883 に答える
1

これは、TBLを1回通過し、集約し、見つかったIDを使用して、TBLからデータを取得する別の方法です。

SELECT *
WHERE ID IN
(
    SELECT
       ID,
       CASE WHEN val in (1,2,3) THEN 1 ELSE 0 END Test
    FROM TBL
    GROUP BY ID
    HAVING MIN(val) = 1
)

複数列のキーの場合、および上記のINフォームの代わりに、JOINフォームを使用できます。

SELECT T.*
FROM (
    SELECT
       Company, OrderNumber,
       CASE WHEN val in (1,2,3) THEN 1 ELSE 0 END Test
    FROM TBL
    GROUP BY Company, OrderNumber
    HAVING MIN(val) = 1
    ) KEEP
INNER JOIN TBL T ON T.Company = KEEP.Company and T.OrderNumber=KEEP.OrderNumber
于 2011-01-28T00:47:17.900 に答える