我们在SQL Server中有3个表(Tasks, Tags, Task_To_Tags
)
TASK
----
Id
TAGS
----
Id
Name
TASK_TO_TAGS
-----------
Id
TagId
TaskId
我尝试了两个不同的查询,但没有一个返回正确的结果。
SELECT
Task.Id
FROM
Task
LEFT OUTER JOIN
(Task_to_Tag
JOIN
Tags ON Tags.Id = Task_to_Tag.TagId
AND Tags.Name = 'HT') ON Task_to_Tag.Id = Task.Id
SELECT
task.Id
FROM
task
INNER JOIN
(SELECT
s2t.*
FROM
task_to_Tag AS s2t
INNER JOIN
Tags t ON s2t.TagId = t.Id
WHERE
t.Name = 'HT') AS s2Tags ON task.Id = s2Tags.TaskId
问题:当多个标签与Task相关联时,要么返回第一个查询的所有Task,第二个查询都不返回。
任务数据:
123456
1234567
12345678
标记数据:
Id: 1 & Name: Test1
Id: 2 & Name: Test2
Task_To_Tags
Id: 1, TagId: 1, TaskId: 123456
Id: 2, TagId: 1, TaskId: 1234567
Id: 3, TagId: 1, TaskId: 12345678
按标签名称搜索:Test1应检索所有任务(123456、1234567和12345678)
答案 0 :(得分:0)
在上面汤姆·德雷克(Tom Drake)的评论中,有两种可能的解决方案。哪种方法有效取决于TASK_TO_TAGS.ID
的含义。如果那标识了TASK_TO_TAGS中的记录,请尝试第二种解决方案。
可能的解决方案#1
SELECT TASK.ID
FROM TASK INNER JOIN TASK_TO_TAGS
ON TASK.ID = TASK_TO_TAGS.ID
INNER JOIN TAGS
ON TASK_TO_TAGS.TAGID = TAGS.ID
WHERE TAGS.NAME = 'HT'
可能的解决方案2
SELECT TASK.ID
FROM TASK INNER JOIN TASK_TO_TAGS
ON TASK.ID = TASK_TO_TAGS.STEPID
INNER JOIN TAGS
ON TASK_TO_TAGS.TAGID = TAGS.ID
WHERE TAGS.NAME = 'HT'
答案 1 :(得分:0)
我没有加入的理由。您需要名为“ Test1”的标记的任务ID,因此请使用适当的where子句:
select taskid
from task_to_tags
where tagid = (select id from tags where name = 'test1');
如果要显示一些任务详细信息(例如,您忘记提及的任务表中的任务描述),则将上面的内容与任务表结合起来,或将其与IN
一起使用:
select *
from task
where id in
(
select taskid
from task_to_tags
where tagid = (select id from tags where name = 'test1')
);