0

次のクエリがありますが、クエリ対象の名前の行がある場合でも、where句の結果は返されません。where句を削除すると、OfficeLocationテーブルを持つCompanyテーブルのすべてのレコードが返されます。私のクエリの何が問題になっていますか?

SELECT c.* 
FROM        [MyDb].[dbo].[Company] AS c
INNER JOIN  [MyDb].[dbo].[CompanyOfficeLocation] AS col ON c.Id = col.CompanyId
INNER JOIN  [MyDb].[dbo].[OfficeLocation] AS ol ON ol.Id = col.OfficeLocationId
WHERE ol.Name like '%Actual Name In This Table%';

テーブル構造:

Company
    Id
    etc ...

CompanyOfficeLocation
    CompanyId
    OfficeLocationId

OfficeLocation
    Id
    etc ...
4

2 に答える 2

1

クエリを指定してレコードを表示するには、次の 2 つのことを行います。

  1. 指定した OfficeLocation (ol.Name 値を指定) には、その OfficeLocationId の CompanyOfficeLocation テーブルのレコードで使用される Id 値が必要です。

  2. #1 で取得した CompanyOfficeLocation レコードには、Company テーブルに存在する CompanyId が必要です。

これら 2 つの条件のいずれかが満たされない場合、クエリ結果にレコードは表示されません。INNER JOIN は本質的に「AND」句です。レコードを少なくとも 1 つの INNER JOIN テーブルに関連付けることができなかった場合、そのレコードはまったく表示されません。

結合されたテーブルに関連するレコードがなくてもレコードを表示したい場合は、OUTER JOINの使用を検討してください。正確には、あなたの場合はRIGHT JOINです。

于 2012-06-04T06:10:32.373 に答える
1

間違いはありませんが、ON標準を維持するために、参加後に列を切り替えることをお勧めします。

それ以外の -INNER JOIN [MyDb].[dbo].[OfficeLocation] AS ol ON ol.Id = col.OfficeLocationId

行う -INNER JOIN [MyDb].[dbo].[OfficeLocation] AS ol ON col.OfficeLocationId = ol.Id

于 2012-06-04T05:43:38.173 に答える