替代SQL中的except

时间:2019-07-02 19:07:25

标签: sql-server left-join except

我想使用除外的替代项。我使用了左联接,但没有带来所需的列数据。

SELECT ACCOUNT_NO, BILL_CYCLE_DATE, 2 FROM CSS_BILL_Job 
WHERE (BILL_CYCLE_DATE = 20190526 OR  BILL_CYCLE_DATE = 20190525) --33612
EXCEPT
SELECT DISTINCT ACCOUNT_NO, BILL_CYCLE_DATE, 2  FROM TempNotRunResults --33505

但是现在我使用LEFT JOIN。

SELECT A.ACCOUNT_NO, A.BILL_CYCLE_DATE, B.DATE_BILLED,
B.DATE_PAYMENT_DUE,B.TOTAL_BILL_AMT, B.LPC_AMT, B.BILL_FREQ, B.BILL_CYCLE_TYPE
FROM CSS_BILL_Job A LEFT JOIN TempNotRunResults B
ON A.ACCOUNT_NO  = B.ACCOUNT_NO
WHERE (A.BILL_CYCLE_DATE = 20190526 OR  A.BILL_CYCLE_DATE = 20190525)
AND A.ACCOUNT_NO NOT IN ( SELECT ACCOUNT_NO FROM TempNotRunResults)

我看到B.DATE_PAYMENT_DUE,B.TOTAL_BILL_AMT,B.LPC_AMT,B.BILL_FREQ,B.BILL_CYCLE_TYPE为NULL,这是不正确的。如何在“左联接”查询中填充表B中的列?

2 个答案:

答案 0 :(得分:0)

如果您不希望表TempNotRunResults中的null,请使用此联接:

SELECT A.ACCOUNT_NO, A.BILL_CYCLE_DATE, B.DATE_BILLED,
B.DATE_PAYMENT_DUE,B.TOTAL_BILL_AMT, B.LPC_AMT, B.BILL_FREQ, B.BILL_CYCLE_TYPE
FROM CSS_BILL_Job A LEFT JOIN TempNotRunResults B
ON A.ACCOUNT_NO = B.ACCOUNT_NO 
WHERE 
  (A.BILL_CYCLE_DATE = 20190526 OR  A.BILL_CYCLE_DATE = 20190525)
  AND 
  B.ACCOUNT_NO IS NOT NULL

条件B.ACCOUNT_NO IS NOT NULL仅获取匹配的行,这也可以通过使用INNER连接来完成:

SELECT A.ACCOUNT_NO, A.BILL_CYCLE_DATE, B.DATE_BILLED,
B.DATE_PAYMENT_DUE,B.TOTAL_BILL_AMT, B.LPC_AMT, B.BILL_FREQ, B.BILL_CYCLE_TYPE
FROM CSS_BILL_Job A INNER JOIN TempNotRunResults B
ON A.ACCOUNT_NO = B.ACCOUNT_NO
WHERE (A.BILL_CYCLE_DATE = 20190526 OR  A.BILL_CYCLE_DATE = 20190525)


但是您的问题的标题是:“ sql以外的替代项” ,这与您要实现的含义相反:从中填充列左联接查询中的表B ,因为如果要从表B中填充行,则需要匹配的行。

答案 1 :(得分:0)

您似乎不太了解EXCEPT的功能。它从第一个结果集中返回与第二个结果集中的任何内容都不匹配的不同行。并请注意,使用distinct生成第二个结果集没有任何效果。

要使用联接获得等效的结果,您需要进行外部联接(如您所做的那样),但要测试未保留表(TempNotRunResults)中行的不存在。像这样:

The OSRM server returned an error:
Error in function (type, msg, asError = TRUE) : Failed to connect to router.project-osrm.org port 80: Timed out

请注意加入版本中的重复项。 EXCEPT删除重复项。而且由于EXCEPT告诉我们TempNotRunResults中没有匹配项,因此在连接时尝试从该表中包含列是没有意义的-简而言之,没有列,并且除了NULL外,您不应期望任何其他内容。但是,您确实在加入版本中仅靠ACCOUNT_NO加入。那是非常不同的逻辑,因此很难知道您到底想完成什么。这使我们回到了Han的要求-发布样本数据和您的预期结果。