2014-05-21 292 views
0

我有兩個包含ID的表(A和B),但是在表B中有些記錄將這些ID組合在一起,例如IDExec列可能包含一個看起來像'id1 id2'的記錄。我試圖找到表A的ID的未出現在表B.我認爲,通過使用類似:SQL包含查詢

SELECT * 
FROM A 
WHERE NOT EXISTS(SELECT * 
        FROM B 
        WHERE Contains(A.ExecID, B.ExecID)) 

這不是工作的需要包含第二個參數是字符串,text_lex或可變。

你們有解決這個問題的辦法嗎?

要棚更多的光對上述問題的表strucutres如下:

Table A (IDExec, ProdName, BuySell, Quantity, Price, DateTime) 
Table B (IDExec, ClientAccountNo, Quantity) 

我創建操縱在表A基團最多同一產品的所有buysell的所述buysell數據中的C#代碼在給定的一天。現在的問題是你如何規範化這個,所以我不會混雜IDExec?在表B中創建一個名爲AllocID的新ID列並將這兩個錶鏈接起來會更好嗎?因此,像這樣:

Table A (IDExec, AllocID, ProdName, BuySell, Quantity, Price, DateTime) 
Table B (AllocID, ClientAccountNo, Quantity) 
+0

嗨juergen d對不起,這個。這是MS Sql服務器 – Elias

回答

0

該數據應該規範化,在一個字段中存儲多個值是一個壞主意。

一種解決方法是使用LIKE

SELECT * 
FROM A 
WHERE NOT EXISTS(SELECT * 
        FROM B 
        WHERE ' '+B.ExecID+' ' LIKE '% '+A.ExecID+' %') 

這是你的每例如使用空格分隔的值。

+0

感謝山羊公司我同意這應該正常化,也許你可以給你的意見,應如何做到這一點。表A包含購買和銷售,我寫了一個程序來處理這些數據以產生故障。爲了優化的目的,我把所有相同的產品和價格的採購和銷售分組在一起。這就是爲什麼在表B中ID被分組在一起。我相信這是一個更好的方式來做到這一點,我只是不夠聰明。 – Elias

+0

這取決於一點,您可以簡單地從每個記錄中創建多個記錄,當前有多個ID列出。如果這樣做會導致大量冗餘,則可能需要額外的表格。數據庫旨在處理多行,但單個字段中的多個值總是表現不佳。如果你在你的問題中加入你當前的表格結構和對'A'和'B'之間關係的簡要描述,我們可能會建議如何最好地對此進行標準化。 –

+0

謝謝山羊CO會做。 – Elias

0

這是一種粗糙的,但它會給你所有不包含在BA條目。

SELECT * FROM A WHERE A.ExecID not in (SELECT ExecID from B); 
+0

如果B是一個大表,考慮使用左連接並檢查null,如果表很大,這可能會非常低效,因爲索引衝突將增加logaritmic開銷,而不是線性(儘管稍微慢一些50行將會更快,50,000)。 – scragar

+0

感謝您的意見戴夫和scargar。這些表格存儲大量數據。 – Elias

0

我有一個非常簡單的解決方案。這就是所謂的規範化。正確的建模可以爲查詢的簡單性和準確性創造奇蹟。

但是,您可能會被卡住。假設ExecID是兩個表中的字符串,試試這個:

select * 
from A 
where not exists(
    select * 
    from B 
    where ExecID like '%' || a.ExecID || '%'; 

這是一個可怕的查詢,因爲它在一個每一行執行B的完整表掃描和查詢是容易出錯誤的,所以也許你可以做得更好,但你最好的課程最終是一個數據庫重構。

+0

這是SQL Server的無效語法。 –

+1

是的,我現在正好戴着我的Oracle帽子,但我並不打算讓代碼真正被採用。 '僅供參考。不要在工作中嘗試這個!' – TommCatt