我之前在removing records from a table whose string was contained at the end of another record得到了一个很好的答案(谢谢@Paul Spiegel)。例如,删除' Farm'什么时候动物农场'存在)并按客户字段分组。
事实上,这个问题有点复杂,跨越了三个表格,我希望我可以轻松地扩展逻辑,但事实证明这对我来说也很具挑战性。我有三个表格,而不是一个包含Client
和Term
的表格。
自从我最初发布这个问题以来,我已经取得了一些进展,所以我的立场是Joins
,结果Select
返回我要从查找表(LUT)中删除的字段:
http://sqlfiddle.com/#!9/479c72/45
最终选择是:
Select Distinct(C.Title),T2.Term From LUT L
Inner Join Terms T
On L.TermID=T.ID
Inner Join Terms T2
On T.Term Like Concat('% ', T2.Term)
Inner Join Clients C
On C.ID=L.ClientID;
我正在尝试将其变为Delete
但收效甚微。
答案 0 :(得分:0)
将此附加到您的查询中:
Inner Join LUT L2
On L2.ClientID = L.ClientID
And L2.TermID = T2.ID
这将确保客户确实匹配,您将得到以下结果:
| ClientID | TermID | ID | Term | ID | Term | ID | Title | ClientID | TermID |
|----------|--------|----|---------------|----|-----------|----|-------|----------|--------|
| 1 | 2 | 2 | Small Dog | 1 | Dog | 1 | Bob | 1 | 1 |
| 2 | 5 | 5 | Big Black Dog | 3 | Black Dog | 2 | Alice | 2 | 3 |
要从LUT
表中删除相应的行,请将Select *
替换为Delete L2
。
但删除条款更棘手。由于它是多对多关系,因此该术语可能属于多个客户端。所以你不能只删除它们。您需要在第二个语句中清理表。这可以通过以下声明来完成:
Delete T
From Terms T
Left Join LUT L
On L.TermID = T.ID
Where L.TermID Is Null
演示:http://sqlfiddle.com/#!9/b17659/1
请注意,在这种情况下,术语Medium Dog
也将被删除,因为它不属于任何客户端。