2014-05-21 277 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