WHERE句を使用したJOINの後のSQL WHERE文

いくつかのデータを選択しようとしています。3つのテーブルを結合していますが、結合の1つにwhereステートメントがあります。結合が完了したら、日付範囲と場所を選択するために別のwhereステートメントを追加する必要があります。 2番目のWHERE句にエラーがあります。

  SELECT a.[ID]
      ,a.[item_no]
      ,a.[qty]
  FROM [MYDB].[dbo].[details] AS a


  INNER JOIN [MYDB].[dbo].[delivery] AS b
  ON a.[item_no] = b.[item_no]
  INNER JOIN [MYDB].[dbo].[options] AS c
  ON a.[number] = c.[number] 
  WHERE a.[item_no] = c.[item_no]

WHERE b.[destination] = 'my destination'
AND b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 

本当に助けをいただければ幸いです。

ありがとう

1
エラーが発生した場合は、質問に投稿する必要があります。2つの解決策があります。1つは条件をONに追加すること、もう1つはANDで最後のWHEREに追加することです。
追加された 著者 Sami,
AND を使って ON に追加することに慣れることをお勧めします。結果は異なる場合がありますが、 JOIN を絞り込む場合は、考えているのは JOIN であり、他の参加
追加された 著者 Red,

6 答え

以下で試してください

SELECT a.[ID]
      ,a.[item_no]
      ,a.[qty]
  FROM [MYDB].[dbo].[details] AS a


  INNER JOIN [MYDB].[dbo].[delivery] AS b
  ON a.[item_no] = b.[item_no]
  INNER JOIN [MYDB].[dbo].[options] AS c
  ON a.[number] = c.[number] 
  and a.[item_no] = c.[item_no]

WHERE b.[destination] = 'my destination'
AND b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 
4
追加された
JOIN に別の条件を追加するには、 AND を使用します。これは、 WHERE に追加するのと同じとは限りませんので、注意してください。
追加された 著者 Red,

JOINステートメントで WHERE の代わりに AND を使用してください。

2
追加された

Just add WHERE clause & move a.[item_no] = c.[item_no] with ON clause :

SELECT a.[ID], a.[item_no], a.[qty]
FROM [MYDB].[dbo].[details] AS a INNER JOIN 
     [MYDB].[dbo].[delivery] AS b
     ON a.[item_no] = b.[item_no] INNER JOIN 
     [MYDB].[dbo].[options] AS c 
     ON a.[number] = c.[number] AND a.[item_no] = c.[item_no]
WHERE b.[destination] = 'my destination' AND
      b.[date] BETWEEN '2018-10-14' AND '2018-10-15'; 
1
追加された

クエリごとに1つの where 句のみ。これはあなたがやりたいことです。

SELECT d.[ID], d.[item_no], d.[qty]
FROM [MYDB].[dbo].[details] d JOIN
     MYDB].[dbo].[delivery] dv
     ON d.[item_no] = dv.[item_no] JOIN
     [MYDB].[dbo].[options] o
     ON d.[number] = o.[number] AND d.[item_no] = o.[item_no]
WHERE dv.[destination] = 'my destination' AND
      dv.[date] BETWEEN '2018-10-14' AND '2018-10-15' ;

あなたは私がテーブルのエイリアスをテーブルの略語に変更したことに気付くでしょう。意味のあるテーブルエイリアスを使用すると、クエリを読みやすく維持しやすくなります。

最初の WHERE 句の条件は JOIN 条件です。実際には WHERE 句ではなく ON 句に属します。

0
追加された

コードを修正するのに役立つ、すでにいくつかの答えが投稿されていますが、私はあなたが抱えている問題の原因となる誤解を明確に述べたいと思いました。あなたの質問では、あなたは言った:

...結合の1つにwhere文があります。

しかし、それは正しくありません。 WHERE 句は SELECT ステートメントの一部であり、 JOIN の一部ではありません。

大まかに言って、SQLエンジンは FROM 節を見ることであなたのクエリの解釈を始めます。基本的に、それはあなたのデータがどこから来るのかを尋ねることから始まります。 FROM 句には、ベーステーブルの [MYDB]。[dbo]。[details] と、参加する追加のテーブルが含まれます。 JOINON 基準は、テーブル内のどのフィールドに対応するデータポイントがあるかをエンジンに指示します。 INNER JOIN の場合、これは結果のデータセットを制限する効果があります。これは WHERE 節の効果ですが、結果として得られるフィルタリングです。 JOIN はクエリの最初に行われます。エンジンがクエリで操作するデータをメモリに格納しているときです。

After that initial data set is built, the engine reads the WHERE clause and applies any filters specified there.

これが SELECTステートメントの論理処理順序

JOIN に複数の ON 条件を指定して、初期データセットに取り込まれるデータ量を制限できます。たとえば、最初の JOIN は次のように書き直すことができます。

INNER JOIN [MYDB].[dbo].[delivery] AS b
ON 
  a.[item_no] = b.[item_no]
  AND 
  b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 

INNER JOIN の場合、 JOINWHERE のどちらにフィルタ条件を設定しても違いはありませんが OUTER JOIN では、結果は劇的に異なる可能性があるため、 SELECT ステートメントの各コンポーネントが何をするのか、またいつ実行するのかを理解することが重要です。

すべての結合は INNER なので、実際には次のように WHERE 句をまったく使用せずにクエリを記述できます。

SELECT a.[ID]
  ,a.[item_no]
  ,a.[qty]
FROM 
  [MYDB].[dbo].[details] AS a
INNER JOIN 
  [MYDB].[dbo].[delivery] AS b
  ON 
    a.[item_no] = b.[item_no]
    AND
    b.[destination] = 'my destination'
    AND 
    b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 
  INNER JOIN [MYDB].[dbo].[options] AS c
  ON 
    a.[number] = c.[number] 
    AND
    a.[item_no] = c.[item_no]

メモリが少ないシステムでは、 ON 句でフィルタリングすることでメモリの負荷を減らすことができます。そのように使用しましたが、ほとんどの人は WHERE 句の方が多くなると思いますそれは私たちが通常データフィルタを探すところだからです。

0
追加された

既存の WHERE 句を拡張するだけです。

SELECT a.[ID]
      ,a.[item_no]
      ,a.[qty]
  FROM [MYDB].[dbo].[details] AS a
  INNER JOIN [MYDB].[dbo].[delivery] AS b
  ON a.[item_no] = b.[item_no]
  INNER JOIN [MYDB].[dbo].[options] AS c
  ON a.[number] = c.[number] 
  WHERE a.[item_no] = c.[item_no] AND b.[destination] = 'my destination'
AND b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 
0
追加された