どこかの有名youtuberが、「朝が一番賢い時間です」と書いてあったので、今7:15、掃除、家事せずに8時半ごろまで勉強することにしました。
1.読み落とし
パターン1
『Each Transact-SQL segment may be used once, more than once, or not at all.』
何回使ってもいいって。。。泣けてくるぜ。
…って、まてよ!これまちがってませんか?
『WHERE』じゃなくて『HAVING』じゃないの?
(参照SamuraiBlogさま ありがとうございます。)
『「WHERE」も「HAING」と同じく「抽出条件を指定」するコマンドでのです。つまり、先ほどの処理は「WHERE」で書いても全く同じ結果が返ってくるんです。』
SELECT文を使用した時の、命令の呼ばれる順番です。
今回の主役である「WHERE」と「HAVING」は画像の通り「WHERE」→「GROUP BY」→「HAVING」の順に呼ばれるわけです。つまり間にある「GROUP BY」が関わってこなければ、全く同じ挙動をしますが、
「GROUP BY」を使って、グループ化を行った際には、以下の違いが出てくるわけです。
では、この場合をみてみましょう!
『WHERE COUNT(Cust.CustomerId) > 5』
そして、『Group By』は『Cust.CustomerId』コラムがふくまれてない。
『CustCat.CustomerCategoryName』と『CustAccountOpenedDate』でグループされてますよ!
とういことは、『HAVING』は使えない!!!
はぁ~、そういうことか。。。
4.ふたを開けたらわかってなかった
Note: This question is part of a series of questions that use the same scenario. For your convenience, the scenario is repeated in each question. Each question presents a different goal and answer choices, but the text of the scenario is exactly the same in each question on this series.
You have a database that tracks orders and deliveries for customers in North America. System versioning is enabled for all tables. The database contains the
Sales.Customers, Application.Cities, and Sales.CustomerCategories tables.
Details for the Sales.Customers table are shown in the following table:
Details for the Application.Cities table are shown in the following table:
Details for the Application.Cities table are shown in the following table:
Details for the Sales.CustomerCategories table are shown in the following table:
パターン1
-> For customers that are not on a credit hold, return the CustomerID and the latest recorded population for the delivery city that is associated with the customer.
-> For customers that are on a credit hold, return the CustomerID and the latest recorded population for the postal city that is associated with the customer.』
パターン2
You discover an application bug that impacts customer data for records created on or after January 1, 2014. In order to fix the data impacted by the bug, application programmers require a report that contains customer data as it existed on December 31, 2013.
You need to provide the query for the report.
SELECT * FROM employees WHERE start_date BETWEEN '2013,12,31' AND '2014,01,01';
と
SELECT * FROM employees WHERE start_date >= '2013,12,31' AND start_date <= '2014,01,01';
は同じです。
SELECT
Id,
Name
, StartTime, EndTime
FROM
dbo.Customer
FOR
SYSTEM_TIME
AS
OF
'2015-12-29 07:51'
StartTime<= @PointInTime
AND
EndTime > @PointInTime
DECLARE
@PointInTime DATETIME =
'2015-12-29 07:51'
SELECT
Id,
Name
, StartTime, EndTime
FROM
dbo.Customer
WHERE
StartTime<= @PointInTime
AND
EndTime > @PointInTime
UNION
ALL
SELECT
Id,
Name
, StartTime, EndTime
FROM
dbo.CustomerHistory
WHERE
StartTime<= @PointInTime
AND
EndTime > @PointInTime
となり、『Temporal Table』と『History Table』を『UNION ALL』で比べて結果を出すことになります。
まだよーわからんのですが、とにかく『StartTime<=@PintInTime』という部分がみそなんでしょうね。だから、『BETWEEN』は使えないのね。
<答え>C
ここにある問題は過去問と全く同じですね。
さぁ、掃除しよう。全然答えられなかったから、なんかモヤモヤするなぁ。
※コメント投稿者のブログIDはブログ作成者のみに通知されます