帮助我找出如何为这个JOIN场景构建我的SQL

时间:2010-09-22 12:53:13

标签: sql database join

在撰写本文时我还在尝试学习SQL,所以我现在有点不稳定。

我的情况是这样的:

  1. 我有一个名为'Tasks'的表,其中包含一个自动递增的主键ID和一个文本字段(还有一些与此问题无关的其他内容)。
  2. 我有另一个名为'Locations'的表,其中一个外键引用ID的任务和一个表示该位置名称的文本字段。这些地图集用于给定特定任务(一对多,我认为它被称为)。
  3. 我的代码中有一个包含位置值列表的数据结构。我想查询至少具有与之关联的所有这些位置的任务。
  4. 我还会有其他类似一对多关系的表格,我需要将其作为任务查询的基础。它们也可能用于过滤彼此查询的结果。如何在我的SQL使用中堆叠这些类型的过滤器(与我手动中的结果集之间的AND运算相反)?
  5. 看起来它应该很简单,但我想我现在只是缺乏想象力。在我的路上会有更多这类问题,所以看一个解决这个问题的例子对那些人也有帮助。

3 个答案:

答案 0 :(得分:0)

试试这个:

Select TaskId, LocationName from Task, Location where
Task.TaskId = Location.TaskId and
LocationName in (<all the locations you want to query against>)

您可以发送以逗号分隔的位置列表,并在此查询中使用。如果要使查询可伸缩,则可以创建返回有效/已过滤列表的小SP,而其他SP可以将它们用作输入。你也可以处理这是在编码方面(而不是sql)。

答案 1 :(得分:0)

我从您的描述中获得了什么

declare @tasks table
(
    taskid int,
    taskname varchar(20)
)

declare @locations table
(
    locationid int,
    taskid int,
    locationname varchar(20)
)

insert into @tasks select 1, 'task1'
insert into @tasks select 2, 'task2'
insert into @tasks select 3, 'task3'

insert into @locations select 1, 1, 'location1'
insert into @locations select 2, 1, 'location2'
insert into @locations select 3, 1, 'location3'
insert into @locations select 4, 2, 'location4'
insert into @locations select 5, 2, 'location5'
insert into @locations select 6, 3, 'location6'

select t.taskid, t.taskname, l.locationid, l.locationname
from @tasks t inner join @locations l on t.taskid = l.taskid
where l.locationname in ('location1', 'location4') -- OR locationid

-- You can alos do this like
select t.taskid, t.taskname, l.locationid, l.locationname
from @tasks t inner join @locations l on t.taskid = l.taskid
where l.locationname in (select top 2 locationname from @locations order by locationid desc)

答案 2 :(得分:0)

我刚刚测试了一件小事:

SELECT *
FROM Tasks
WHERE ID IN
  (
    SELECT l.ID
    FROM Location l
    WHERE l.Loc_name IN ('loc1','loc2','loc3')
    GROUP BY l.ID
    HAVING COUNT(l.Loc_name) = 3 -- Number of all location u have in the in clause
  );

你要做的就是设置有克劳斯的号码。

只有在任务没有两次或更多相同的位置时才会有效。

你甚至可以为每个位置做一个Exists子句,但只有它的静态