我期望能夠根據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
示例數據和預期結果的示例將有助於回答您的問題。 –