根据条件查找既存在又不存在的值(SQL Server)

根据条件查找既存在又不存在的值(SQL Server),sql,sql-server,Sql,Sql Server,我对SQL很陌生。我有一个列为“Model_Id”和“Tran_date”的“Transactions”表。我有另一个“Model”表,其中包含“Model\u Id”和“Model\u Name”列。我想要“交易”表中的所有型号名称,这些型号在2017年售出,但不是在2018年售出。如何使用Where语句在SQL Server中获取所需的值?希望这有帮助 SELECT m.Model_Name FROM Transactions t JOIN Model m on m.model_id=t.m

我对SQL很陌生。我有一个列为“Model_Id”和“Tran_date”的“Transactions”表。我有另一个“Model”表,其中包含“Model\u Id”和“Model\u Name”列。我想要“交易”表中的所有型号名称,这些型号在2017年售出,但不是在2018年售出。如何使用Where语句在SQL Server中获取所需的值?

希望这有帮助

SELECT m.Model_Name
FROM Transactions t
JOIN Model m on m.model_id=t.model_id
    and year(t.tran_date)=2017
LEFT JOIN Model mm on mm.model_id=t.model_id
    and year(t.tran_date)=2018
WHERE mm.model_id is null
希望这有帮助

SELECT m.Model_Name
FROM Transactions t
JOIN Model m on m.model_id=t.model_id
    and year(t.tran_date)=2017
LEFT JOIN Model mm on mm.model_id=t.model_id
    and year(t.tran_date)=2018
WHERE mm.model_id is null

欢迎来到堆栈溢出。尽管我在这里以伪SQL的形式提供了一个答案,但在发布这样的问题时,您确实需要至少提供示例数据和预期结果。否则,这里的志愿者必须猜测您的DDL和数据,这可能意味着它将是错误的,但可能会有所帮助

但是,正如我上面所说,这是伪SQL,但应该可以帮助您:

SELECT YourColumns
FROM Model M
WHERE EXISTS (SELECT 1
              FROM [Transaction] T
              WHERE T.ModelID = M.ModelID
                AND T.TranactionDate >= '20170101'
                AND T.TranactionDate < '20180101')
  AND NOT EXISTS (SELECT 1
                  FROM [Transaction] T
                  WHERE T.ModelID = M.ModelID
                    AND T.TranactionDate >= '20180101'
                    AND T.TranactionDate < '20190101');

欢迎来到堆栈溢出。尽管我在这里以伪SQL的形式提供了一个答案,但在发布这样的问题时,您确实需要至少提供示例数据和预期结果。否则,这里的志愿者必须猜测您的DDL和数据,这可能意味着它将是错误的,但可能会有所帮助

但是,正如我上面所说,这是伪SQL,但应该可以帮助您:

SELECT YourColumns
FROM Model M
WHERE EXISTS (SELECT 1
              FROM [Transaction] T
              WHERE T.ModelID = M.ModelID
                AND T.TranactionDate >= '20170101'
                AND T.TranactionDate < '20180101')
  AND NOT EXISTS (SELECT 1
                  FROM [Transaction] T
                  WHERE T.ModelID = M.ModelID
                    AND T.TranactionDate >= '20180101'
                    AND T.TranactionDate < '20190101');

这如何消除2018年销售的车型?此外,在WHERE或JOIN子句中使用YEAR将使您的查询不可搜索,这对于一个大的表将导致显著的性能损失。我刚刚读过,编辑了答案。并同意大桌子。这如何消除2018年销售的车型?此外,在WHERE或JOIN子句中使用YEAR将使您的查询不可搜索,这对于一个大的表将导致显著的性能损失。我刚刚读过,编辑了答案。并同意使用大表。这假设TransactionDate具有某种合理的格式,正式为“YYYY-MM-DD”或00:00:0000时间组件。@Yogesharma假设OP将日期数据存储为日期时间。如果他们不是,那么他们的数据设计就有一个最根本的问题!日期数据不是以某种格式存储的,yyyyMMdd是一种确定性输入格式,因此将始终按照正确的数据类型工作;这意味着如果他们使用的是正确的数据类型,那么你的观点就不相关了,因为数据没有格式;选择@DT;设置@DT='01/01/1900';选择@DT;将保留2个相同的数据集,因为datetime不会存储所使用的格式。这假设TransactionDate具有某种合理的格式,正式为“YYYY-MM-DD”或00:00:0000时间组件。@Yogesharma假设OP将日期数据存储为datetime。如果他们不是,那么他们的数据设计就有一个最根本的问题!日期数据不是以某种格式存储的,yyyyMMdd是一种确定性输入格式,因此将始终按照正确的数据类型工作;这意味着如果他们使用的是正确的数据类型,那么你的观点就不相关了,因为数据没有格式;选择@DT;设置@DT='01/01/1900';选择@DT;将保存2个相同的数据集,因为datetime不会存储所使用的格式。