2012-04-26 21 views
2

これが私のテーブルですエルスSet @flag = 1Set @flag = 0正確な2つの選択がある:一つのテーブルに2つの選択の値を比較することは

Select Point, Date From MyTable Where Title = 'member1' 

Select Point, Date From MyTable Where Title = 'member2' 

等しいかどうかすべての行をチェックする必要があります。あなたの提案は何ですか?

更新

は、以下の例を想定:この例だけT1値およびT2値の

Title Point  Date 

T1  1 2012-04-26 07:14:34.000 
T1  2 2012-07-26 07:14:34.000 
T1  3 2012-06-26 07:14:34.000 
T1  4 2012-05-26 07:14:34.000 
T2  1 2012-04-26 07:14:34.000 
T2  2 2012-07-26 07:14:34.000 
T2  3 2012-06-26 07:14:34.000 
T2  4 2012-05-26 07:14:34.000 
T3  4 2012-05-26 07:14:34.000 
T3  3 2012-06-26 07:14:34.000 
T4  1 2012-04-26 07:14:34.000 
T4  2 2012-07-26 07:14:34.000 
T4  3 2012-06-26 07:14:34.000 
T4  4 2012-05-27 07:14:34.000 -- 26 to 27 
T5  2 2012-12-27 07:14:34.000 
T5  6 2012-05-27 07:14:34.000 
T5  3 2012-07-26 07:14:34.000 

は等しく、他のものではありません。

+0

あなたはどんな出力を探していますか?どのようにクエリをフィルタリングしていますか? t4.4がt1.4、t2.4、t3.4と異なる日付を持つことを確認しますか?欠落しているt5.1とt5.4は重要です(逆にt1.6など)。/ countで単純なグループを指定すると、5つのタイトルがあることが分かっていればギャップを見つけるのに役立ちます。たった4ポイント1が26.4に出てくるのですが、例えば – u07ch

答えて

1

メンバー2にメンバー1がなくなっていないことを確認する必要があると推測するので、両方の方法を確認する必要があります。日付の範囲(以下のコードはすべての日付)の間にこれを実行している場合は、整数のテーブルを1回のパスで使用してより効率的に行うことができます。

IF NOT EXISTS (
SELECT 
    Point, 
    Date 
FROM 
    MyTable aa 
LEFT OUTER JOIN MyTable bb 
ON aa.point = bb.point 
AND aa.date = bb.date 

WHERE 
    aa.title = 'member1' 
AND bb.title = 'member2' 
AND bb.title IS NULL 

UNION 

SELECT 
    Point, 
    Date 
FROM 
    MyTable aa 
LEFT OUTER JOIN MyTable bb 
ON aa.point = bb.point 
AND aa.date = bb.date 

WHERE 
    aa.title = 'member2' 
AND bb.title = 'member1' 
AND bb.title IS NULL 
) 
SELECT @Flag = 1 
+0

というのは私の答えではありません。いずれかの行が2つのタイトル間の和集合であれば常にtrueを返しますが、すべての行が真であり、追加の行はfalseを返します。私は例で質問を更新するつもりです。 – Saeid

0

