1

私が走れば

Select distinct CompanyID from Device 

私は6行を取得します。私が走れば

Select CompanyID from Company

私は8441行を取得します。次を実行すると:

私が走れば

Select CompanyID
from Company where CompanyID NOT IN 
( 
   Select distinct CompanyID from Device
)

元の select ステートメントに含まれていない 8435 社を取得する必要がありますね。

ただし、これを実行すると0行になります。ここでの問題は何ですか?上記の 6 つの結果の 1 つが null ですが、それは問題ではありません。

ありがとう!

編集: Marc-s の助けを借りて、次のステートメントを必要なものにすることができましたが、このクエリにはまだ余分なステップがあったように感じます。

DELETE from Company where CompanyID NOT IN
(
Select C.CompanyID 
from Company C where C.CompanyID IN 
( 
  Select distinct CompanyID from Device
)
OR CompanyID IN
(
  Select distinct CustomerID from Device
)
OR CompanyID IN
(
  Select distinct CompanyID from AssignedCompanies
 )
 )
4

5 に答える 5

5

いいえ、出力は正しいです。

8441 行あります。Companyそれらの値は、最初のクエリで取得した 6 つの行の1 つにすぎません (たとえば、、、、、、、としCompanyIDましょう)。ABCDEF

すべての行には、CompanyIDこれらの 6 つの個別の値からの値があります。

したがって、最後のクエリで選択すると、最初のクエリで取得した 6 つの値のいずれでもない持つすべての行を取得する必要があります。AFCompanyId

したがって、何も返されません-それらのCompanyId値はすべてその副選択に存在するSELECTため、ステートメントから除外されるためです

于 2012-10-31T21:42:44.510 に答える
2

Company に Device にない CompanyID があると仮定すると、問題は Device からの 6 の NULL 値です。CompanyID が 6 のいずれでもない場合でも、NOT IN ステートメントは UNKNOWN と評価されます。詳細については、この Q/A を参照してください: NOT IN 句と NULL 値

編集:これを回避するには、サブクエリを次のように変更してみてください。

SELECT DISTINCT CompanyID FROM  Device WHERE CompanyID IS NOT NULL
于 2012-10-31T21:50:15.583 に答える
1

結果は正しいです。

deviceテーブルに同じ値がすべて含まれている場合、すべての CompanyIDcompanyを選択するクエリにDISTINCTは、他のテーブルのすべての CompanyID が含まれています。

例:

CREATE TABLE device ([companyid] int);

INSERT INTO device  ([companyid])
VALUES
    (1),
    (1),
    (2),
    (3),
    (4),
    (5),
    (6),
    (7),
    (7)
;

CREATE TABLE company([companyid] int, [name] varchar(5));

INSERT INTO company ([companyid], [name])
VALUES
    (1, 'Comp1'),
    (2, 'Comp2'),
    (3, 'Comp3'),
    (4, 'Comp4'),
    (5, 'Comp5'),
    (6, 'Comp6'),
    (7, 'Comp7')
;

クエリは次のDISTINCT値を返します - 1、2、3、4、5、6、7。companyテーブルは同じ値を保持するため、NOT INゼロのレコードが返されます。

デモで SQL Fiddle を参照してください

ここで、deviceテーブルがテーブルのすべての値を保持していなかったとしcompanyましょう。その場合、欠落している値のいずれかを返します

CREATE TABLE device([companyid] int);

INSERT INTO device([companyid])
VALUES
    (1),
    (1),
    (2),
    (3),
    (4)
;

CREATE TABLE company([companyid] int, [name] varchar(5));

INSERT INTO company([companyid], [name])
VALUES
    (1, 'Comp1'),
    (2, 'Comp2'),
    (3, 'Comp3'),
    (4, 'Comp4'),
    (5, 'Comp5'),
    (6, 'Comp6'),
    (7, 'Comp7')
;

次に、このクエリは値 5、6、7 を返します。これらはテーブルに存在するが、companyテーブルには存在しないためdeviceです。

Select CompanyID
from Company 
where CompanyID NOT IN (Select distinct CompanyID 
                        from Device)

デモで SQL Fiddle を参照してください

于 2012-10-31T21:43:01.640 に答える
0

ネストされた選択には、すべて個別の CompanyID があります。したがって、そのセットに存在しない CompanyID を持つ行は見つかりません。

于 2012-10-31T21:42:59.060 に答える
0

クエリはおそらく正しいですが、データに重複がないことを前提としています。

たとえば、Device テーブルの CompanyID 値が 1、2、3、4、5 で、Company テーブルの値が 1、2、3、4、5、6、7 の場合、クエリの結果は 0 行になります。

クエリを NOT IN から IN に反転すると、交差する値が表示されます。

于 2012-10-31T21:44:45.210 に答える