2

これは私のテーブルです:

マイテーブル:Id, Title, Point, Date

したがって、すべてのポイントと日付が次のすべてのポイントと日付に等しいかどうかを確認する必要がTitle = 'member1'ありますTitle = 'member2'Set @flag = 1Set @flag = 0

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

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

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

更新

次の例を想定します。

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

この例では、T1 値と T2 値だけが等しく、他の値は等しくありません。

4

3 に答える 3

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;

あなたがやろうとしていることを私が理解していれば、これでうまくいくはずです。

于 2012-04-29T01:19:34.753 に答える
1

メンバー2からメンバー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
于 2012-04-26T07:04:20.580 に答える
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        
于 2012-04-26T07:53:22.053 に答える