尝试实施内部联接

时间:2018-11-05 22:49:20

标签: sql sql-server

我们在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)

2 个答案:

答案 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')
);