我期望能够根据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中添加的,作为标记。我正在寻找一个声明,最好能返回某种我可以评估的布尔值,类似于当前返回Y
或N
的声明。但是,如果有更好的解决方案需要不同的输出,我很可能会进行调整以解决这个问题。我更关心有一个好的,可扩展的解决方案。
Used_By_Already有一个很好的开始,但是我不会知道数据会提前什么,所以我需要一个纯动态的解决方案。
规划使用情况,这是在为colA
和colB
单个值喂,并且n值colC
,该结构总是为colA AND colB AND (colC1 OR colC2 OR...colCn)
。这些值正用于检索colD
中的第一个日期时间,然后将其与colD
中的每个值进行检查,并再次按第一个查询中的条件进行筛选。在第一个查询完成之前,我不会知道colD
中的日期时间值。
在进入该查询之前,我提前得到的唯一信息是colA
,colB
和每个值colC
。 colC
将始终有至少一个值,但可能有数百个值。我需要检查我的WHERE
语句过滤的每个实例是否都在相同的日期时间对象中记录在系统中,或者它们是否不同。我不知道日期时间是什么,并在所有诚实,它当它发生时,只要每次发生的时间是相同是无关紧要。
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
|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
|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
|my_result|
|---------|
| N |
什么版本的SQL服务器?另外,电流输出和期望输出的例子将会很有帮助。 – BJones
您能否显示一个包含A到D列的表以及您希望返回Y的每列中的值以及另一个包含您希望返回N的行的表的示例? – Beth
示例数据和预期结果的示例将有助于回答您的问题。 –