2017-03-08 1 views
2

私は、関連する列があることで、テーブルを持っている:ある検索で行が見つからないかどうかを確認する方法を教えてください。

CREATE TABLE [dbo].[PrmsBlotter](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [BBox] [varchar](250) NOT NULL, 
    [RunDateStart] [datetime] NOT NULL, 
    [RunType] [varchar](50) NOT NULL, 
    [TestDateFrom] [date] NULL, 
    ... 
) 

にBBoxは、ブラックボックスの名前です。 RunTypeはLiveまたはBacktestingにすることができます。各ライブ実行は、バックテストのTestDateFromがライブテストのRunDateStartと等しくなるようにバックテストを取得します。

一致するバックテストがないライブがあるかどうかを知る必要があります。私がこれまで持っている:

SELECT t1.BBox, t1.dd, t2.BBox, t2.dd FROM 
(SELECT BBox, CONVERT(date,RunDateStart) as dd FROM [PrimusGroup].[dbo].[PrmsBlotter] 
WHERE RunType = 'Live') t1 
LEFT JOIN 
(SELECT BBox, CONVERT(date,TestDateFrom) as dd FROM [PrimusGroup].[dbo].[PrmsBlotter] 
WHERE RunType = 'Backtesting') t2 
ON (t1.BBox = t2.BBox AND t1.dd = t2.dd) 

私は、生活のための2つのクエリの1に参加backtests用と等しいBBOX名にそれらを参加し、バックテストのtestdatefromに等しいrundatestartさんが住んでいます。それは私が立ち往生している場所です。私はどこにマッチがないと言うのか分からない。

これを行う方法はありますか?

答えて

1

select 
    t.BBox 
    , convert(date, t.RunDateStart) as dd 
from [PrimusGroup].[dbo].[PrmsBlotter] t 
where t.RunType = 'Live' 
    and not exists (
    select 1 
    from [PrimusGroup].[dbo].[PrmsBlotter] i 
    where i.RunType = 'Backtesting' 
     and i.BBox = t.BBox 
     and convert(date,i.TestDateFrom) = convert(date,t.RunDateStart) 
) 
+0

選択しない何1の意味ですか? – bkarj

+0

'exists 1'は何も意味しません。' exists() 'と' not exists() 'は実際には列を返さないからです。この文脈では 'select *'や 'select null'と同じです。 'exists()'を使うとき、 'select 1'と' select * 'の間に**実行時**のパフォーマンス差はありません。 'select 1'を使うと、クエリのコンパイル中にそのテーブルの不要なメタデータを検査する必要がなくなります。 [EXISTSサブクエリ:SELECT 1対SELECT * - Conor Cunningham](http://www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/) – SqlZim

0

あなたはWHERE句必要があります。

SELECT l.BBox, l.rdday, bt.BBox, bt.btday FROM 
FROM (SELECT BBox, CONVERT(date, RunDateStart) as rdday 
     FROM [PrimusGroup].[dbo].[PrmsBlotter] 
     WHERE RunType = 'Live' 
    ) l LEFT JOIN 
    (SELECT BBox, CONVERT(date, TestDateFrom) as btday 
     FROM [PrimusGroup].[dbo].[PrmsBlotter] 
     WHERE RunType = 'Backtesting' 
    ) bt 
    ON l.BBox = bt.BBox AND l.rtday = bt.btday 
WHERE bt.BBox IS NULL; 

注:それはdatepart()機能で使用するキーワードであるためddは、列の悪い名前です。

私はあなたにもgroup byhavingでこれを行うことができると思います。

RunDateStartBBoxTestDateFromに一致していない対応する 'Backtesting''Live'テストを返すように not exists()を使用し
SELECT BBox, CONVERT(date, RunDateStart) as rdday 
FROM [PrimusGroup].[dbo].[PrmsBlotter] 
WHERE RunType IN ('Live', 'BackTesting') 
GROUP BY BBox, CONVERT(date, RunDateStart) 
HAVING SUM(CASE WHEN RunType = 'Live' THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN RunType = 'BackTesting' THEN 1 ELSE 0 END) = 0 ; 
関連する問題