用于评估多个相关表的SQL语句

时间:2009-05-07 14:48:16

标签: sql sql-server

我有一个Projects表,其中列出了客户端信息。然后我有四个相关的工作表,用于该项目中的工作 - Roofing,Siding,Gutters和Misc。这四个表有一个projectID字段,用于将它们链接到Projects表,它们都有一个'status'字段。项目可以有任意组合。

我希望只能选择所有作业状态字段标记为“已完成”的项目。

可能有一种简单的方法可以做到这一点,但我的大脑有时会用SQL过热。

5 个答案:

答案 0 :(得分:3)

也许...

SELECT * FROM Projects
LEFT JOIN Roofing ON (projectID)
LEFT JOIN Siding ON (projectID)
LEFT JOIN Gutters ON (projectID)
LEFT JOIN Misc ON (projectID)
WHERE (Roofing.status IS NULL OR Roofing.status="completed")
AND (Siding.status IS NULL OR Siding.status="completed")
AND (Gutters.status IS NULL OR Gutters.status="completed")
AND (Misc.status IS NULL OR Misc.status="completed")

答案 1 :(得分:2)

select p.* 
from project as p
where not exists (select 1 from roofing where projectId = p.projectId and status <> 'completed')
    and not exists (select 1 from siding where projectId = p.projectId and status <> 'completed')
    and not exists (select 1 from gutters where projectId = p.projectId and status <> 'completed')
    and not exists (select 1 from misc where projectId = p.projectId and status <> 'completed')

答案 2 :(得分:2)

Alex的方法将在一行中获取所有信息(如果子表中没有多个记录),但如果需要,一个separtes行尝试union all语句。只需确保在每个联合中使用相同的列。如果您在一个或多个表中有其他表没有的数据,那么您将使用null作为该列中该列的值。

SELECT p1.projectid,'roofing' as JobType FROM Projects p1
JOIN Roofing r ON p1.projectID = r.projectID
union all
SELECT p1.projectid,'gutters' as JobType FROM Projects p1
JOIN gutters g ON p1.projectID = g.projectID
union all
SELECT p1.projectid,'siding' as JobType FROM Projects p1
JOIN Siding s ON p1.projectID = s.projectID
union all
SELECT p1.projectid,'misc' as JobType FROM Projects p1
JOIN Misc m ON p1.projectID = m.projectID

答案 3 :(得分:0)

SELECT *
FROM Projects
  --Step 3: filter the projects by the results from Step2
WHERE ProjectID not in
(
  SELECT ProjectID
  FROM
  (
    --Step 1: gather all the jobs into one bucket
    SELECT ProjectID, Status
    FROM Roofing
      UNION ALL
    SELECT ProjectID, Status
    FROM Siding
      UNION ALL
    SELECT ProjectID, Status
    FROM Gutters
      UNION ALL
    SELECT ProjectID, Status
    FROM Misc
  ) as Jobs
  --Step 2: find incomplete project IDs
  GROUP BY Jobs.ProjectID
  HAVING MIN(Jobs.Status) != 'COMPLETED'
    OR MAX(Jobs.Status) != 'COMPLETED'
)

答案 4 :(得分:0)

创建一个视图,为“所有已完成的作业”返回不同的ProjectId,并将其连接到Projects表。这样,如果“完成所有作业”的条件发生变化,您只需更新视图,例如如果添加了新工作。视图的SQL语句可以通过多种方式构建,如其他答复中所示。