【问题标题】:Needing multiple where clauses or a better way of conditional statement需要多个 where 子句或更好的条件语句方式
【发布时间】:2016-06-21 16:57:33
【问题描述】:

我正在尝试根据另一个表中是否不存在某个值来确定如何在一个表中显示数据。我研究了案例陈述,但无法弄清楚它如何适用于我目前的情况。

我有两个表,CompanyRequestOffTakeOver,我希望能够从 CompanyRequestOff 中选择列,其中 TransactionIDs 相等,但 User 列不能相同。

任何帮助甚至为我指明正确的方向都会很有用,谢谢。

CompanyRequestOff 表有这些列:

TransactionID
Requestee
RequestedDate
RequestedTimeSlot
RequestedPosition
RequestStatus
LastUpdate
Manager         

TakeOver 表有:

Id
TransactionID
RequestedUser
RequestStatus
LastUpdate
Manager

这是我解决这个问题的尝试:

SELECT
    CompanyRequestOff.TransactionID, CompanyRequestOff.Requestee,
    CompanyRequestOff.RequestedDate, CompanyRequestOff.RequestedTimeSlot,
    CompanyRequestOff.RequestedTimeSlot, CompanyRequestOff.RequestedPosition,
    CompanyRequestOff.RequestStatus, CompanyRequestOff.LastUpdate, 
    CompanyRequestOff.Manager 
FROM
    CompanyRequestOff, TakeOver 
WHERE
    RequestedDate > GETDATE() 
    AND CompanyRequestOff.RequestStatus = 'Requested' 
    AND CompanyRequestOff.TransactionID = TakeOver.TransactionID  
    AND TakeOver.RequestedUser != @UserN;

唯一相关的列是transactionID 列,它在CompanyRequestOff 中是主要的,在TakeOver 中是外来的。我想显示CompanyRequestOff 表中的列,其中TakeOver 中没有行与transactionID 但只有当它包含某个TakeOver.RequestedUser 值时。

【问题讨论】:

  • 不能只是连接上的复合条件吗? Select * from CompanyRequestOff CRO LEFT JOIN takeOver TO on TO.TransactionID = CRO.TransactionID and CRO.User <> TO.User

标签: sql tsql conditional


【解决方案1】:

听起来你想在两种情况下join这两个表:

SELECT *
FROM CompanyRequestOff CRO
JOIN TakeOver TO on TO.TransactionID = CRO.TransactionID and TO.User <> CRO.User

更新以说明您的编辑:

我想显示 CompanyRequestOff 中的列 表中 TakeOver 中没有具有该 transactionID 但的行 仅当它包含某个 TakeOver.RequestedUser 值时。

您可以使用 where transactionID not in 子句实现其中的 transactionID 部分:

SELECT *
FROM CompanyRequestOff
WHERE TransactionID not in 
     (SELECT TransactionID FROM TakeOver)

然后在用户部分添加:

SELECT *
FROM CompanyRequestOff
WHERE TransactionID not in 
    (SELECT TransactionID FROM TakeOver WHERE RequestedUser <> @UserN)

以及您查询中的所有逻辑:

SELECT *
FROM CompanyRequestOff
WHERE TransactionID not in 
    (SELECT TransactionID FROM TakeOver WHERE RequestedUser <> @UserN)
AND RequestedDate > GETDATE()
AND RequestStatus = 'Requested'

【讨论】:

  • 这不会为我显示数据,因为这会告诉我用户值在哪里相同,而我想查看它们在哪里不同。 TakeOver 用户和 CompanyRequestOff 用户之间没有任何关系。
  • 这成功了!唯一的事情是我必须将 '@UserN' 更改为 = '@UserN' 因为你的方式包括带有该用户名的 TransactionID 但这对我非常感谢。
【解决方案2】:

查看您的问题,CompanyRequestOffTakeOver - UserTransactionID 之间似乎有两个共同的列。因此,您的查询应该是从CompanyRequestOff 中选择所有记录,其中TransactionID 匹配但user 不匹配。

select c.* from CompanyRequestOff c, TakeOver t
where c.TransactionId = t.TransactionId 
and c.user != t.user

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多