检查查询中的列值是否与每行相同
我期望能够根据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 |
借用的示例数据:
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')
| |
|---|
| 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')
| |
|---|
| N |
这个问题的主要问题是,我不知道什么是提前的价值,除了它是一个日期时间。 – Malil
所以你有一个需要与一组行进行比较的变量,那个变量是datetime。你认为的问题在哪里?你比较哪些行?你会用这个来做什么? (例如触发器,程序?......)不只是在这里回应。如果它可以帮助每个人编辑问题。 –
什么版本的SQL服务器?另外,电流输出和期望输出的例子将会很有帮助。 – BJones
您能否显示一个包含A到D列的表以及您希望返回Y的每列中的值以及另一个包含您希望返回N的行的表的示例? – Beth
示例数据和预期结果的示例将有助于回答您的问题。 –