0

2008 年 2 月 12 日に注文を処理しなかったすべての empids を取得したいというクエリがあります。

Select Distinct E.empid, lastname, firstname 
    From HR.Employees as E
    INNER JOIN Sales.Orders as O
    ON E.empid = O.empid 
    Where O.orderdate <> Convert(datetime,'02/12/2008',101)

NOT IN、EXISTS、またはセット演算子の使用は適用できません。誰かが本物の解決策と説明を得ることができますか

4

4 に答える 4

1

これを行う 1 つの方法は、左外部結合を使用することです。

Select Distinct E.empid, lastname, firstname 
From HR.Employees as E left outer join
     Sales.Orders as O
     ON E.empid = O.empid and O.orderdate = Convert(datetime,'02/12/2008',101)
where o.orderdate is NULL

その日付の従業員と注文が一致する場合、where句はそれらのレコードを無視します。

このクエリはロジックを言い換えています。あなたは、「2008 年 2 月 12 日に注文を処理しなかった empids をすべて取得したい」と言います。これが機能する方法は、従業員をその日の注文に実際に一致させることです。ただし、 を使用するためleft outer join、一致がない場合、一致は NULL のままになります。これらはあなたが望むものです。

ある意味では、このクエリは、「これこれの日付で注文に一致しないすべての empids が必要です」という同等の質問に答えます。

于 2013-01-23T18:32:20.960 に答える
0
Select E.empid, lastname, firstname 
    From HR.Employees as E
WHERE NOT EXISTS (SELECT O.Empid FROM Sales.Orders as O
    WHERE O.empid = E.EmpID
    AND O.orderdate = '02/12/2008')

編集:注文テーブルには、それを処理しなかった従業員の特定の日付のレコードがないことを前提としています。

Select E.empid, lastname, firstname, MAX(O.OrderDate) 
    From HR.Employees as E LEFT JOIN Sales.Orders as O
    ON O.empid = E.EmpID
    WHERE O.orderdate = '02/12/2008'
GROUP BY E.empid, lastname, firstname
HAVING MAX(O.OrderDate) IS NULL

EDIT2:私はこれを試していません。LEFT JOIN、、MAXおよびを使用して何が行われているのかを理解していただければ幸いですHAVING

于 2013-01-23T18:03:32.000 に答える
0

日付の比較のみを行う場合は、trunc を使用する必要があります。これを試して

Select Distinct E.empid, lastname, firstname 
    From HR.Employees as E
    INNER JOIN Sales.Orders as O
    ON E.empid = O.empid 
    Where trunc(O.orderdate) <> trunc(TO_DATE('02/12/2008','MM/DD/YYYY'))
于 2013-01-23T18:05:05.977 に答える
0

Sql サーバーの場合:

問題はあなただと思いますdate formatyyyymmdd代わりにISO 形式 ( ) を使用してみてください。また、右側に時間がないため、それ以外の場合は;o.orderdate should be a date type field として変換します。convert(date,O.orderdate) <> Convert(date,'20081202')

Select Distinct E.empid, lastname, firstname 
From HR.Employees as E
INNER JOIN Sales.Orders as O
ON E.empid = O.empid 
Where convert(date,O.orderdate) <> Convert(date,'20081202')
于 2013-01-23T18:08:55.823 に答える