2016-04-04 3 views
1

私はクエリの結果に含めるデータベースの特定の行、たとえばcustomer_id in ('c7', 'c77', 'c777')をテスト目的だけでなくサンプルとしても使用したい。同時に、返される結果には10,000行も含まれていますが、指定されたcustomer_idフィルタには約100行しか含まれません。SQLにフィルタに値を含めるが、これに限定されるものではない

単一のSELECTステートメントに含まれている、探している行と(SQLのデフォルトに従って無作為に選択された)リミットからの残りの部分を含むSQLの機能や構文があれば、 UNIONを使わずに?

+0

どのDBMSを使用していますか? –

+0

"AND"でSELECTステートメントを試しましたか? –

+0

正直なところ私はDremelを使っていますが、私はDremelとRDBMSの完全なnoobですから、私はそれがRDBMS領域に存在するかどうかを最初に尋ねています。 – menorah84

答えて

1

さて、あなたはORACLEのために、あなたのDBMSを指定するようにしませんでした:

SQL-Serverについては
SELECT * FROM (
    SELECT * FROM Customers c 
    WHERE c.customer_id in('c7','cc7',.......) 
)WHERE rownum <= 10000; 

MySQLについては
SELECT TOP 10000 * 
FROM Customers c 
WHERE c.customer_id in('c7','cc7',.......); 

FROM Customers c 
WHERE c.customer_id in('c7','cc7',.......) 
LIMIT 10000; 

これは最初に選択されますIDがIN()にリストされている10000行stat DBMSのデフォルトによると、 order by句をそれぞれに追加して、どの10Kレコードを指定するかを指定できます。

1

すべての行を照会し、条件を満たすかどうかによって順序を入れ、返された結果を制限することができます。

MySQLの

SELECT * 
FROM  customers 
ORDER BY CASE WHEN customer_id IN ('c7', 'c77', 'c777') THEN 1 ELSE 0 END DESC 
LIMIT 10000 

MS SQL Serverの

SELECT TOP 10000 * 
FROM  customers 
ORDER BY CASE WHEN customer_id IN ('c7', 'c77', 'c777') THEN 1 ELSE 0 END DESC 

のOracle 12C:

SELECT * 
FROM  customers 
ORDER BY CASE WHEN customer_id IN ('c7', 'c77', 'c777') THEN 1 ELSE 0 END DESC 
FETCH FIRST 10000 ROWS ONLY 

ウィンドウ関数を使用するANSI SQL:

SELECT * 
FROM  (SELECT *, 
       ROW_NUMBER() OVER 
        (ORDER BY CASE 
           WHEN customer_id IN ('c7', 'c77', 'c777') THEN 1 
           ELSE 0 END DESC) rn 
      FROM customers) t 
WHERE rn <= 10000 
関連する問題