2

私は次のテーブルを持っていますAttributes

* AttId  * CustomerId  * Class * Code *
| 1      | 1           | 1     | AA   |
| 2      | 1           | 1     | AB   |
| 3      | 1           | 1     | AC   |
| 4      | 1           | 2     | AA   |
| 5      | 1           | 2     | AB   |
| 6      | 1           | 3     | AB   |
| 7      | 2           | 1     | AA   |
| 8      | 2           | 1     | AC   |
| 9      | 2           | 2     | AA   |
| 10     | 3           | 1     | AB   |
| 11     | 3           | 3     | AB   |
| 12     | 4           | 1     | AA   |
| 13     | 4           | 2     | AA   |
| 14     | 4           | 2     | AB   |
| 15     | 4           | 3     | AB   |

それぞれClassの 、Codeペアリングは特定の を表しAttributeます。

ペアリングにリンクされていcustomersないものをすべて返すクエリを作成しようとしています。AttributeClass = 1, Code = AB

Customer Idこれは値 2 と 4を返します。

書き始めましたSelect Distinct A.CustomerId From Attributes A Where (A.Class = 1 and A.Code = 'AB')が、クエリを書いていることに気付き停止しました。また、括弧内の句が満たされてはならないSQLことを示すために括弧の前に配置できる演算子がありません。

私は何が欠けていますか?または、どのオペレーターを見ればよいですか?

編集:

ペアリングへのリンクがないものCustomers(つまり、個別の顧客 ID)のみを返すクエリを作成しようとしています。AttributeClass = 1, Code = AB

Customer Idテーブルには行が含まれていないため、これは値 2 と 4 のみです。

* AttId  * CustomerId  * Class * Code *
| x      | 2           | 1     | AB   |
| x      | 4           | 1     | AB   |

タイトルを変更:

Sqlクエリで「Where Not(a=x and b=x)」を書く方法

に:

次の "Where Not(a=x and b=x)" を満たしていない個別の値を見つけるための SQL クエリの書き方

前のタイトルはそれ自体が質問であったため、質問の詳細が余分な次元を追加し、混乱を招きました.

4

5 に答える 5

4

1つの方法は

SELECT DISTINCT CustomerId FROM Attributes a 
WHERE NOT EXISTS (
    SELECT * FROM Attributes forbidden 
    WHERE forbidden.CustomerId = a.CustomerId AND forbidden.Class = _forbiddenClassValue_ AND forbidden.Code = _forbiddenCodeValue_
)

または参加して

SELECT DISTINCT a.CustomerId FROM Attributes a
LEFT JOIN (
    SELECT CustomerId FROM Attributes
    WHERE Class = _forbiddenClassValue_ AND Code = _forbiddenCodeValue_
) havingForbiddenPair ON a.CustomerId = havingForbiddenPair.CustomerId
WHERE havingForbiddenPair.CustomerId IS NULL

さらに別の方法は、ypercubeの回答に従って、EXCEPTを使用することです

于 2013-01-02T15:47:11.843 に答える
3

誰も単純な論理ステートメントを投稿していないので、ここにあります:

select . . .
where A.Class <> 1 OR A.Code <> 'AB'

(XとY)の負数は(XでもYでもない)です。

なるほど、これはグループ化です。このために、あなたは集約を使用し、以下を持っています:

select customerId
from Attributes a
group by CustomerId
having sum(case when A.Class = 1 and A.Code = 'AB' then 1 else 0 end) = 0

私はいつもこのテクニックを使って「セットにあるか」タイプの質問を解くことを好みます。

于 2013-01-02T15:55:08.193 に答える
3
SELECT CustomerId 
FROM Attributes

EXCEPT

SELECT CustomerId 
FROM Attributes
WHERE Class = 1
  AND Code = AB ;
于 2013-01-02T15:59:01.607 に答える
1
Select Distinct A.CustomerId From Attributes A Where not (A.Class = 1 and A.Code = 'AB')
于 2013-01-02T15:44:02.300 に答える
0

これを試して:

SELECT DISTINCT A.CustomerId From Attributes A Where 
0 = CASE 
         WHEN A.Class = 1 and A.Code = 'AB' THEN 1 
         ELSE 0 
END

編集: もちろん、これでも cust 1 が得られます (doh!)。おそらく pjotrs NOT EXISTS クエリを理想的に使用する必要があります。

于 2013-01-02T15:47:26.287 に答える