SQL包含查询

时间:2014-05-21 17:15:29

标签: sql sql-server

我有两个包含ID的表(A和B),但是在表B中,一些记录将这些ID组合在一起,例如IDExec列可能包含一个类似于'的记录。 id1 id2'。我试图找到表A中没有出现在表B中的ID。我想通过使用类似的东西:

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

这不是包含需要第二个参数的字符串,text_lex或变量。

你们有解决这个问题的方法吗?

为了更清楚地了解上述问题,表格结构如下:

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

我为操纵表A中的buysell数据而创建的C#代码将给定日期的同一产品的所有买卖组合起来。现在的问题是你们如何将这种情况正常化,以免我对IDExec进行混蛋?在表B中创建一个名为AllocID的新ID列并将这两个表链接起来会更好吗?所以像这样:

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

3 个答案:

答案 0 :(得分:0)

这有点粗糙,但它会为A中的所有条目提供B中未包含的内容。

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

答案 1 :(得分:0)

这些数据应该被标准化,在一个字段中存储多个值是一个坏主意。

解决方法是使用LIKE

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

这是根据您的示例使用空格分隔值。

答案 2 :(得分:0)

我有一个非常简单的解决方案。它被称为正常化。正确的建模可以为查询的简单性和准确性带来奇迹。

但是,你可能会被你所拥有的东西困住。假设ExecID是两个表中的字符串,请尝试:

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

这是一个可怕的查询,因为它对A中的每一行执行B的完整表扫描,并且子查询容易受到错误命中,所以也许你可以做得更好,但你最好的方法最终是数据库重构。