我有两个包含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)
答案 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的完整表扫描,并且子查询容易受到错误命中,所以也许你可以做得更好,但你最好的方法最终是数据库重构。