2016-12-28 9 views
0

私はselectを書き留めて、データベースに存在しないすべてのアイテムを表示しようとしています。 TBL795という名前のテーブルがNRBEMという名前の列にあり、そこにギャップがないとします。sqliteデータベースのギャップを選択する方法

inserir a descrição da imagem aqui

これらの数字が順番に、次のとおりです。

は、この方法でなければなりません。

彼らはこのように見えた場合は、次のいくつかの項目がテーブルに挿入されていないため、彼らは、間違っているだろう

inserir a descrição da imagem aqui

何千もの項目がある表では、ギャップがあるかどうか、欠落している項目を見つけることは非常に困難です。私はそのすべての項目を見ることができます

INSERT INTO TESTE 
WITH RECURSIVE 
    cnt(NRBEM) AS (VALUES(1) UNION ALL SELECT NRBEM+1 FROM cnt WHERE NRBEM <100000) 
SELECT NRBEM FROM cnt A 

と、この選択

SELECT A.NRBEM FROM TESTE A LEFT JOIN TBL795 B 
ON A.NRBEM = B.NRBEM 
WHERE B.NRBEM IS NULL 

を実行している:

CREATE TABLE TESTE ( 
    NRBEM VARCHAR(15)) 

このようなコマンドでそれを養う:

一つの解決策はこのことでしょう私のテーブルには欠けている。コマンド以来

SELECT NRBEM FROM (
WITH RECURSIVE 
    cnt(NRBEM) AS (VALUES(1) UNION ALL SELECT NRBEM+1 FROM cnt WHERE NRBEM <100000) 
SELECT NRBEM FROM cnt) A LEFT JOIN TBL795 B 
ON A.NRBEM = B.NRBEM 

しかし、これは動作しません:

WITH RECURSIVE 
     cnt(NRBEM) AS (VALUES(1) UNION ALL SELECT NRBEM+1 FROM cnt WHERE NRBEM <100000) 
    SELECT NRBEM FROM cnt 

は、私はこのような選択を実行したい仮想テーブルを作成します。

この方法:

SELECT X FROM (
WITH RECURSIVE 
    cnt(X) AS (VALUES(1) UNION ALL SELECT X+1 FROM cnt WHERE X <100000) 
SELECT X FROM cnt) A LEFT JOIN TBL795 B 
ON A.X = B.NRBEM 

それは動作しますが、右の項目を選択しません。

どうすればこの選択を書くことができますか?

答えて

1

外部結合やフィルタリングの一致を使用することが可能であるが、集合演算を使用することは簡単ですします:

WITH RECURSIVE CNT(NRBEM) AS (...) 
SELECT NRBEM 
FROM CNT 
WHERE NRBEM NOT IN (SELECT NRBEM 
        FROM tbl795); 
+0

実際には最初の試みは、NOT INを使用していたが、それはdidnの私はLEFT JOINに移動しました。(VALUES(40)UNION AS RECURSIVE CNT(X)WITH( から選択したX ALL CNT WHERE FROM X + 1を選択します。しかし、私は欠けていたものを私が最初にこのように選択を書き直した番号へのキャストがいたことが分かった今後= 40 AND NRBEM <= 50) Xとそれも働きました。 –

0

私は私が間違って何をやっていたが分かりました。

数字でnrbemをキャストすると、選択が機能します。

SELECT A.X FROM (
WITH RECURSIVE 
    cnt(X) AS (VALUES(1) UNION ALL SELECT X+1 FROM cnt WHERE X <100000) 
SELECT X FROM cnt) A LEFT JOIN (SELECT CAST(NRBEM AS NUMBER) AS NRBEM FROM TBL795) B 
ON A.X = B.NRBEM 
WHERE B.NRBEM IS NULL 

私はこれを行うことができます任意のギャップがあるかどうかを確認するために2700年にアイテム2400の範囲を確認したい場合は、次の

SELECT A.X FROM (
WITH RECURSIVE 
    cnt(X) AS (VALUES(2400) UNION ALL SELECT X+1 FROM cnt WHERE X < (2700)) 
SELECT X FROM cnt) A LEFT JOIN (SELECT CAST(NRBEM AS NUMBER) AS NRBEM FROM TBL795 WHERE NRBEM >= 2400 and nrbem <= 2700) B 
ON A.X = B.NRBEM 
WHERE B.NRBEM IS NULL 
LIMIT (2700 - 2400 + 1) 
関連する問題