2012-04-26 152 views
2

这是我的表:比较两个选择值

MyTable的Id, Title, Point, Date

所以我需要检查是否为Title = 'member1'所有点和日期等于所有分和Title = 'member2'日期之后Set @flag = 1否则Set @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的值是相等的,其他的则没有。

+0

你在找什么输出?你如何筛选查询?你是否希望看到t4.4与t1.4,t2.4,t3.4有不同的日期。是否缺少t5.1和t5.4显着(反过来说是t1.6等)如果您知道有5个标题,通过/ count的简单分组将有助于查找空位;并且只有4点1出现在26.4上,例如 – u07ch 2012-04-26 09:13:48

回答

1

我猜你需要检查成员2中没有member1,反之亦然,所以你需要检查两种方式。如果你在一系列日期之间进行这种操作(下面的代码将会是所有的日期),它可以通过一次性使用整数表来完成,并且效率更高。

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

这不是我的答案,如果任何行是两个标题之间的联合总是返回true,但是我需要如果所有行一致都是真的,并且如果其中只有一个不是,或者任何额外的行将被返回false。我将通过示例更新问题。 – Saeid 2012-04-26 07:30:29

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并比较两个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; 

如果我理解你attemptig做什么,这应该这样做。