使用A在哪里加入?

时间:2015-02-10 18:24:48

标签: sql sql-server

下面是我的表结构的一小段(足以显示我需要完成的内容),并且我无法正确获取语法以实现最终结果。我需要完成的是显示来自#newdatabase的所有记录(这是简单的部分,一个select *语句)如果#olddatabase中存在记录,则只有它们是employeename的空值才排除它。我尝试了这个查询,但没有尝试返回的结果集。

Select #newdatabase.orderID
FROM #newdatabase
LEFT JOIN #oldDatabase
ON #oldDatabase.orderID = #newdatabase.oldorderID
WHERE #oldDatabase.orderID IS NULL
AND #oldDatabase.employeename IS NULL

这是我的表结构

Create Table #oldDatabase
(
  orderID int,
  employeename varchar(100)
)

Create Table #newdatabase
(
  orderID int,
  oldorderID int
)

INSERT INTO #oldDatabase Values
(1, NULL),(2, NULL),(3, 'Mitch'),(4,'Sam'),(5, 'Streith'),(6, 'Azul'),(7,'Reta'),(8,'Frank'),(9,'Fred'),(10,'Nick'),
(11, NULL),(12, NULL),(13, NULL), (14, NULL), (15, NULL), (16, NULL)

INSERT INTO #newdatabase Values
(100,1), (101,2), (102,3), (103,4), (104,5), (105,6), (106,7), (107,8),     (108,9),
(109,10), (110,11), (111,12), (112,13), (113,Null),(114,Null), (115,NULL), (116,NULL),
(117,Null), (118,Null), (119,Null), (120,Null), (121,Null), (122,Null), (123,Null)

EDITORIAL - 我希望在#newdatabase中看到记录,其中1)它们在#olddatabase中不存在或2)如果它们存在于#olddatabase中且employeename为null。 Des澄清了吗?

2 个答案:

答案 0 :(得分:0)

有几种方法可以实现这一点,我建议第一种:

    Select #newdatabase.orderID
      FROM #newdatabase
 LEFT JOIN #oldDatabase
        ON #oldDatabase.orderID = #newdatabase.oldorderID
       AND #oldDatabase.employeename IS NOT NULL
     WHERE #oldDatabase.orderID IS NULL

或者

    Select #newdatabase.orderID
      FROM #newdatabase
 LEFT JOIN #oldDatabase
        ON #oldDatabase.orderID = #newdatabase.oldorderID
     WHERE #oldDatabase.employeename IS NULL

    Select #newdatabase.orderID
      FROM #newdatabase
     WHERE #newdatabase.orderID NOT IN
           ( SELECT #oldDatabase.orderID 
               FROM #oldDatabase
              WHERE #oldDatabase.employeename IS NOT NULL)

答案 1 :(得分:0)

请尝试以下方法。

(Select #newdatabase.orderID
FROM #newdatabase
EXCEPT
SELECT #oldDatabase.orderID
FROM #oldDatabase)
UNION
SELECT #oldDatabase.orderID
FROM #oldDatabase
AND #oldDatabase.employeename IS NULL

UNION运算符默认情况下仅选择不同的值。要允许重复值,请在UNION中使用ALL关键字。(source