2017-07-07 89 views
1

鑑於這些表:查找具有相同的確切關係,所有的行,另一個表中提供


表:測試

列:

  • testID INT PK
  • 名稱爲nvarchar (128)UNIQUE NOT NULL

表:[試驗輸入]

  • inputsTableName爲nvarchar(128)PK UNIQUE
  • testID INT PK FK

臨時表:## TestSearchParams

列:

  • inputsTableName爲nvarchar(128)UNIQUE NOT NULL

我需要找到一個在試驗輸入項測試與精確匹配的所有條目在## TestSearchParams inputsTableNames ;得到的測試關係必須與## TestSearchParams中列出的完全一樣。

本質上,我只用給定的關係找到測試,不多也不少。我使用LIKE和通配符匹配名稱,但是這是一個我認爲可以在覈心邏輯完成匹配後解決的旁註。

這是我當前的查詢:

Select * 
From Tests As B 
Where B.testID In (
         Select ti 
         From (
            Select (
               Select Count(inputsTableName) 
               From [Test-Inputs] 
               Where [Test-Inputs].testID = B.testID 
              ) - Count(Distinct i1) As delta, 
              ti 
            From  (
               Select [Test-Inputs].inputsTableName As i1, 
                 [Test-Inputs].testID As ti 
               From ##TableSearchParams 
               Join [Test-Inputs] 
                On [Test-Inputs].inputsTableName Like ##TableSearchParams.inputsTableName 
                 And B.testID = [Test-Inputs].testID 
              ) As A 
            Group By ti 
          ) As D 
         Where D.delta = 0 
        ); 

目前的問題是,他似乎與匹配任何條目的## TableSearchParams檢索測試。在此之前,我嘗試了其他幾個查詢,以獲得不同程度的成功。我有查找測試匹配任何參數,所有的參數,並沒有任何參數工作查詢 - 我只是不能讓這個查詢工作。

下面是一些示例表值:

測試

  • 1,測試1
  • 2,的Test2
  • 3,Test3的

[試驗輸入]

  • 表1,1
  • 表2,2
  • 表1,3
  • 表2,3個

TestSearchParams

  • 表1
  • 表2

給定的值應該只返回(3,Test3的)

+2

編輯您的問題,並提供樣本數據和所需的結果。 –

+0

好的例子應該發佈 – DeceitfulEcho

+0

這裏是一個很好的開始。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

回答

-1

這裏是一個可能的解決方案,通過獲取全套TestInputs的用於測試每條記錄的作品,左加入到設定的搜索參數,然後彙總結果通過測試,使兩個觀察:

首先,如果從測試一個記錄包括TestInput不是搜索參數中,則該記錄必須從結果集中排除。我們可以通過查看是否存在上述左連接未在搜索參數表中產生匹配的情況來檢查此問題。其次,如果來自Test的記錄滿足第一個條件,那麼我們知道它沒有任何多餘的TestInput記錄,所以它唯一可能遇到的問題是如果存在不在其TestInput中的搜索參數。如果是這樣,那麼我們爲該測試彙總的記錄數將少於搜索參數的總數。

我所做的假設,在這裏,您不必重複的TestInputs測試記錄,你也不要使用重複的搜索參數。如果這些假設無效,那麼這變得更加複雜。但如果是,那麼這應該工作:

declare @Tests table (testID int, [name] nvarchar(128)); 
declare @TestInputs table (testID int, inputsTableName nvarchar(128)); 
declare @TestSearchParams table (inputsTableName nvarchar(128)); 

-- Sample data. 
-- 
-- testID 1 has only a subset of the search parameters. 
-- testID 2 matches the search parameters exactly. 
-- testID 3 has a superset of the search parameters. 
-- 
-- Therefore the result set should include testID 2 only. 
insert @Tests values 
    (1, 'Table A'), 
    (2, 'Table B'), 
    (3, 'Table C'); 
insert @TestInputs values 
    (1, 'X'), 
    (2, 'X'), 
    (2, 'Y'), 
    (3, 'X'), 
    (3, 'Y'), 
    (3, 'Z'); 
insert @TestSearchParams values 
    ('X'), 
    ('Y'); 

declare @ParamCount int; 
select @ParamCount = count(1) from @TestSearchParams; 

select 
    Tests.testID, 
    Tests.[name] 
from 
    @Tests Tests 
    inner join @TestInputs Inputs on Tests.testID = Inputs.testID 
    left join @TestSearchParams Search on Inputs.inputsTableName = Search.inputsTableName 
group by 
    Tests.testID, 
    Tests.[name] 
having 
    -- If a group includes any record where Search.inputsTableName is null, it means that 
    -- the record in Tests has a TestInput that is not among the search parameters. 
    sum(case when Search.inputsTableName is null then 1 else 0 end) = 0 and 

    -- If a group includes fewer records than there are search parameters, it means that 
    -- there exists some parameter that was not found among the Tests record's TestInputs. 
    count(1) = @ParamCount; 
+0

這工作完全(有位擺弄得到它,以適應我的數據庫和項目的全部範圍)。非常感謝!我沒有意識到你可以在where子句中使用諸如case語句之類的東西 - 使生活變得更容易。 – DeceitfulEcho

相關問題