これは美容コンテストまたはパフォーマンスコンテストに勝つことはできませんが、これで十分です。その要旨は

  • あなたは、それぞれのカウントテーブルの両方が
  • だけの結果の両方を選択しましょう
  • を比較したいすべてのフィールドに自分自身にMyTableに参加し、各タイトルの数を取得

    • にありますカウントが一致

    SQLステートメント

    ;WITH cnt (Title, cnt) AS (
        SELECT Title, COUNT(*) 
        FROM MyTable 
        GROUP BY 
          Title 
    ) 
    SELECT DISTINCT mt1.Title 
         , mt2.Title 
    FROM MyTable mt1 
         INNER JOIN MyTable mt2 ON mt1.Point = mt2.Point 
                AND mt1.Date = mt2.Date 
                AND mt1.Title < mt2.Title 
         INNER JOIN cnt cnt1 ON cnt1.Title = mt1.Title 
         INNER JOIN cnt cnt2 ON cnt2.Title = mt2.Title   
    WHERE cnt1.cnt = cnt2.cnt   
    
  • 1

    ここで私はそれをやります。計画は、各結果セットを取得し、それをXMLに変換し、2つのXML結果を比較することです。はるかに簡単です(私の意見では)。

    CREATE TABLE MyTable 
    (
    [id] integer identity, 
    [Title] varchar(1024), 
    [Point] int, 
    [Date] datetime 
    ); 
    
    
    insert into MyTable([Title], [Point], [Date]) 
    values('T1',  1, '2012-04-26 07:14:34.000'), 
    ('T1',  2, '2012-07-26 07:14:34.000'), 
    ('T1',  3, '2012-06-26 07:14:34.000'), 
    ('T1',  4, '2012-05-26 07:14:34.000'), 
    ('T2',  1, '2012-04-26 07:14:34.000'), 
    ('T2',  2, '2012-07-26 07:14:34.000'), 
    ('T2',  3, '2012-06-26 07:14:34.000'), 
    ('T2',  4, '2012-05-26 07:14:34.000'), 
    ('T3',  4, '2012-05-26 07:14:34.000'), 
    ('T3',  3, '2012-06-26 07:14:34.000'), 
    ('T4',  1, '2012-04-26 07:14:34.000'), 
    ('T4',  2, '2012-07-26 07:14:34.000'), 
    ('T4',  3, '2012-06-26 07:14:34.000'), 
    ('T4',  4, '2012-05-27 07:14:34.000'), 
    ('T5',  2, '2012-12-27 07:14:34.000'), 
    ('T5',  6, '2012-05-27 07:14:34.000'), 
    ('T5',  3, '2012-07-26 07:14:34.000'); 
    
    -- your original queries 
    Select Point, Date From MyTable Where Title = 'T1'; 
    Select Point, Date From MyTable Where Title = 'T2'; 
    
    -- first I am going to just get each one as XML 
    SELECT [Point], [Date] 
    FROM MyTable 
    WHERE Title = 'T1' 
    FOR XML PATH(''); 
    
    
    SELECT [Point], [Date] 
    FROM MyTable 
    WHERE Title = 'T2' 
    FOR XML PATH(''); 
    
    
    
    -- first just get the two results into one result set 
    select t.FirstCheck, t.SecondCheck 
    from (
        select (SELECT [Point], [Date] 
           FROM MyTable 
          WHERE Title = 'T1' 
           FOR XML PATH('')) as FirstCheck, 
          (SELECT [Point], [Date] 
           FROM MyTable 
          WHERE Title = 'T2' 
           FOR XML PATH('')) as SecondCheck 
    ) as t; 
    
    
    -- now for the real check. 
    
    declare @flag int; 
    
    select @flag = case when t.FirstCheck = t.SecondCheck then 1 else 0 end 
    from (
        select (SELECT [Point], [Date] 
           FROM MyTable 
          WHERE Title = 'T1' 
           FOR XML PATH('')) as FirstCheck, 
          (SELECT [Point], [Date] 
           FROM MyTable 
          WHERE Title = 'T2' 
           FOR XML PATH('')) as SecondCheck 
    ) as t; 
    -- this should return 1 
    select @flag as Flag; 
    
    
    select @flag = case when t.FirstCheck = t.SecondCheck then 1 else 0 end 
    from (
        select (SELECT [Point], [Date] 
           FROM MyTable 
          WHERE Title = 'T1' 
           FOR XML PATH('')) as FirstCheck, 
          (SELECT [Point], [Date] 
           FROM MyTable 
          WHERE Title = 'T3' 
           FOR XML PATH('')) as SecondCheck 
    ) as t; 
    -- this should return 0 
    select @flag as Flag; 
    

    私があなたがしようとしていることを理解していれば、これが必要です。

    関連する問題