-1

SQL クエリは次のとおりです。

SELECT * from ActiveListing a WHERE [seller-id] in 
(SELECT id from Product p where PurchaserID = 60741 and right(id, 4) = '-XRU')

2 番目の Select ステートメントの結果は、実行が 1 番目の Select ステートメントで使用される 1000 の ID を返す場合、実行が正しい 800 レコードを返す場合です。

質問:

結果のない 200 個の ID を取得するには、このクエリをどのように変更すればよいでしょうか

RDMS: MSSQL

サンプル:

 SELECT id from Product p where PurchaserID = 60741 and right(id, 4) = '-XRU'

戻り ID (1,2,3,4)

 SELECT * from ActiveListing a WHERE [seller-id] in (1,2,3,4) 

2 つのレコード ID 1 と 2 を返しました 値を返します ID 3 と 4 は何も返しません

IDの3と4を取得したかった

質問が少し明確になったことを願っています。助けようとしているすべての人に感謝します。私はまだ他の提案をテストしています

4

4 に答える 4

4

少し不明確ですが、NOT IN代わりに試してください

SELECT * from ActiveListing a WHERE [seller-id] not in 
(SELECT id from Product p where PurchaserID = 60741 and right(id, 4) = '-XRU')
于 2013-06-13T20:00:24.610 に答える
2

Randy が提案したように、 に変更INするだけNOT INです。EXISTSただし、JOIN と(半結合)の観点から考え始めることをお勧めします。

SELECT
   A.* -- try to use explicit columns though instead of *
FROM
   dbo.ActiveListing A
WHERE
   Right(A.[seller-id], 4) <> '-XRU' --may improve performance
   AND NOT EXISTS ( -- this is actually an anti-semi-join
      SELECT *
      FROM dbo.Product P
      WHERE
         P.PurchaserID = 60741
         AND Right(P.id, 4) = '-XRU'
         AND A.[seller-id] = P.id
   )
;

SELECT
   A.* -- try to use explicit columns though instead of *
FROM
   dbo.ActiveListing A
   LEFT JOIN dbo.Product P
      ON P.PurchaserID = 60741
      AND Right(P.id, 4) = '-XRU'
      AND A.[seller-id] = P.id
WHERE
   Right(A.[seller-id], 4) <> '-XRU' --may improve performance
   AND P.id IS NULL
;

「パフォーマンスが向上する可能性がある」という追加もNULL値を削除するA.[seller-id]ことに注意してくださいNULL

私がこれを逆に理解していて、そこProductにない行が必要な場合ActiveListingは、テーブルと条件を反転するだけです。

SELECT
   P.* -- try to use explicit columns though instead of *
FROM
   dbo.Product P
WHERE
   P.PurchaserID = 60741
   AND Right(P.id, 4) = '-XRU'
   AND NOT EXISTS ( -- this is actually an anti-semi-join
      SELECT *
      FROM dbo.ActiveListing A
      WHERE P.id = A.[seller-id]
   )
;

SELECT
   P.* -- try to use explicit columns though instead of *
FROM
   dbo.Product P
   LEFT JOIN dbo.ActiveListing A
      ON P.id = A.[seller-id]
WHERE
   P.PurchaserID = 60741
   AND Right(P.id, 4) = '-XRU'
   AND A.[seller-id] IS NULL
;
于 2013-06-13T20:05:20.360 に答える
1

私があなたのことを正しく理解している場合は、基準に適合する製品のエントリを見つけたいと考えています。

1) ID の最後の 4 文字は -XRU 2) PurchaserID = 60741 3) その ID に一致する ActiveListing がありません

それから私は提案します

SELECT p.Id
FROM Product as p
WHERE p.PurchaserID = 60741
  AND RIGHT(p.id,4) = '-XRU'
  AND NOT EXISTS (
    SELECT 1
    FROM ActiveListing AS a
    WHERE a.seller-id = p.id
    )

NOT EXISTS 句に NOT IN を使用することもできますが (ただし、それは宣言的ではないと思います)、または LEFT JOIN を使用して NULLS をチェックすることもできます (ただし、宣言的ではありません)。

出力 ID

SELECT p.Id AS [CheckID]
FROM Product as p
WHERE p.PurchaserID = 60741

出力固有 ID

SELECT DISTINCT p.Id
FROM Product as p
WHERE p.PurchaserID = 60741

行数が同じであることを確認します。同じでない場合は、ActiveListing に対応するエントリがない行がない可能性があります。

代替クエリのパフォーマンスが悪いバージョン -- ただし、Vanilla SQL を使用する必要があります

SELECT p.Id AS [CheckID]
FROM Product as p
WHERE p.PurchaserID = 60741

EXECPT
SELECT seller-id AS [checkID] FROM ActiveListing

ここで論理的に問題が発生することはありません。クエリを実行しても結果が得られない場合...結果はありません..

于 2013-06-13T20:10:37.363 に答える
0

INからNOT INに変わると思います。

于 2013-06-13T20:01:08.013 に答える