我希望能够根据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
语句拉入自己的查询中更好,然后将结果添加到外部{{ 1}}在另一个结果查询中的语句?或者,我一开始就错了吗?
这是在SQL Server 2008 R2 SP3中,我已将其添加为标记。我正在寻找一个声明,它最好返回一些我可以评估的布尔值,类似于此语句当前返回SELECT
或Y
的方式。但是,如果有一个更好的解决方案需要不同的输出,我很可能会调整以解决这个问题。我更关心的是拥有一个好的,可扩展的解决方案。
Used_By_Already有一个良好的开端,但是我不会提前知道数据是什么,所以我需要一个纯动态的解决方案。
为此计划的用例是为N
和colA
提供单个值,为colB
提供n个值,结构始终为colC
。这些值用于从colA AND colB AND (colC1 OR colC2 OR...colCn)
检索第一个日期时间,然后根据colD
中的每个值进行检查,再次按第一个查询中的条件进行筛选。在第一次查询完成之前,我不会知道colD
中日期时间的值。
我在进入此查询之前提前获得的唯一信息是colD
,colA
,以及colB
的每个值。 colC
始终至少有一个值,但可能有数百个值。我需要检查由colC
语句过滤的每个实例是否都记录在同一日期时间对象的系统中,或者它们是否不同。我不知道那个日期时间到底是什么,而且说实话,发生时无关紧要,只要每次发生都是相同。
WHERE
查询1
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')
;
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
查询2
|my_result|
|---------|
| N |
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
查询3
|my_result|
|---------|
| Y |
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
答案 0 :(得分:0)
借用类似问题的样本数据我设置了以下内容:
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 |