2017-10-10 137 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。你認爲的問題在哪裏?你比較哪些行?你會用這個來做什麼? (例如觸發器,程序?......)不只是在這裏迴應。如果它可以幫助每個人編輯問題。 –

相關問題