SQL查询多个表

时间:2014-05-07 02:15:27

标签: sql sql-server-2008

我正在尝试合并以下查询。我有三个表

  • 1是包含登录信息的表。
  • 2是包含变量的表。
  • 3是包含变量数据的表。

对于table 1 (login)中的每条记录,tables 2 & 3中都有相应的记录。所有三个表中的 唯一,以及对应的变量中的到可变数据。

我想根据一个值在table 1(登录)中提取唯一记录,该值还根据特定值在tables 2 & 3中包含记录。

目前我的记录太多了。我已经能够将各种结果集放入Excel sort by key and remove duplicates。由于table 2包含我需要的两个不同变量,因此我仍然会为每个变量显示两条记录,因为数据是唯一的。有意义吗?

表1

WebSecurityLoginID PK
ProgramID FK

表2

ProgramID PK FK
VariableNo PK

表3

WebSecurityLoginID PK FK
ProgramID PK FK
VaraibleNo PK FK 

因此对于表2和表2 3我有以下内容:

SELECT 
    d.WebSecurityLoginID, d.LoginVariableData
FROM 
    dbo.WebLoginVariableData d
WHERE 
    d.ProgramID = 101809 
    AND d.VariableNo = 1 
    AND d.LoginVariableData = 'not yet responded' 

UNION 

SELECT 
    d.WebSecurityLoginID, d.LoginVariableData
FROM 
    dbo.WebLoginVariableData d
WHERE 
    d.ProgramID = 101809 
    AND d.VariableNo = 2 
    AND d.LoginVariableData = 'EAST'
ORDER BY 
    d.WebSecurityLoginID

这给了我比需要更多的记录。我需要intersection

我还想从表1中提取与表2和表2相关的以下信息。 3:

SELECT 
    w.WebSecurityLoginID, w.LoginID, w.LastName, w.FirstName, w.EmailAddress
FROM 
    dbo.WebSecurityLogin w 
INNER JOIN 
    dbo.WebLoginVariables v ON w.ProgramID = v.ProgramID 
WHERE 
    w.ProgramID = 101809

我不知道如何把它们放在一起。我想我需要INNER JOIN,但是当我尝试时,我会得到意想不到的结果。

请帮助。我尝试过几个例子,但我仍然没有得到预期的结果。

谢谢。

1 个答案:

答案 0 :(得分:0)

我不确定这些问题,因为对于你的表2& 3只有一张桌子 我假设WebLoginVariableData是表3,WebSecurityLogin是表1.

对于交集,您可以检查查询中出现两次的值,但是可以在没有UNION

的情况下重写查询
SELECT WebSecurityLoginID
     , LoginVariableData
FROM   dbo.WebLoginVariableData
WHERE  ProgramID = 101809 
 AND   ((VariableNo = 1 AND LoginVariableData = 'not yet responded')
     OR (VariableNo = 2 AND LoginVariableData = 'EAST'))
GROUP BY WebSecurityLoginID, LoginVariableData
HAVING COUNT(WebSecurityLoginID) = 2
   AND COUNT(LoginVariableData) = 2
ORDER BY WebSecurityLoginID

在SQLServer 2012中,添加了INTERSECT运算符以获得类似

的内容
SELECT d.WebSecurityLoginID, d.LoginVariableData
FROM   dbo.WebLoginVariableData d
WHERE  d.ProgramID = 101809 
  AND  d.VariableNo = 1 
  AND  d.LoginVariableData = 'not yet responded' 
INTERSECT
SELECT d.WebSecurityLoginID, d.LoginVariableData
FROM   dbo.WebLoginVariableData d
WHERE  d.ProgramID = 101809 
  AND  d.VariableNo = 2 
  AND  d.LoginVariableData = 'EAST'
ORDER BY d.WebSecurityLoginID

我不确定理解第二个请求,如果您需要从表1中获取与上一个查询结果相关的数据,则可以将其用作CTE并将其连接到表1

WITH Security AS (
  SELECT WebSecurityLoginID
       , LoginVariableData
       , ProgramID
  FROM   dbo.WebLoginVariableData
  WHERE  ProgramID = 101809 
   AND   ((VariableNo = 1 AND LoginVariableData = 'not yet responded')
       OR (VariableNo = 2 AND LoginVariableData = 'EAST'))
  GROUP BY WebSecurityLoginID, LoginVariableData
  HAVING COUNT(WebSecurityLoginID) = 2
     AND COUNT(LoginVariableData) = 2
)
SELECT w.WebSecurityLoginID, w.LoginID, w.LastName, w.FirstName, w.EmailAddress
FROM   dbo.WebSecurityLogin w 
       INNER JOIN Security s ON w.ProgramID = s.ProgramID 
                            AND w.WebSecurityLoginID = s.WebSecurityLoginID

ProgramID列已添加到主查询中的CTEJOIN