我正在尝试合并以下查询。我有三个表。
对于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
,但是当我尝试时,我会得到意想不到的结果。
请帮助。我尝试过几个例子,但我仍然没有得到预期的结果。
谢谢。
答案 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列已添加到主查询中的CTE
到JOIN
。