1

私は AdventureWorks サンプル DB を使用しています。SQL Server 2008R2 を実行しているので、AdventureWorks のエディションだと思います (読み取り専用アクセス権があります)。従業員とマネージャーの関係を特定できるように、セールス マネージャーのリストを取得しようとしています。同じ役職で、わずかに異なるクエリで CurrentFlag が 1 (アクティブ) に設定された、名前の異なる 3 人の 2 組を取得しています。1 つの結果グループに同じ contactID と employeeID があることに気付きましたが、これが何を示しているのかはわかりません。

問題は、これら 2 つのクエリでまったく異なる結果が得られるのはなぜですか? それぞれに対して 6 つの結果が得られると思います。クエリは従業員テーブルのタイトルと一致しています。

  • SQL クエリ 1:

    select 
       c.FirstName, 
       c.LastName, 
       c.ContactID, 
       e.EmployeeID, 
       e.Title, 
       c.Title, 
       e.CurrentFlag
    from Person.Contact c 
    inner join HumanResources.Employee e
       on c.ContactID = e.ContactID
    where 
       e.Title like '%Sales Manager%'
    
  • SQL クエリ 2:

    SELECT 
       e.EmployeeID, 
       (c.FirstName + ' ' + c.LastName) as 'First Name and Last Name', 
       e.Title
    FROM HumanResources.Employee e 
    INNER JOIN Person.Contact c
        ON e.EmployeeID = c.ContactID
    Where 
        e.Title LIKE '%Manager%'
        AND
        e.Title LIKE '%Sales%'
    ORDER BY e.EmployeeID;
    

更新: これらは私の結果です:

  • SQL クエリ 1:

    -------  -------  ----  ---  ----------------------------  ----  --
    Stephen  Jiang    1011  268  North American Sales Manager  NULL  1
    Amy      Alberts  1013  284  European Sales Manager        NULL  1
    Syed     Abbas    1012  288  Pacific Sales Manager         Mr.   1
    
  • SQL クエリ 2:

    ---  ---  -----------  ----------------------------  ---  --
    268  268  Gary Drury   North American Sales Manager  Mr.  1
    284  284  John Emory   European Sales Manager        Mr.  1
    288  288  Julie Estes  Pacific Sales Manager         Ms.  1
    
4

2 に答える 2

1

私が見ることができる唯一の違いはこれです:

where 
   e.Title like '%Sales Manager%'

この:

Where 
 e.Title LIKE '%Manager%'
    AND
  e.Title LIKE '%Sales%'

最初のクエリは、次の'%Sales Manager%'出力で使用できるすべてのタイトルを取得することを示しています。

Account Sales Manager
some Sales Manager
Sales Manager something else

'%Manager%2 番目の質問では、 ' を含むすべてのタイトルを持ってきて'%Sales%'ください。

Sales Account Manager
some Sales some Manager some 
Sales Manager some else thing
Manager Sales

そして、この結合は正しくありません

INNER JOIN Person.Contact c
    ON e.EmployeeID = c.ContactID

あなたは意味しません:

INNER JOIN Person.Contact c
        ON e.ContactID= c.ContactID
于 2012-04-06T16:35:05.787 に答える
1

最初のクエリは、部分文字列 "Sales Manager" が存在する行に一致します。ただし、2 つ目は「Managers of Sales Dep」などの行にも一致する可能性があります。つまり、2番目は文字列内の単語の位置を気にしません。

最初のクエリの結果は、2 番目のクエリの結果のサブセットであると思います。

UPDATE JOIN 句で異なる列を使用するため、異なる結果が得られるのは正常です。

于 2012-04-06T16:35:19.997 に答える