2017-10-10 133 views
0

我期望能够根据SQL中第一行的值,查看列的值是否在整个行集合中保持不变。检查查询中的列值是否与每行相同

当前我使用以下查询基于对此similar question的答案。

SELECT CASE 
    WHEN NOT EXISTS(
     SELECT * FROM dbo.Table 
     WHERE colA = 'valueA' 
     AND colD <> (
      SELECT TOP 1 colD 
      FROM dbo.Table 
      WHERE LTRIM(colA) = 'valueA' 
      AND colB = 'valueB' 
      AND (
       colC = 'valueC1' 
       OR colC = 'valueC2' 
       ... OR colC = 'valueCn' 
      ) 
     ) 
     AND colB = 'valueB' 
     AND (
      colC = 'valueC1' 
      OR colC = 'valueC2' 
      ... OR colC = 'valueCn' 
     ) 
    ) THEN 'Y' 
    ELSE 'N' 
END AS my_result 

据我已经能够到目前为止测试,这个工作,但我只用了几个测试用例。它的可伸缩性也不是很好,因为colC可能有数百个值,所以这可能是个问题。

难道还有其他的命令或方法来SQL内处理这个更好,也许会是更好的拉动内SELECT声明到它自己的查询,然后把结果和它在另一个导致增加外SELECT声明查询?或者,我开始谈这一切都是错误的吗?

这是在SQL Server 2008 R2 SP3中添加的,作为标记。我正在寻找一个声明,最好能返回某种我可以评估的布尔值,类似于当前返回YN的声明。但是,如果有更好的解决方案需要不同的输出,我很可能会进行调整以解决这个问题。我更关心有一个好的,可扩展的解决方案。

Used_By_Already有一个很好的开始,但是我不会知道数据会提前什么,所以我需要一个纯动态的解决方案。

规划使用情况,这是在为colAcolB单个值喂,并且n值colC,该结构总是为colA AND colB AND (colC1 OR colC2 OR...colCn)。这些值正用于检索colD中的第一个日期时间,然后将其与colD中的每个值进行检查,并再次按第一个查询中的条件进行筛选。在第一个查询完成之前,我不会知道colD中的日期时间值。

在进入该查询之前,我提前得到的唯一信息是colA,colB和每个值colCcolC将始终有至少一个值,但可能有数百个值。我需要检查我的WHERE语句过滤的每个实例是否都在相同的日期时间对象中记录在系统中,或者它们是否不同。我不知道日期时间是什么,并在所有诚实,它当它发生时,只要每次发生的时间是相同是无关紧要

SQL Fiddle

CREATE TABLE Example 
    ([colA] nvarchar(20), [colB] nchar(1), [colC] smallint, [colD] datetime) 
; 

INSERT INTO Example 
    ([colA], [colB], [colC], [colD]) 
VALUES 
    ('123610', 'S', '1', '2017-06-17 11:53:52'), 
    ('123610', 'S', '2', '2017-06-17 11:53:52'), 
    ('123610', 'R', '3', '2017-06-17 11:53:52'), 
    ('123610', 'S', '4', '2017-06-17 11:53:52'), 
    ('123611', 'S', '1', '2017-06-17 11:53:52'), 
    ('123610', 'S', '5', '2017-06-14 11:53:52'), 
    ('123610', 'S', '3', '2017-06-17 11:53:52'), 
    ('123610', 'S', '7', '2017-06-15 11:53:52'), 
    ('123610', 'S', '8', '2017-06-17 11:53:52'), 
    ('123610', 'S', '9', '2017-06-17 11:53:52') 
; 

查询1

SELECT CASE 
    WHEN NOT EXISTS(
     SELECT * FROM Example 
     WHERE colA = '123610' 
     AND colD <> (
      SELECT TOP 1 colD 
      FROM Example 
      WHERE colA = '123610' 
      AND colB = 'S' 
      AND (
       colC = '1' 
       OR colC = '2' 
       OR colC = '7' 
       OR colC = '5' 
      ) 
     ) 
     AND colB = 'S' 
     AND (
      colC = '1' 
      OR colC = '2' 
      OR colC = '7' 
      OR colC = '5' 
     ) 
    ) THEN 'Y' 
    ELSE 'N' 
END AS my_result 

Results

|my_result| 
|---------| 
| N | 

查询2

SELECT CASE 
    WHEN NOT EXISTS(
     SELECT * FROM Example 
     WHERE colA = '123610' 
     AND colD <> (
      SELECT TOP 1 colD 
      FROM Example 
      WHERE colA = '123610' 
      AND colB = 'S' 
      AND (
       colC = '1' 
       OR colC = '2' 
       OR colC = '3' 
       OR colC = '8' 
      ) 
     ) 
     AND colB = 'S' 
     AND (
      colC = '1' 
      OR colC = '2' 
      OR colC = '3' 
      OR colC = '8' 
     ) 
    ) THEN 'Y' 
    ELSE 'N' 
END AS my_result 

Results

|my_result| 
|---------| 
| Y | 

查询从类似的问题我设置以下3

SELECT CASE 
    WHEN NOT EXISTS(
     SELECT * FROM Example 
     WHERE colA = '123610' 
     AND colD <> (
      SELECT TOP 1 colD 
      FROM Example 
      WHERE colA = '123610' 
      AND colB = 'S' 
      AND (
       colC = '1' 
       OR colC = '4' 
       OR colC = '3' 
       OR colC = '8' 
      ) 
     ) 
     AND colB = 'S' 
     AND (
      colC = '1' 
      OR colC = '4' 
      OR colC = '3' 
      OR colC = '8' 
     ) 
    ) THEN 'Y' 
    ELSE 'N' 
END AS my_result 

Results

|my_result| 
|---------| 
| N | 
+1

什么版本的SQL服务器?另外,电流输出和期望输出的例子将会很有帮助。 – BJones

+0

您能否显示一个包含A到D列的表以及您希望返回Y的每列中的值以及另一个包含您希望返回N的行的表的示例? – Beth

+1

示例数据和预期结果的示例将有助于回答您的问题。 –

回答

0

借用的示例数据:

SQL Fiddle

CREATE TABLE Table1 
    ([ID] varchar(4), [Status] int) 
; 

INSERT INTO Table1 
    ([ID], [Status]) 
VALUES 
    ('y123', 2), 
    ('y432', 2), 
    ('y531', 2), 
    ('y123', 2), 
    ('n123', 1), 
    ('n432', 3), 
    ('n531', 2), 
    ('n123', 2) 
; 

查询1

select 
    coalesce(
      (select 'Y' as yn 
       from (
       select count(distinct [Status]) yn 
       from table1 
       where id like 'y%'     -- data for yes 
       having count(distinct [Status]) = 1 
       ) as yn) 
      ,'N') 

Results

| | 
|---| 
| Y | 

查询2

select 
    coalesce(
      (select 'Y' as yn 
       from (
       select count(distinct [Status]) yn 
       from table1 
       where id like 'n%'     -- data for no 
       having count(distinct [Status]) = 1 
       ) as yn) 
      ,'N') 

Results

| | 
|---| 
| N | 
+0

这个问题的主要问题是,我不知道什么是提前的价值,除了它是一个日期时间。 – Malil

+0

所以你有一个需要与一组行进行比较的变量,那个变量是datetime。你认为的问题在哪里?你比较哪些行?你会用这个来做什么? (例如触发器,程序?......)不只是在这里回应。如果它可以帮助每个人编辑问题。 –

相关问题