2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

SQL質疑応答スレ 19問目

1 :NAME IS NULL:2019/05/23(木) 20:25:40.60 ID:???.net
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 18問目
https://mevius.5ch.net/test/read.cgi/db/1515071542/

2 :NAME IS NULL:2019/05/23(木) 20:29:13.07 ID:???.net
SQL言語リファレンス一覧
Oracle Database
https://docs.oracle.com/cd/E96517_01/sqlrf/index.html
Microsoft SQL Server
https://docs.microsoft.com/ja-jp/sql/t-sql/language-reference
IBM DB2 Database
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/c0004100.html

PostgreSQL
http://www.postgresql.jp/document/current/html/sql.html
MySQL
https://dev.mysql.com/doc/refman/8.0/en/sql-syntax.html
https://dev.mysql.com/doc/refman/5.6/ja/sql-syntax.html


参考リンク
http://sql.main.jp/index.html
https://www.atmarkit.co.jp/ait/articles/0006/21/news001.html
https://oraclesqlpuzzle.ninja-web.net/
https://www.techscore.com/tech/sql/index.html/

3 :NAME IS NULL:2019/05/23(木) 20:31:43.25 ID:???.net
過去スレ
18問目:https://mevius.5ch.net/test/read.cgi/db/1515071542/
17問目:https://mevius.5ch.net/test/read.cgi/db/1468157341/
16問目:http://echo.2ch.net/test/read.cgi/db/1447160858/
15問目:http://peace.2ch.net/test/read.cgi/db/1402919549/
14問目:http://peace.2ch.net/test/read.cgi/db/1371476534/
13問目:http://toro.2ch.net/test/read.cgi/db/1343899481/
12問目:http://toro.2ch.net/test/read.cgi/db/1316769778/
11問目:http://hibari.2ch.net/test/read.cgi/db/1299305530/
10問目:http://hibari.2ch.net/test/read.cgi/db/1274791771/
9問目:http://pc11.2ch.net/test/read.cgi/db/1252492296/
8問目:http://pc11.2ch.net/test/read.cgi/db/1236253554/
7問目:http://pc11.2ch.net/test/read.cgi/db/1223525474/
6問目:http://pc11.2ch.net/test/read.cgi/db/1210940477/
5問目:http://pc11.2ch.net/test/read.cgi/db/1193486961/
4問目:http://pc11.2ch.net/test/read.cgi/db/1176553195/
3問目:http://pc11.2ch.net/test/read.cgi/db/1160458216/
2問目:http://pc8.2ch.net/test/read.cgi/db/1141622643/
帰ってきた:http://pc8.2ch.net/test/read.cgi/db/1124178925/
Part 2:http://pc8.2ch.net/test/read.cgi/db/1103113155/
初代:http://pc8.2ch.net/test/read.cgi/db/1056973582/

4 :NAME IS NULL:2019/05/23(木) 20:34:29.61 ID:???.net
よくある質問1

(問)
ID | DATE     | DATA
--+----------+-----
1 | 2007-11-11 | aaa
2 | 2007-11-11 | bbb
1 | 2007-11-10 | ccc
3 | 2007-11-12 | ddd
3 | 2007-11-11 | eee
4 | 2007-11-10 | fff
1 | 2007-11-12 | ggg

このようなテーブルから、下記のように

1 | 2007-11-12 | ggg
3 | 2007-11-12 | ddd
2 | 2007-11-11 | bbb
4 | 2007-11-10 | fff

各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。

(答)
select A.ID,
    A.DATE,
    A.DATA
from TableName A
   inner join
   (select ID, max(DATE) as MAX_DATE
    from TableName
    group by ID
   ) B
   on A.ID = B.ID
   and A.DATE = B.MAX_DATE
;

5 :NAME IS NULL:2019/05/23(木) 20:36:39.27 ID:???.net
よくある質問2

(問)
key   data
----------------
1     a
1     a
1     b
1     b
1     a
2     b
2     a
2     a

というテーブルから

key   a   b
--------------------
1    3   2
2    2   1

というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか?
a,bというのは固定なので、仮にcというデータがあっても無視して構いません。

(答)
select key,
    SUM(CASE data WHEN 'a' THEN 1 END) AS a,
    SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table
GROUP BY key
ORDER BY key
;

6 :NAME IS NULL:2019/05/23(木) 20:40:07.78 ID:???.net
よくある質問3

(問)
ID HOGE
01 A
01 B
01 C
02 A
03 B

HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか

(答1)
select id
FROM TableName
WHERE hoge in ('A','B','C')
GROUP BY id
HAVING count(DISTINCT hoge) = 3
;

(答2)
select *
from TableName T1
where not exists (select *
         from (values 'A', 'B', 'C') T2 (HOGE)
         where not exists (select *
                  from TableName T3
                  where T1.ID = T3.ID
                  and T2.HOGE = T3.HOGE
                  )
         )
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意

7 :NAME IS NULL:2019/05/23(木) 20:41:16.91 ID:???.net
よくある質問4

(問)
列の数が可変な問合せはどう書きますか?

(答)
標準SQLでは書けません。
pivotという機能を搭載したDBMSなら一見書けそうですが実はやっぱり書けません。
Oracle 11g以降でpivot xmlというキーワードを使用すれば一応可変っぽくはなります。
が、素直にプロシージャを書くかアプリケーションで処理したほうが良いでしょう。

SQL Serverのpivot(2005以降)
http://msdn.microsoft.com/ja-jp/library/ms177410.aspx

Oracleのpivot(11g以降)
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#CHDCEJJE
http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html

8 :NAME IS NULL:2019/05/23(木) 20:43:39.42 ID:???.net
よくある質問5

(問)
年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい

 例:201006を指定したら、以下の結果を得たい

   20100601
   20100602
    ・
    ・
    ・
   20100630

(答)
SQLでは存在しないデータを生成することはできません。
この問いの場合は素直にカレンダーテーブルを用意しましょう。

どうしてもやりたければ以下のような方法もなくはないですが、
再帰問合せの本来の使い方ではありません。
やめておくことを強くお奨めします。
(PostgreSQLの連番を生成する関数なら辛うじてセーフかもしれませんが
 賛否の分かれるところでしょう。)

with TEMP (NUM) as (
    select 1 from dual
    union all
    select NUM + 1 from TEMP where NUM < 31
)
select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD')
from TEMP
where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;

※上記はOracleの場合です。(11gR2以降)
※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが
 どのみちお奨めしません。

9 :NAME IS NULL:2019/05/23(木) 20:44:50.22 ID:???.net
以上、テンプレ終わり

10 :NAME IS NULL:2019/05/25(土) 01:14:38.34 ID:1nV7ZQjK.net
空文字列を入れたがるやつにかぎって、レコードによっては空文字列だったり、NULLだったりと両方想定してないといけない設計にして、運用ではまる。

11 :NAME IS NULL:2019/05/25(土) 01:39:12.17 ID:???.net
苦労しているんだね
同情します

12 :NAME IS NULL:2019/05/25(土) 06:44:36.96 ID:LBGwosS9.net
SQLじゃなくてテーブル設計の質問なんですが、お願いします。

商品を複数の倉庫に保管するモデリングなんですが、現状は、
----------------------------------------------------------------
pkey | 商品ID | 商品名 | 倉庫1 | 倉庫2 | 倉庫3 | 倉庫4 | 倉庫5 |
----------------------------------------------------------------
という風になって、保管する場所が増えるたびに、倉庫カラムが増える設計になっています。
これは、
-------------------------
pkey | 商品ID | 倉庫番号 |
-------------------------
    |      |   倉庫1  |
-------------------------
    |      |   倉庫2  |
-------------------------
    |      |   倉庫3  |
-------------------------
    |      |   倉庫4  |
-------------------------
    |      |   倉庫5  |
-------------------------

という風にするべきなのでしょうか?
最初の設計だとカラムが増えていくのに対して、この方法だとレコードがとんでもない数になっていくのですが・・・・

13 :NAME IS NULL:2019/05/25(土) 07:25:57.81 ID:???.net
毎回思うけどレコード増えてなにが困るん?

14 :NAME IS NULL:2019/05/25(土) 07:54:17.35 ID:???.net
>>13
@もともと1レコードに収まっていたデータを多数のレコードに分割すると、読み取りのパフォーマンスは落ちないでしょうか?
A副作用ですが、正規化することで、正規化前と比べてテーブル数が増える(20倍程度)と、結合で速度が落ちないか?
という点が不安です。

15 :NAME IS NULL:2019/05/25(土) 08:54:05.38 ID:???.net
>>12
倉庫が増えたら項目増やさないといけなくなるのと
倉庫ごとに数量、単価、金額もちたくなるとさらに項目が増える

もとのデータは下のテーブル形式で、夜間処理で照会用の中間テーブルとして上のテーブルをつくればいい

16 :NAME IS NULL:2019/05/25(土) 10:08:56.32 ID:???.net
>>15
おっしゃる通りです。経験のなさから、そこまで考えが及びませんでした。
まずは第三正規形に正規化した状態でのパフォーマンス確認からしてみます。

17 :NAME IS NULL:2019/05/25(土) 11:34:00.50 ID:???.net
>>12
その商品、特定倉庫1ヶ所にしまうのかい?

18 :NAME IS NULL:2019/05/25(土) 11:45:54.77 ID:???.net
SQL質疑スレでやるよりも、こちらでした方が良いかも

DB設計を語るスレ 10
https://mevius.5ch.net/test/read.cgi/db/1495438711/

答える人は同じなんだろうけどね

19 :NAME IS NULL:2019/05/25(土) 13:46:20.37 ID:Z+RZPCej.net
縦横問題はRDBができて以来定番の課題&質問になってるな
PIVOTとかも使いにくいしいい加減DBMS側でうまいことしてほしいところ

20 :NAME IS NULL:2019/05/26(日) 00:42:51.61 ID:???.net
今なら
「ラクテンスーパーポイントスクリーン」
登録するだけでRポイント150pが貰える!

※Androidアプリのみ
iPhoneユーザーはWeb版から登録のみ可能

登録完了後に表示される招待コ一ドをお持ちですか?のところで
「i9WPjs」
を入力する

完了

祭りだ♪ヽ('∀')メ('∀')メ('∀')ノワッショイ

21 :NAME IS NULL:2019/05/26(日) 03:38:10.70 ID:2BWK9yiY.net
>>14
あなたは30年前からタイムマシンに乗ってやってきたのですか?

22 :NAME IS NULL:2019/05/29(水) 11:13:10.13 ID:???.net
>>21
30年前でもその設計はしないと思う

23 :NAME IS NULL:2019/05/31(金) 19:07:06.33 ID:???.net
たまには30年先から来た人に話を聞いてみたい

24 :NAME IS NULL:2019/05/31(金) 23:38:45.60 ID:5a1yvLIB.net
>>23
過去には行けるが未来には行けない。これが現代の常識。

25 :NAME IS NULL:2019/05/31(金) 23:48:27.72 ID:???.net
それだとおかしくなる

26 :NAME IS NULL:2019/06/01(土) 00:31:01.74 ID:bltHuGZw.net
>>25
逆にだった。時間の流れが遅いところにいると、時間の流れが速いところに戻ったときに未来にたどりつく。

27 :NAME IS NULL:2019/06/01(土) 01:34:20.85 ID:???.net
現在から過去に行けるなら、未来人が現在に来ることは可能だな

現代の常識だとそうなる

28 :NAME IS NULL:2019/06/02(日) 23:01:40.17 ID:???.net
ここSQLスレじゃなくなったん?

29 :NAME IS NULL:2019/06/03(月) 21:16:01.14 ID:???.net
SQLスレですね

30 :NAME IS NULL:2019/07/13(土) 19:26:52.20 ID:AJIqdE5u.net
今更だが、SQLの正しい記述ってのはあるのか?

31 :NAME IS NULL:2019/07/13(土) 20:51:42.24 ID:???.net
今更だが、正しさとはなんだ?

32 :NAME IS NULL:2019/07/13(土) 20:54:06.41 ID:???.net
アメリカが正義だ

33 :NAME IS NULL:2019/07/13(土) 21:24:45.64 ID:???.net
標準SQLがBNF記法でまとめられてるサイト
https://ronsavage.github.io/SQL/

34 :NAME IS NULL:2019/07/13(土) 21:47:23.70 ID:???.net
>>30
SQL:2016とかの規格の話?

35 :NAME IS NULL:2019/07/14(日) 08:50:25.15 ID:KDHP+Bri.net
>>34
はい。

36 :NAME IS NULL:2019/07/28(日) 18:04:41.02 ID:???.net
https://i.imgur.com/QvQTuqJ.jpg

37 :NAME IS NULL:2019/07/29(月) 21:32:16.54 ID:???.net
点数テーブル
名前 日付 点数
A  7/27 50
A  7/28 70
B  7/27 80
B  7/28 90

ゲタテーブル
A  7/27 10
A  7/28 -5
B  7/27 -20
B  7/28 5

というような2つのテーブルがあって
点数をプラスマイナスした結果を出力したいのですが、どういうやり方がありますか?
今UNION ALLして、名前と日付をGROYP BYして
点数をSUMで集計しているのですが、これで問題ないでしょうか?

本当は例よりもjoinjoinしていて複雑なので、文も大分長くなってますしこれでいいのか不安になってます

38 :NAME IS NULL:2019/07/29(月) 21:38:08.33 ID:???.net
普通にleftjoinして加算すれば

39 :NAME IS NULL:2019/07/29(月) 21:48:46.85 ID:???.net
ありがとうございます!
+で繋げたら普通に足し算できたんですね・・・お恥ずかしい
ゲタのほうに該当がなかった場合点数+NULLみたいにならないか不安ですが試してみます!

40 :NAME IS NULL:2019/07/30(火) 00:01:05.07 ID:???.net
COALESCEなりCASEなりでNULLを0にすればいいんでない?

41 :NAME IS NULL:2019/07/30(火) 06:42:33.83 ID:???.net
>>39
isnullつかえば

42 :NAME IS NULL:2019/07/31(水) 22:15:14.94 ID:???.net
37の意図する事が今一分からないだが、
単純に点数テーブルとゲタテーブルをマージして
Group by して sum取っちゃ拙いのか?

MySQLだとこんな具合で
select `名前`,`日付`,sum(`点数`) from (
select `名前`,`日付`,`点数` from `点数テーブル`
union
select `名前`,`日付`,`点数` from `ゲタテーブル`
) g
group by `名前`,`日付`;

43 :NAME IS NULL:2019/07/31(水) 22:32:34.75 ID:???.net
>>37がやってるってのがそれだろ。
しかも>>37は正しくunion all使ってるのにお前は間違えてるし。

44 :NAME IS NULL:2019/07/31(水) 22:35:57.00 ID:???.net
>>43
あ、すまんな、その通りだ

45 :NAME IS NULL:2019/08/01(木) 08:09:51.16 ID:???.net
まあunionでもいいと思うが万が一ゲタ側のレコードに対応するレコードが点数テーブルにない時もレコード出力されちゃうから俺ならleft joinでやると思う

46 :NAME IS NULL:2019/08/01(木) 20:10:22.24 ID:???.net
>>37です。皆さんありがとうございます。参考になります
その後、LEFT JOINで書いたのですが、
点T
A 7/30 70
B 7/30 80

ゲタT
A 7/30 +10
A 7/30 -5
B 7/30 -10
というように、ゲタの対応するレコードが1件だけではなかったらしく
普通にLEFT JOINすると
A 7/30 80
A 7/30 65
B 7/30 70
のように複数行になってしまいました

サブクエリでSUMするしかないかなと考えているのですが
以下の2つのやり方でどちらが良いでしょうか?
後者のほうがシンプルで良いかなと思ってます
もしくは、もっと他に良い方法があるでしょうか?

@
SELECT 人, 日, 点+ゲタ計
FROM 点T
LEFT JOIN (
  SELECT 人, 日, SUM(ゲタ)
  FROM ゲタT
  GROUP BY 人, 日
)
ON 点T.人 = ゲタT.人
AND 点T.日 = ゲタT.日

A
SELECT 人, 日, 点+ゲタの合計
FROM (
  SELECT 人, 日, 点, SUM(ゲタ)
  FROM 点T
  LEFT JOIN ゲタT
  ON 点T.人 = ゲタT.人
  AND 点T.日 = ゲタT.日
  GROUP BY 人, 日, 点
)

見づらく恐縮なのですが、よろしくお願いします

47 :NAME IS NULL:2019/08/01(木) 22:23:33.88 ID:???.net
2番目のgroup by はやばい.
正誤で言えば、1番目が正しい

48 :NAME IS NULL:2019/08/02(金) 06:39:22.62 ID:???.net
ゲタハカセスギw

49 :NAME IS NULL:2019/08/02(金) 09:43:54.13 ID:???.net
ありがとうございます!
確かにAはおかしかったですね・・・
@のほうで書いてみたいと思います
ありがとうございました!

50 :NAME IS NULL:2019/08/02(金) 22:05:00.81 ID:???.net
サブクエリする必要はないけど
Aも別に間違いじゃないけどな
SELECT 人, 日, 点+SUM(ゲタ)
  FROM 点T
  LEFT JOIN ゲタT
  ON 点T.人 = ゲタT.人
  AND 点T.日 = ゲタT.日
  GROUP BY 人, 日, 点

51 :sage:2019/08/03(土) 13:02:52.10 ID:wjgyF6r3.net
>>47
なにがやばくてどう間違ってるのか詳しく

どう書いてもまあいいんだが、気になるなら実際のテーブル(インデックス)構成と件数で実行計画取ってみれ

52 :NAME IS NULL:2019/09/01(日) 09:35:29.97 ID:???.net
date player score weekAve
2019-09-01 A 80 ?
2019-09-01 B 67 ?
2019-09-01 C 91 ?
2019-08-31 A 78 ?
2019-08-31 B 65 ?
2019-08-31 C 93 ?
2019-08-30 A 81 ?
2019-08-30 B 69 ?
2019-08-30 C 90 ?



というようなデータで、各プレイヤーのその日付段階での
直前1週間の平均scoreをweekAveのところに入れる方法をお願いします。

53 :NAME IS NULL:2019/09/01(日) 16:47:32.11 ID:???.net
sqliteで作ったので適当になおしてくれ

select tb1.col1,tb1.col2,max(tb1.col3),avg(tb2.col3)
from tb1
left outer join tb1 as tb2
on tb2.col2=tb1.col2
and date(tb2.col1)>=date(tb1.col1, '-7 days')
and date(tb2.col1)<=date(tb1.col1)
group by tb1.col1,tb1.col2
;

54 :52:2019/09/01(日) 17:52:32.35 ID:???.net
>>53
大変ありがとうございました。
使わせていただきます。

55 :NAME IS NULL:2019/09/20(金) 14:25:08.89 ID:???.net
name, datetime, comment のテーブルでnameとdatetime で主キーとしています。
nameが重複しているものだけをリストアップするにはどうすればよいでしょうか。

A 2019/9/20 0:0 AAA1
B 2019/9/20 0:5 BBB1
C 2019/9/20 0:5 CCC1
A 2019/9/20 1:0 AAA2
C 2019/9/20 1:5 CCC2
A 2019/9/20 2:0 AAA3

の場合以下を期待します。

A 2019/9/20 0:0 AAA1
A 2019/9/20 1:0 AAA2
A 2019/9/20 2:0 AAA3
C 2019/9/20 0:5 CCC1
C 2019/9/20 1:5 CCC2

以下のSQL文で実現できますが、もっとスマートな方法はないでしょうか?

select * from xxx
where name in
(
select name from
(select name, count(*) as cnt from xxx group by name)
where cnt > 1
)
order by name, datetime

56 :NAME IS NULL:2019/09/20(金) 16:17:33.29 ID:???.net
HAVING使うぐらいか?

SELECT * FROM xxx WHERE name IN
(
SELECT name FROM xxx GROUP BY name HAVING 1<COUNT(*)
)
ORDER BY name, datetime

57 :NAME IS NULL:2019/09/20(金) 16:43:23.46 ID:???.net
>>56
出来ました!
group by はhaving でしたね。
ありがとうございました。

58 :NAME IS NULL:2019/09/20(金) 18:25:52.08 ID:???.net
こんなんでいいだろ

select *
from xxx T1
where exists (
  select *
  from xxx T2
  where T1.name = T2.name
  and T1.datetime <> T2.datetime
)

59 :NAME IS NULL:2019/09/21(土) 16:28:13.26 ID:???.net
これはありえないw

60 :NAME IS NULL:2019/09/21(土) 17:16:57.39 ID:???.net
テーブルのレコード数が多くてnameのカーディナリティも十分高いなら
一般には>>56より>>58の方が良いだろ。

61 :NAME IS NULL:2019/09/21(土) 19:24:27.30 ID:8nH6piRt.net
DBMSとデータ量で実測してみないとわからんな。
NoSQL系なら58の方が速そう
RDBなら56を改変して
SELECT L.*
FROM xxx L
JOIN (SELECT name FROM xxx GROUP BY name HAVING 1<COUNT(*)) R
ORDER BY L,name, L,datetime
の方が速いかも

62 :NAME IS NULL:2019/09/21(土) 20:59:51.16 ID:???.net
日時が同じデータはありえないという条件をいわれてないなら
普通はこんなsqlはかけないわw

63 :NAME IS NULL:2019/09/21(土) 21:17:13.99 ID:???.net
> nameとdatetime で主キーとしています。

64 :NAME IS NULL:2019/09/21(土) 21:52:58.94 ID:???.net
>>61
環境によるから実際に実行計画をみてみなきゃ確実なことは言えないのはその通りだけど、
そのsqlはサブクエリでfull scan 1回、外側で1回、nameのカーディナリティが高ければ
中間データも大きくなり、しかもJOINにインデックスが使われないときているから、
メモリに入りきらないようなテーブルの場合は極端に遅くなりそう。

65 :NAME IS NULL:2019/09/21(土) 22:28:07.41 ID:???.net
nameのカーディナリティが高い場合、>>56>>61では中間データが大きくなり
メモリに乗り切らないことが考えられ、>>58のほうが速い可能性がある。

nameのカーディナリティが低い場合、>>58ではexistsの条件に早くひっかかる
可能性が大きくなり、やはり>>58のほうが速い可能性がある。

66 :NAME IS NULL:2019/09/21(土) 22:58:15.28 ID:???.net
>>58は相関サブクエリにインデックスが使われ、datetimeの比較は2エントリ目で
必ず判断がつくから、実のところ速度はカーディナリティにあまり影響されない。

67 :NAME IS NULL:2019/09/22(日) 04:36:57.50 ID:???.net
PostgreSQL 9.6.11 にて1000000行のデータでEXPLAIN ANALYZEを付けて実行してみた。データは https://ideone.com/WTthGi のようにして作成。
各8回実行し、最初の4回は捨てた。

>>55 PostgreSQLでは副問合せに名前を付けないとエラーになるため AS a を追加
Execution time: 1202.286 ms / 1173.974 ms / 1194.647 ms / 1221.041 ms

>>56
Execution time: 1164.661 ms / 1171.337 ms / 1210.060 ms / 1179.993 ms

>>58 order by name, datetimeを追加
Execution time: 2350.302 ms / 2320.161 ms / 2345.047 ms / 2368.932 ms

>>61 R の後にON L.name=R.nameを追加、ORDER BYの,を.に変更
Execution time: 1248.337 ms / 1215.495 ms / 1222.694 ms / 1222.818 ms

↑はDBや環境、実際のデータ、インデックスの追加で変わると思う。

68 :NAME IS NULL:2019/09/22(日) 11:03:21.51 ID:oC+qLfZI.net
>>67
素晴らしい。結局最初のであまり問題ないね
最近はよっぽど遅い場合を除いて
意図が分かるように書くのがいい感じよね

69 :NAME IS NULL:2019/10/01(火) 22:47:53.79 ID:yfemt3Lz.net
すいません
教えてください…
カラムは2つです(アクセスログです)
IP
CGI

複数種類あるCGIに対してどのCGIに
このIPからは何回、このIPからは何回アクセスされたというのを集計したいのですが
SQLが思いつきません…
だれか教えてください…

70 :NAME IS NULL:2019/10/01(火) 23:20:09.22 ID:???.net
>>69
一旦各CGIがLogに出力して
日替わりや週替わり月替わりで集計したらどうか

71 :NAME IS NULL:2019/10/02(水) 09:28:22.87 ID:???.net
>>69  select CGI,IP,count(*) from テーブル group by CGI,IP;

72 :NAME IS NULL:2019/10/07(月) 18:48:19.40 ID:???.net
Windowsでデータベースを使いたく、今xamppをインストールして、PHPから学んでる最中なのですが、
mySQL(実際はMariaDB)で作ろうと考えていたのですが、私の目的のデータベースが作れるのか、調べてもなかなか出てこなくて、
ひょっとすると、リレーショナルデータベースでは出来ないのでは?と薄く疑問に思ってるのですが、、以下のデータベースを作ることは可能でしょうか?

例えば、プロゴルフ選手権のデーターベースを作るとします

選手の個人的な情報が入ったテーブル
(名前、生年月日、プロ登録年月日、所属チーム、性別等)

ゴルフコースの情報が入ったテーブル
(コース所在地、ホール数、ホールごとの距離、パー数、運営会社、プレイフィー、年次ごとの改修履歴等)

長年に渡るゴルフツアーの大会日程のテーブル
(カレンダー、使われたコース、個人成績、各順位の賞金額、賞金総額、スポンサー等)

このようなデータを連携させて、
ゴルフツアーのテーブルの個人成績の項目に個人データのテーブルとリレーションシップを張り、
ゴルフツアーのテーブルの開催コースの項目にコースのテーブルとリレーションシップを張り、

このデータベースを使って、例えば、
◯◯選手の年次ごとのツアー成績
◯◯選手の獲得賞金学の推移
◯◯選手のコース全長に対する成績傾向
特定のコースを得意とする選手
チームとして得意なコースか苦手なコースか

などの分析用のデータとして取り出したりすることは出来るものでしょうか?

accessをちょっと齧った程度の感覚ではできそうな気がするのですが

73 :NAME IS NULL:2019/10/07(月) 21:35:07.31 ID:???.net
できる

74 :NAME IS NULL:2019/10/07(月) 22:08:37.13 ID:nrBGAukj.net
>>72
そういうことをするためにリレーショナルデータベースは存在します。

75 :NAME IS NULL:2019/10/08(火) 00:01:01.76 ID:???.net
>>73>>74
ありがとうございます
安心して勉強続けます

76 :NAME IS NULL:2019/10/08(火) 00:10:43.96 ID:???.net
得意とか苦手とか、心の内面的な部分はどうSQLにしたら良いだろうね

77 :NAME IS NULL:2019/10/08(火) 08:53:23.09 ID:???.net
その人の平均スコアより何%以上良ければそのコースは得意とか、そんなんじゃね?

78 :NAME IS NULL:2019/10/08(火) 20:09:49.20 ID:???.net
数字のことはよく知らないけど、そういうのは平均値より偏差値が良いんじゃないの?

79 :NAME IS NULL:2019/10/08(火) 21:08:15.53 ID:1lB5cEuR.net
なぜ仕様の話になるのか?

80 ::2019/10/13(Sun) 17:00:31 ID:???.net
宿泊人数を日毎に集計したい。
テーブル構成は、
ID(主キー)、チェックイン日、チェックアウト日、人数
(id, startdate, enddate, guests)

以下のデータがあるとき、
1, 2019/10/1, 2019/10/7, 4
2. 2019/10/2, 2019/10/3, 1
3, 2019/10/10, 2019/10/20, 2

2019/10/1:4人
2019/10/2:5人
2019/10/3:4人
2019/10/7:0人
2019/10/10:2人
2019/10/20:0人

このように、変化がある時点のみを抽出したいのですが、
どのようなSQLが考えられますか?

81 ::2019/10/13(Sun) 18:53:50 ID:???.net
>>80
SQL-Server
select dates.date1 as date1, sum(coalesce(table1.guests, 0)) as guests
from table1
right join (
select startdate as date1 from table1
union
select enddate as date1 from table1
) dates on table1.startdate <= dates.date1 and dates.date1 < table1.enddate
group by dates.date1
order by dates.date1

82 :NAME IS NULL:2019/10/14(月) 13:54:43.52 ID:???.net
>>81
ありがとうございました。

83 :NAME IS NULL:2019/10/27(日) 15:00:48.42 ID:???.net
以下のURLのSQL練習サイトで勉強しているのですが
調べてもわからなかった問題があるので押してください。

■意味がわからなかった問題
https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial/ja
の7番目、各大陸で最大

■問題の正解を出すSQL文

SELECT continent, name, area FROM world x
WHERE area >= ALL
(SELECT area FROM world y
WHERE y.continent=x.continent
AND area>0)

■教えていただきたい点

@SQLの解釈順序

 どのように上のSQLが解釈されているのか順を教えてください。
 
 こういう風に教えてくださいますと助かります。※以下の実行順は、私が考えたのですが、何かがおかしい感じがします・・・

  @()内のSQLを先に実行
  Aworld yテーブルの1行目のcontinentの値を見る。
  Bworld xテーブルの1行目のcontinentの値と見比べる。.continentの値が一致していたら、world yのarea の値を抽出する
  Cworld xテーブルのarea の値が、world yのareaより大きければ、world xのcontinent, name, areaを抽出する。
  Dworld yテーブルの2行目を見る・・・(以下行数を進めて繰り返し)


AほかのSQL文

 上の自己相関サブクエリと、以下のSQLで何か違いがあれば教えてください。
 (例えば、以下のSQLの場合、件数が数万件に及ぶと実行速度が極端に遅くなる等)
 select continent,name,area from world where area in (select max(area) from world group by continent)  



よろしくお願いいたします。

 

84 :NAME IS NULL:2019/10/28(月) 00:43:36 ID:6SIOZDZ3.net
>>83
解釈としてはxとyの突き合わせだが
DBMSによってどう最適化するかは異なるから
実際は実行計画を見てみるしかない。
そのサイトの裏側が何だかわからないので手元で実行計画を見てみるといい
https://www.atmarkit.co.jp/ait/articles/0408/25/news101.html

85 :NAME IS NULL:2019/10/31(木) 02:56:13 ID:taiLajBl.net
>>83
簡潔に指摘するとALL句の意味を取り違えています。

ALL句の副問い合わせは同じ大陸内の国ごとの面積を返します。

area >= ALL は (area >= 面積1 AND area >= 面積2 AND area >= 面積3) のようなものです。つまりこの場合は一番大きい面積とarea列値を比べることになります。

あなたが考えた処理方法では、?はともかく?〜?を行っていまうと、最大の国だけでなく、同じ大陸の他のレコードまで取得してしまいます。

86 :NAME IS NULL:2019/11/09(土) 06:00:59 ID:???.net
table1 親品番,子品番
table2 品番,品名

取り出したい内容
親品番,親品名,子品番,子品名

table1,2のjoinでON句に親品番=品番や子品番=品番とすると片方ずつは取得できますが、両方同時に取得することはできますか?

87 :NAME IS NULL:2019/11/09(土) 08:41:59.09 ID:???.net
table1ひとつにtabl2をふたつJOINしてやればいいんだよ

88 :NAME IS NULL:2019/11/09(土) 10:19:33.50 ID:???.net
>>87
ありがとうございます
週明けに試してみます

89 :NAME IS NULL:2019/11/09(土) 11:12:26.19 ID:af/bSZEC.net
いかにも初心者らしい質問ですね

90 :NAME IS NULL:2019/12/24(火) 16:02:18.63 ID:???.net
SQL Server 2014です。

文字列検索で、半角濁音および半角半濁音を含むかどうか調べたいです。
ただ普通に LIKE '%゙%' と検索すると全件ヒットしてしまいます。
照合順序で区別をしてもダメでした。

どうすればいいのでしょうか?(´・ω・`)

91 :NAME IS NULL:2019/12/24(火) 20:19:09.24 ID:joe7BHe1.net
>>90
おそらく半角の濁点、半濁点が無視さらているのでしょう。

まずは自分が見ている濁点、半濁点の文字コードを調べてください。

92 :NAME IS NULL:2019/12/24(火) 20:55:24.36 ID:???.net
照合順序なにでやってだめだったんだよ
バイナリ系のやつならいける気がするけど

93 :NAME IS NULL:2019/12/24(火) 21:29:38.72 ID:joe7BHe1.net
キャラクタセットも自分で調べないようでは話にならない。

94 :NAME IS NULL:2019/12/24(火) 21:31:04.18 ID:joe7BHe1.net
条件が半角カタカナ文字だったらどうなるのか書いてくれよ。

エスパーじゃないからわかんねえよ!

95 :NAME IS NULL:2019/12/24(火) 22:30:40.39 ID:???.net
many to manyって中間テーブルつかわなあらわせないの?

96 :NAME IS NULL:2019/12/24(火) 22:37:11.00 ID:???.net
べつに中間じゃなくてもいいよ。

97 :NAME IS NULL:2019/12/24(火) 22:53:42.19 ID:???.net
どうやんの?

98 :NAME IS NULL:2019/12/25(水) 08:01:52.36 ID:???.net
create table T (
a,
b,
unique(a, b)
)

これがaとbのmany to many

99 :NAME IS NULL:2019/12/25(水) 09:58:53.56 ID:???.net
>>92
ありがとうございます。
照合順序で、てっきりCS・AS・KS・WSしか頭に入ってませんでした。
BINで判別できました。

100 :NAME IS NULL:2019/12/25(水) 10:09:08.06 ID:H+1gr7tn.net
マイク製品は大文字、小文字、全角、半角文字を同じのみなすからなあ。

変な仕様だけど、SQL Serverの照合順序を変えることが、SQLの質問なのか?

101 :NAME IS NULL:2019/12/25(水) 15:13:24.00 ID:WXRJ7FwP.net
Microsoft SQL Server 総合スレ 12
https://mevius.5ch.net/test/read.cgi/db/1534679537/

102 :NAME IS NULL:2019/12/25(水) 17:47:19.42 ID:???.net
unique(a, b)
って何?

103 :NAME IS NULL:2019/12/25(水) 22:35:06.89 ID:H+1gr7tn.net
>>102
複合列の一意制約の構文だろうけど、どのRDBMSかは俺もわからない。

104 :NAME IS NULL:2019/12/25(水) 22:48:21.03 ID:???.net
どのって、ふつうに標準SQLでしょ。

105 :NAME IS NULL:2019/12/26(木) 04:09:32.90 ID:???.net
>>98は、見方によってはaとbの中間テーブルだがな

106 :NAME IS NULL:2019/12/26(木) 09:54:56.49 ID:???.net
aとbの中間ってなんだそれ

107 :NAME IS NULL:2019/12/26(木) 15:59:01.34 ID:z/i15tE2.net
>>106
服のうえから触るんじゃないの?

108 :NAME IS NULL:2019/12/26(木) 20:15:51.39 ID:???.net
触るか触られないぎりぎりが良いの

109 :NAME IS NULL:2019/12/31(火) 18:20:49.42 ID:???.net
ものすごく初歩的な質問すいません。

会社の業務で、OracleのデータベースからVBAを使って、データを取得しているようなのですが、この逆って出来るのでしょうか?
大量のExcelデータをVBAを使って、データベースを一気に書き換える、ようなスキルを身に付けたいと思っています。

また、このようなスキルを身に付けるにあたって、分かりやすい参考書のような書籍などありますでしょうか?

110 :NAME IS NULL:2019/12/31(火) 19:01:03.88 ID:???.net
>>109
権限あればできるはず

111 :NAME IS NULL:2019/12/31(火) 19:08:31.03 ID:???.net
一気に書き換えるってことは
DeleteしてInsertかな?
ODBC接続してSQL発行すれば良いのでは

112 :NAME IS NULL:2019/12/31(火) 19:30:30.84 ID:0OK2Hg3S.net
>>109
古いExcel VBAの逆引き本に書かれている。ただ、正解はないのでどれが最適なのかは深く考えないこと。

113 :NAME IS NULL:2019/12/31(火) 21:08:53.58 ID:???.net
>>110->>112
レスありがとうございます。

権限というのは、データベースに接続するためのID/PASSでしょうか?
Oracleのデータベースからデータを引っ張ってくるVBAの記述を見ると、「ID」「PASS」の
文字列があるので、これを利用できそうです。それともデータベースというのは
ID/PASSを知っているだけでは足りず、責任者の承認のようなものが一般的に必要と
なるのでしょうか?

「ODBC接続」「SQL発行」というのが、今目指していることのキーワードとなるようですね。
古い本に載っているそうですが、最新のものはありませんか?
それともネットのプログラミング講座を受講するのが早いでしょうか?

質問ばかりですいません。
よろしくお願いします。

114 :NAME IS NULL:2019/12/31(火) 21:23:28.95 ID:???.net
>>113
そのID/PASSがテーブルを更新する権限があるかどうかが問題
てか、マジでそのデータベース管理してる人にそんなことして良いのか確認しなよ
ヘタこいてデータぶっ壊しましたテヘペロ
で済むならいいけど

115 :NAME IS NULL:2019/12/31(火) 22:34:09.63 ID:???.net
普通DBの参照権限は貰えても更新権限は与えないよね。

116 :NAME IS NULL:2019/12/31(火) 22:46:40.05 ID:???.net
そうだね
Excelで扱うデータを引っ張るような業務レベルだと
テーブル更新権限までは持たせないと思う

117 :113:2020/01/01(水) 00:19:05.18 ID:???.net
>>114->>116
そうですか…
せっかくスキルを身に着けたとしても、更新権限が付与されないのであれば意味がないですね。
おそらく管理者に確認しても、余計な事するな、となりそうなので

ただSQLの知識はあっても損はないので、買った本くらいは通読してみようかと思います。

118 :NAME IS NULL:2020/01/01(水) 00:22:06.91 ID:???.net
ぶっちゃけ、そのヤろうとしてることはクラッキングだからな
管理者の許可を得ず、データにアクセスして改竄

119 :NAME IS NULL:2020/01/01(水) 10:09:37.97 ID:???.net
家のPCでSQLSERVERとかPostgreSQLとか構築してみたら勉強になる
めっちゃ簡単だし

120 :NAME IS NULL:2020/01/01(水) 14:10:53.11 ID:mYS4vz8I.net
>>119
そんなことをしなくても、Excelシートをリレーショナルデータベースとして扱える。

121 :NAME IS NULL:2020/01/01(水) 15:24:52.64 ID:???.net
まじっすか?

122 :NAME IS NULL:2020/01/01(水) 16:19:37.37 ID:???.net
数百万レコード保存できるエクセルがあるそうです

123 :NAME IS NULL:2020/01/01(水) 16:21:51.32 ID:???.net
ネタで言っている様にしか聞こえないw

124 :NAME IS NULL:2020/01/01(水) 16:33:58.73 ID:mYS4vz8I.net
>>122
100万レコードなら可能

125 :NAME IS NULL:2020/01/03(金) 23:02:49.24 ID:???.net
unique cnstraintに引っかかるとエラーが帰ってくるの?

126 :NAME IS NULL:2020/01/04(土) 18:12:14.61 ID:???.net
普通はそう

127 :NAME IS NULL:2020/01/04(土) 18:42:45.71 ID:???.net
このエラーをtry exceptで例外処理して重複するのを防ぎたいんだけど
commitしないとエラーがでなくて
毎回addする毎にcommitするしかないですか?

128 :NAME IS NULL:2020/01/04(土) 18:47:13.70 ID:???.net
既に存在する場合は登録しない様にすればいい

129 :NAME IS NULL:2020/01/04(土) 22:30:42.23 ID:???.net
>>127
普通はコミットするまでにエラーがでると思うが
使ってる言語かDBMSのスレで聞け

130 :NAME IS NULL:2020/01/06(月) 02:30:42 ID:pHBrkoE+.net
売上を記録するテーブルの設計について教えて下さい。

例えば商品マスタが以下の構造だとします。
----------------------------
| 商品コード | 商品名 | 単価 |
----------------------------

販売履歴を記録するテーブルは、
  -----------------------------------
?| 商品コード | 商品名 | 単価 | 数量 |
  -----------------------------------
と、
  --------------------------
?| 商品コード | 単価 | 数量 | ※商品名は、商品コードをキーにしてマスタから取得
  --------------------------

  -----------------------
?| 商品名 | 単価 | 数量 | ※商品コードは、商品名をキーにしてマスタから取得
  -----------------------
の3つのどれがいいのでしょうか?


?の場合、販売後に商品コードが変わると、販売時の商品名が分からなくなり、
?の場合、販売後に商品名が変わると、販売時の商品コードが分からなくなるので、
?が一番いいのかな、と思うのですが、本当にそれでいいのでしょうか?

131 :NAME IS NULL:2020/01/06(月) 06:10:26.40 ID:???.net
普通1だし、商品名変わったら新しくID発行するだけで上書きはしないよね。

132 :NAME IS NULL:2020/01/06(月) 07:02:36.84 ID:???.net
普通は、商品コードと数量だろ?
(属性は足りないと思うけど)

133 :NAME IS NULL:2020/01/06(月) 07:50:15.92 ID:???.net
その要件なら@で仕方ないと思うが、商品名の追跡が必要なら商品名ごとの
サブコードを発行しておくという手もあると思う。

134 :NAME IS NULL:2020/01/06(月) 07:56:03.30 ID:nckEwU7J.net
何のために商品コードがあると思っているんだろうね。

135 :NAME IS NULL:2020/01/06(月) 10:31:45.02 ID:???.net
値段の変動するものなら、その時の時価を記録してないと訳分からなくなるかも

136 :NAME IS NULL:2020/01/06(月) 11:54:17.21 ID:nckEwU7J.net
SQLの話になってないぞ

137 :NAME IS NULL:2020/01/06(月) 12:38:07.69 ID:???.net
どちらかと言うとDB設計スレの方が良いような

138 :NAME IS NULL:2020/01/13(月) 09:59:29.35 ID:???.net
>>130
ずいぶん遅いレスだけど販売管理ならユーザーによって使い方が変わるからそういった点でも
できるだけ細かい情報を販売実績のテーブルに管理したほうがいいぞ

139 :NAME IS NULL:2020/01/13(月) 12:58:42.68 ID:CI1X7qA2.net
誰もがいつも表記の揺れのない正確な商品名を打てる世界を想定しなくはいけないのか?

140 :NAME IS NULL:2020/01/13(月) 15:20:19.50 ID:???.net
>>139
イミフ

141 :NAME IS NULL:2020/01/13(月) 15:51:36.18 ID:Atn/JdJk.net
商品コードがなんのためにあるのかわかってない

142 :NAME IS NULL:2020/01/13(月) 16:22:19.97 ID:???.net
DB設計スレに移動して続けたらどうかな

143 :NAME IS NULL:2020/01/13(月) 17:43:27.66 ID:???.net
データに全ての情報を埋め込むのは汎用機システム世代
リレーションシップデータベース世代になるとマスターに
できるのはできるだけマスター化する
しかし全てマスター化すると古いマスターもずっと残さないといけなくなりマスターが肥大化してしまうのでデータに埋め込んでおくのもいい場合がある

144 :NAME IS NULL:2020/01/13(月) 17:58:21.31 ID:???.net
リレーションシップデーターベース?

145 :NAME IS NULL:2020/01/13(月) 17:59:57.49 ID:???.net
リレーショナルデーターベースとしても意末は通らんけど

146 :NAME IS NULL:2020/01/13(月) 18:08:22.94 ID:???.net
正規化がたらんのやろ

147 :NAME IS NULL:2020/01/13(月) 18:23:32.38 ID:???.net
>>130の商品コードと商品名が関数従属しないんならべつに@も非正規形ではないんだがな

148 :NAME IS NULL:2020/01/13(月) 18:27:20.09 ID:???.net
ユーザーによっては商品マスタを使いまわすところもあれば商品ごとにマスタを登録するところもある
商品はセール(値引き)以外にも返品なども行う事もおおいから単純にマスタを見て単価や名称を紐づけすればOKなんて考えは
販売管理作ったことのあるやつならナンセンスじゃね
請求書や領収書なんかも変わった商品名称や単価だすとかありえんしね

149 :NAME IS NULL:2020/01/13(月) 22:41:38.01 ID:CI1X7qA2.net
>>148
あんた商売の素人だな。

150 :NAME IS NULL:2020/01/15(水) 12:47:01.58 ID:???.net
テーブル設計の話題は 「DB設計を語るスレ」 でやってください

151 :NAME IS NULL:2020/01/30(木) 21:52:02.55 ID:???.net
中間テーブルってプライマリキー無くてもいいの?

152 :NAME IS NULL:2020/01/30(木) 22:56:44.09 ID:???.net
プライマリキーが無くてもいいテーブルがあるDBは設計が間違ってる。

153 :NAME IS NULL:2020/01/30(木) 23:01:58.60 ID:???.net
じゃ全部プライマリキーってことか?

154 :NAME IS NULL:2020/01/30(木) 23:24:33 ID:???.net
tempテーブルのこと言ってんでしょ?
それならプライマリキーなくても別に構わないよ

155 :NAME IS NULL:2020/01/30(木) 23:40:21 ID:???.net
なんだろうtempテーブルって

156 :NAME IS NULL:2020/01/31(金) 00:03:03 ID:???.net
えっ、temporaryテーブル(一時テーブル)のことだよ

157 :NAME IS NULL:2020/01/31(金) 00:05:44 ID:???.net
釣れますか?

158 :NAME IS NULL:2020/01/31(金) 16:28:38 ID:???.net
とりあえず設計スレ行けや

159 :NAME IS NULL:2020/01/31(金) 17:26:58.13 ID:???.net
SQLスレにいるのにテンポラリテーブルも知らないのかw

160 :NAME IS NULL:2020/01/31(金) 20:09:31 ID:???.net
SQLの仕様に、テンポラリテーブルってのが有るのか・・・

161 :NAME IS NULL:2020/01/31(金) 20:15:25 ID:???.net
勉強し直してこなきゃ

162 :NAME IS NULL:2020/01/31(金) 21:01:53 ID:???.net
ついでに名前が似てるテンポラルテーブルも

163 :NAME IS NULL:2020/01/31(金) 22:18:08.62 ID:???.net
tempテーブルってのも調べて

164 :NAME IS NULL:2020/01/31(金) 22:20:53.04 ID:???.net
一時テーブルという機能を持つDBMSはあるが、一時テーブルだとプライマリキーが要らない
理由なんてないよなぁ。

165 :NAME IS NULL:2020/01/31(金) 22:29:30.34 ID:???.net
timpo table

166 :NAME IS NULL:2020/01/31(金) 22:47:29.44 ID:KMY4HniK.net
意味的なプライマリキーと
DBMSのPRIMARY KEY制約がごっちゃになって話が混乱してるな

167 :NAME IS NULL:2020/01/31(金) 23:16:32.21 ID:???.net
>>164
逆に一時テーブルの機能を持たないRDBMSってあるのかい?

168 :NAME IS NULL:2020/01/31(金) 23:32:01.21 ID:???.net
Oracleは18cまでまともに使える一時テーブルがなかったのね
いろいろと納得

169 :NAME IS NULL:2020/01/31(金) 23:42:42.95 ID:???.net
最初は中間テーブルって話だったのにいつの間に温度テーブルの話にすり替わったのか

170 :NAME IS NULL:2020/01/31(金) 23:56:38.46 ID:???.net
温暖化の影響だろう

171 :NAME IS NULL:2020/02/01(土) 00:57:00.65 ID:5RS/C4xX.net
>>168
? 

172 :NAME IS NULL:2020/02/01(土) 03:00:50 ID:???.net
>>166
それが混同されたとしても一時テーブルは関係ないわ

173 :NAME IS NULL:2020/02/01(土) 06:05:58 ID:???.net
SQLのスレなんで、DBMSの実装機能の話は無いのかと思ってたが,そう言うことか

174 :NAME IS NULL:2020/02/01(土) 11:34:27 ID:???.net
テンポラリテーブルはSQL-92で定義されてる標準だぞ
各実装が従ってるわけではないけど

175 :NAME IS NULL:2020/02/01(土) 11:55:38 ID:???.net
おおっ!
そうなんだ
Thanks

176 :NAME IS NULL:2020/02/03(月) 22:35:32 ID:???.net
inner joinの前と後のテーブル入れ替えても同じ意味になりますか?

177 :NAME IS NULL:2020/02/03(月) 23:28:10.97 ID:???.net
>>176
同じ意味というのが
同じ結果セットが得られるかということならイエス
同じ実行プランが得られるかということなら必ずしもそうはならない

178 :NAME IS NULL:2020/02/03(月) 23:35:53.56 ID:???.net
あ、inner join on x.id <> y.id のように不等号とか使ったら結果セットも変わるわ

179 :NAME IS NULL:2020/02/04(火) 00:12:57 ID:???.net
二つのテーブルの内部結合なら不等号だろうが結果セットは変わらん気がするが
もちろん列指定ちゃんとやるって前提だが

180 :NAME IS NULL:2020/02/04(火) 01:05:42 ID:???.net
順序が変わると言うことかも

181 :NAME IS NULL:2020/02/04(火) 07:18:28.20 ID:???.net
順序は同じSQLですら変わっても文句言えない

182 :NAME IS NULL:2020/02/04(火) 12:37:35 ID:???.net
べつに文句を言っている訳ではないよ
順序に期待するならそこまで考慮しようねって事

183 :NAME IS NULL:2020/02/04(火) 14:41:36 ID:???.net
同じSQLですら結果の順序がどうなるかわからんのにinner joinの結合順で結果の順序とか言い出す奴って…

184 :NAME IS NULL:2020/02/04(火) 19:29:24.90 ID:???.net
えっ??

185 :NAME IS NULL:2020/02/04(火) 20:08:46 ID:8UrvhxBw.net
>>183
そういう基本的なことからわかってないのにデタラメを言うやつは年齢関係なくいるから困るよね。

186 :NAME IS NULL:2020/02/04(火) 21:23:41.70 ID:???.net
このスレでの話ならスルーしてれば何も困らないだろう
職場にいるんなら、それはお前がどうにかしろ
こんなとこで愚痴るなよ、鬱陶しい

187 :NAME IS NULL:2020/02/04(火) 23:09:26.84 ID:???.net
いきなり何イキってるんだ?

188 :NAME IS NULL:2020/02/06(木) 22:17:53.87 ID:???.net
2020みたいな西暦って
integerかstr かtimeのどれ型を使うのが一般的ですか?

189 :NAME IS NULL:2020/02/06(木) 23:00:51.88 ID:???.net
年しかいらないならintegerとかの整数値だろ

190 :NAME IS NULL:2020/02/07(金) 00:58:43 ID:???.net
そうすか ありがとうございました
int ならorder by できますからね

191 :NAME IS NULL:2020/02/07(金) 01:01:13 ID:???.net
time型も内部表現は数値だったと思う

192 :NAME IS NULL:2020/02/07(金) 06:35:04 ID:???.net
そういうことじゃないだろw

193 :NAME IS NULL:2020/02/07(金) 07:21:56.94 ID:???.net
>>190
は?なんでもソートできるけど

194 :NAME IS NULL:2020/02/07(金) 12:34:08 ID:???.net
>>188
最近はDate型にして月日には1月1日入れてる

195 :NAME IS NULL:2020/02/07(金) 12:55:00 ID:???.net
日付形式にすると日付ではない値は
セットできないのでデータ整合性が
保てる

日付形式で困るのは最大値だな
データベースによって違うから
日付数字8桁なら99999999とかに
すればいいけど

196 :NAME IS NULL:2020/02/07(金) 13:02:34 ID:???.net
西暦はゼロ年、1年の扱いの違いもちょっと困ることがある

197 :NAME IS NULL:2020/02/07(金) 14:50:07 ID:???.net
年だけをどのデータ型にするのがいいのかは
利用方法、DBMSの種類、件数、(もしあれば)規約などによる

一般的にはint, smallint, dateが候補だけど
MySQLのようにyear型があればそれも選択肢になるし
Oracleならdateは7バイトも使うのであまり選ばれない

個人的には年だけ表現したいのに関数使わずに見ると
2020/01/01って入ってるのは嫌なのでsmallintが第一候補
過去の西暦とか入力できる範囲も違うから必要ならチェック制約使う

198 :NAME IS NULL:2020/02/07(金) 21:28:01.97 ID:X04cMmok.net
いまどき数バイトでどうこう言うのか?

199 :NAME IS NULL:2020/02/07(金) 23:11:41.16 ID:???.net
1月2日とかが入るのを完全に排除できるならいいけど、それやるのにトリガとか使うくらいならintでいいよね。

200 :NAME IS NULL:2020/02/08(土) 01:13:40 ID:???.net
>>198
数バイトが積み重なってレコード長が大きくなればパフォーマンスが徐々に悪化するからね

201 :NAME IS NULL:2020/02/08(土) 09:42:01 ID:FADQTNtD.net
あっそう。

202 :NAME IS NULL:2020/02/08(土) 10:38:57 ID:???.net
日付形式は検索するとき数字形式より遅くなる場合が多い
日付形式を検索するとき関数を使う場合が多く関数ある分遅くなる
例えばこんな感じ
Where TO_CHAR(sale_date, 'YYYY-MM-DD') = '1970-01-01'

俺は月次単位でデータを作る事が多く検索で多く使うから
年月は数字6桁でインデックス貼ってるな
年月は他のテーブルと連結する時も多く使われるので
後で変更する場合非常に面倒なのでよく考えたほうがいい
日付形式はデータ作成日時とか更新日時のではよく使う
パフォーマンス問題を引き起こす日付型
https://use-the-index-luke.com/ja/sql/where-clause/obfuscation/dates

203 :NAME IS NULL:2020/02/08(土) 11:21:26 ID:???.net
日付型って内部は数値形式でしょう
比較したり順序を決めるのに文字列にする必要は無いんじゃないかな

204 :NAME IS NULL:2020/02/08(土) 11:46:08 ID:???.net
OracleにはSQL-92 DATEが無かったからそんな感じだったな。

205 :NAME IS NULL:2020/02/08(土) 12:44:53 ID:???.net
>>201
知らなかった感じ?
SQL使うだけなら知らなくていいけど
DB設計するなら基礎の基礎だから知っておくといいよ

206 :NAME IS NULL:2020/02/08(土) 12:53:54 ID:???.net
とりあえずここはSQLのスレであってDB設計スレではない
そのことをまず知っておこう

207 :NAME IS NULL:2020/02/08(土) 14:20:32.42 ID:FADQTNtD.net
>>202
どの製品のことを言っているのか?

208 :NAME IS NULL:2020/02/08(土) 14:21:24.23 ID:FADQTNtD.net
>>205
馬鹿にされた自覚がないのか?

209 :NAME IS NULL:2020/02/08(土) 14:23:26.63 ID:FADQTNtD.net
物理メモリもストレージ容量も大きいのに少しのことを大袈裟に言うやつは引退した方がいい。

ハードウェアの進化に知識が追いついていない。

210 :NAME IS NULL:2020/02/08(土) 14:32:11.63 ID:???.net
>Where TO_CHAR(sale_date, 'YYYY-MM-DD') = '1970-01-01'

こういうダメな例を書かないためには
SQL使うだけのやつもDB設計の基礎知らないといけないんじゃないか?

211 :NAME IS NULL:2020/02/08(土) 14:37:55.61 ID:???.net
自分の設計能力の低さをハード性能でカバーされてることに気づかないやつも引退したほうがいいけどな

212 :NAME IS NULL:2020/02/08(土) 14:38:49.29 ID:???.net
>Where TO_CHAR(sale_date, 'YYYY-MM-DD') = '1970-01-01'

確にこれは初心者

213 :NAME IS NULL:2020/02/08(土) 14:43:36 ID:1VUqo/WP.net
ON DUPLICATE KEY UPDATEのIF文について質問させてください

ON DUPLICATE KEY UPDATE
fb_like = IF(fb_like > VALUES(fb_like), fb_like, VALUES(fb_like))

このIF分の第二と第三の引数と戻り値の意味を教えて頂けないでしょうか。
第一は比較条件なのは分かりますが・・・
DUPLICATE KEY UPDATEのリファレンスを調べてもわかりませんでした・・・

214 :NAME IS NULL:2020/02/08(土) 16:15:51.97 ID:???.net
>>203
普通に考えて第2引数は条件が真の時に返す値で第3引数は偽の時に返す値でしょ
てか答え書いてあるだろ
> 取得した数字がレコードの数字より大きければ更新
https://qiita.com/yuzroz/items/f0eccf847b2ea42f885f

215 :NAME IS NULL:2020/02/08(土) 16:27:56 ID:???.net
>>213
IFが分からないならON DUPLICATE KEY UPDATEじゃなくIF()関数のところを見ないと
https://dev.mysql.com/doc/refman/8.0/en/control-flow-functions.html#function_if

216 :NAME IS NULL:2020/02/08(土) 16:35:32 ID:???.net
>取得した数字がレコードの数字より大きければ更新

取得した数字って書き方が悪いような

217 :NAME IS NULL:2020/02/08(土) 16:50:58 ID:???.net
>>209
>物理メモリもストレージ容量も大きいのに少しのことを大袈裟に言うやつは引退した方がいい。

性能要求が低くてスケールする必要のない小規模・オンプレならそういう認識でいいかもねw

218 :NAME IS NULL:2020/02/08(土) 20:25:42 ID:???.net
>>213
質問の内容自体はINSERT文にあまり関係ないというか単なるIF関数じゃないかな
IF自体はExcelのワークシート関数と同じく条件が真(True)なら第2引数、偽(False)なら第3引数の値を使う
でこれが今回のINSERT文になると
fb_likeに設定する値はUPDATE対象となるデータのfb_like(A)とVALUESで設定しようとしているfb_like(B)を比較して
A>BならAの値(何も変わらない)、そうでなければBの値になる

例えば最高得点を更新するような場合をイメージするといいかも
ただそれならA≧Bがよさそうではある

219 :NAME IS NULL:2020/02/08(土) 20:48:16 ID:???.net
>>218
> ただそれならA≧Bがよさそうではある
価が変わらない時は更新しないような最適化はされるんだろうか?

220 :NAME IS NULL:2020/02/08(土) 21:39:21 ID:???.net
>>219
MySQLのUPDATEは値が同じならUPDATEは実行されない

221 :NAME IS NULL:2020/02/08(土) 21:56:14 ID:rnVBcNFe.net
同じ値で更新するかどうかは製品の同時実行制御方式による。


多くの製品は同じ値でも更新してログを残す。

同じ値と異なる値で区別する方が実装が複雑になる。

222 :NAME IS NULL:2020/02/09(日) 16:54:17 ID:???.net
primary keyが被って他のカラムが違った場合そこをupdateするのってどうやります?
ついでに旧の値も保存したいです。

223 :NAME IS NULL:2020/02/09(日) 17:02:29 ID:???.net
primary keyが被るって、唯一無二のレコードじゃないのか?

224 :NAME IS NULL:2020/02/09(日) 17:08:43 ID:???.net
「そこ」を使用する場合一意に決められるように文を定義してください

225 :NAME IS NULL:2020/02/09(日) 17:10:59 ID:7YUFhOwr.net
>>222
その主キー列は代理キーではないということか?

主キー列の値がレコードを区別するだけのものでない場合は、テーブルの設計が誤っている。

226 :NAME IS NULL:2020/02/09(日) 17:14:17 ID:???.net
>>224
そこっていうのは非主キーのカラムです

227 :NAME IS NULL:2020/02/09(日) 17:18:13 ID:???.net
primary keyを指定してアップデートする
「そこ」とは、primary keyになる
旧の値を保存したいなら、
更新の履歴をとっておくようにする

228 :NAME IS NULL:2020/02/09(日) 17:20:27 ID:???.net
>>225
簡略化すると
商品というテーブルがあって
id(主キー)、名前、価格
というカラムで価格が変化するというような場合です
価格も主キーにするのがいいのですかね

229 :NAME IS NULL:2020/02/09(日) 17:20:52 ID:???.net
元の質問の理解が難しいが複合主キーの第一キーをprimary keyと言ってるのかね

230 :NAME IS NULL:2020/02/09(日) 17:26:41 ID:7YUFhOwr.net
>>228
なんでインサートで新しいレコードを作らないのですか?

231 :NAME IS NULL:2020/02/09(日) 17:27:38 ID:???.net
DB設計を語るスレ 10 [無断転載禁止]&#169;2ch.net
https://mevius.5ch.net/test/read.cgi/db/1495438711/

スレ違いが最近多いけど、設計スレは死んでるのか?

232 :NAME IS NULL:2020/02/09(日) 17:29:28 ID:7YUFhOwr.net
設計の話がなぜかSQLの話にすり替わるのは初心者の特徴なのだろうか?

233 :NAME IS NULL:2020/02/09(日) 17:31:06 ID:???.net
リレーショナルデータベースの理論的な意味をすっ飛ばしてサロゲートキーあたりまえみたいな
教え方をするとこういうことになるといういい例。

234 :NAME IS NULL:2020/02/09(日) 17:34:34 ID:7YUFhOwr.net
>>233
よく読んだ?

235 :NAME IS NULL:2020/02/09(日) 17:36:34 ID:???.net
>>230
同じidが被るのは良くないかなと思いました

あとどっちが最新の価格かもわからなくなると


>>231
>>232
すいませんでした移動します

236 :NAME IS NULL:2020/02/09(日) 17:36:53 ID:7YUFhOwr.net
「primary keyが被って他のカラムが違った場合そこをupdateするのってどうやります?
ついでに旧の値も保存したいです。」

こんな狂った質問はスルーでよかった。申し訳ない。

237 :NAME IS NULL:2020/02/09(日) 17:43:20 ID:???.net
>>228
価格が変化すると言っても、商売の種類によって様々
生鮮食品を扱うとなればそれこそ日々変わるし
数年に一度価格見直しで一斉に変わるという業種もあるだろう
それによって設計も変わるし仕組みも変わる

相談したいなら、SQLの書き方を聞くスレではなく
DB設計の話題を扱うスレの方が相応しいと思うんだが

238 :NAME IS NULL:2020/02/09(日) 18:00:13.65 ID:???.net
どうしてもkey を変えたくないなら元情報用カラムをついかして元情報をそこに残すしかし複数の変更履歴残したいならば、変更用トランザクションデータを残して置けば変更履歴は追える

239 :NAME IS NULL:2020/02/09(日) 18:53:18 ID:???.net
テンポラルさんがスタンバってるよ

240 :NAME IS NULL:2020/02/22(土) 22:26:47 ID:???.net
他システムが出力したデータをoracleのnumber(3,16)型のカラムに格納しています

もともとの値が浮動小数でそのまま出力して格納しているため、
96.3が96.29999999996や96.3000000000004のような値になっています

Oracleのsqlで、このカラムからnumber(3,3)の96.300の結果を得るにはどうすれば良いでしょうか?
アドバイスよろしくお願いします

241 :NAME IS NULL:2020/02/22(土) 22:31:51 ID:???.net
ROUND()使えば?

242 :NAME IS NULL:2020/02/23(日) 00:06:17 ID:???.net
>>240
number(3,3)にcastすればいい

243 :NAME IS NULL:2020/02/23(日) 21:08:24.31 ID:???.net
number(3,3)って、全体で3桁、うち小数点以下3桁じゃなかったっけ?

244 :NAME IS NULL:2020/02/25(火) 13:35:36.81 ID:???.net
>>240
NUMBER(整数+小数の桁数、小数の桁数)だぞ
左側が多くはず
number(3,16)型とかおかしい

245 :NAME IS NULL:2020/02/25(火) 14:54:57.84 ID:???.net
ぶっちゃけ分かりにくいよね
その桁指定方法

誰が考えたのか知らんけど

246 :NAME IS NULL:2020/02/25(火) 17:40:42 ID:???.net
FortranやCの出力フォーマット指定に準じているみたい

Fortran
f12.5 12桁で出力,うち5桁が小数点以下.
e20.7 科学的表記の20桁で出力,うち7桁が小数点以下.

C
%4.2fの4は全体の桁数、2は小数点以下の桁数

247 :NAME IS NULL:2020/02/25(火) 19:33:17.00 ID:???.net
文章みればなんとなくわかるよね
まあわかってないのは質問者と>>240だけどw

248 :NAME IS NULL:2020/02/26(水) 23:55:25.73 ID:QqeJ9408.net
COBOLなんて最悪のわかりにくさだけどな。

249 :NAME IS NULL:2020/02/27(木) 00:18:29.64 ID:???.net
SQLとCOBOLって、殆ど同級生みたいなものだろう

250 :NAME IS NULL:2020/02/27(木) 06:58:17.84 ID:UItByFL3.net
>>249
まったく異なる

251 :NAME IS NULL:2020/02/28(金) 22:13:19 ID:???.net
>>249
どこがどう「同級生みたいな」もんなんだよ。

252 :NAME IS NULL:2020/02/29(土) 03:02:30 ID:???.net
SQL-86とCOBOL-85って殆ど同級生みたいなものだろう
って話じゃろうな

253 :NAME IS NULL:2020/02/29(土) 10:59:20.17 ID:???.net
流れトン切り、雑談的な質問で恐縮なんだが
みんなコードを学んでいく上で周囲の人が書いたコード見たりして学ぶのかな
なんとなく盗み見るようで気がひけるんだけど
名前出てるからこの人の参考になるなという人の時々見てるけど、こそこそやってて落ち着かない
モラルの点でどう思う?

254 :NAME IS NULL:2020/02/29(土) 11:50:20.58 ID:???.net
見れるところに置いてあるのなら、堂々と見れば良い

255 :NAME IS NULL:2020/02/29(土) 13:48:05.06 ID:???.net
わかった、ありがとう
そうする

256 :NAME IS NULL:2020/03/02(月) 20:55:36.49 ID:???.net
親ID 親Name 子ID 子Name ←列名
p1 pn1 c1 cn1
p1 pn1 c2 cn2

現在、クエリで上記の形で取得できているのですが、これを
ID Name IsParent
p1 pn1 true
c1 cn1 false
c2 cn2 false

のような形で取得することはできますか?
DBはoracle11gR2です

257 :NAME IS NULL:2020/03/02(月) 21:31:35.40 ID:???.net
(
select distinct 親ID as ID, 親Name as Name, true as IsParent from テーブル
) union all(
select distinct 子ID as ID, 子Name as Name, false as IsParent from テーブル
)

258 :NAME IS NULL:2020/03/02(月) 21:50:57 ID:rd6v8tKi.net
>>253
他人のものをよく見て、真似るのが基本中の基本。

さらに自分の中でも試行錯誤を繰り返す。

これをずっとやらないとコピペプロクラマにしかなれない。

259 :NAME IS NULL:2020/03/02(月) 22:09:11 ID:???.net
>>257
ありがとうございます
union allという手がありましたね。それで検索してみたら↓のようなのを見つけたので色々と試してみたいと思います!

https://www.oracle.com/technetwork/jp/articles/otnj-sql-image7-1525406-ja.html#d

260 :NAME IS NULL:2020/03/03(火) 19:50:42 ID:???.net
p1 pn1 c1 cn1
p1 pn1 c2 cn2
p2 pn1 c5 cn5
p2 pn1 c6 cn6
p3 pn1 c3 cn3
p3 pn1 c4 cn4
だったらどう取りたいのかが少し気になったわ
必ず親の次に子をとるなら・・・

261 :NAME IS NULL:2020/03/03(火) 23:28:53.47 ID:???.net
親の次とか意味が分からんけど、それより
p1 pn1 c1 cn1
c1 cn1 p1 pn1
とかあったらどうするんだろね

262 :NAME IS NULL:2020/03/04(水) 18:33:46 ID:56J4i3Lh.net
そもそも >>256 は何を言っているのかまったくわからない。

親子とはなんなんだ?

263 :NAME IS NULL:2020/03/04(水) 18:52:49 ID:???.net
>現在、クエリで上記の形で取得できているのですが

これから推測するに、元となるテーブルが一つ、二つあって
それからクエリ使って2行の例を導いたと思われる
だとすれば、元となるテーブルデータと取得したクエリを公開すれば
質問に対する適切なアドバイスを得れると思うが、本人は既に解決済と見える

264 :NAME IS NULL:2020/03/04(水) 23:13:48.31 ID:???.net
>>256です
たしかに前提条件も詳細な情報もなく
ほかの人から見れば分からないことだらけですね すみません
だいたい>>263の通りですが、あまり時間が取れてなくて解決していませんでした

>>260
IDが違えば基本的には名前は被らないですが、その例だと
p1 pn1 true
c1 cn1 false
c2 cn2 false
p2 pn1 true
c5 cn5 false
c6 cn6 false ...と取りたいです

>>261
循環はないようなテーブルですが、それを規制するものはないため、
クエリ側で循環の対策が必要ですね

265 :NAME IS NULL:2020/03/04(水) 23:27:22.00 ID:???.net
親子とは商品で例えると、セット品のようなもので
子がいない(セット品ではない)ものは子品番がNULLになっています
複数テーブルですが、一つにまとめて簡素化したものが以下になります

https://ideone.com/VRo2S0

ほしいデータは Where 注文番号 = 101だとすると、
品番 品名 親か
P001,親1,true
C001,子1,false
C002,子2,false
C003,子3,false
P002,親2,true

今までは普通にSampleテーブルのような形で取得し、
プログラム側で処理していたのですが、SQLでデータ整形ができるなら
(作り直している)プログラム側がスッキリするなと思いまして質問しました

266 :NAME IS NULL:2020/03/04(水) 23:54:38.20 ID:???.net
子が親になるケースもあるなら
unionした結果をID(と名前)でgroup byしてcase式使って集約

でもSQLで処理するとプログラム側で親子関係が見えなくなるから
1つの注文に対するデータ件数が十分少ないなら
SQLじゃなくプログラム側で処理したほうが柔軟性が高くていい気がする

267 :NAME IS NULL:2020/03/05(木) 20:28:24 ID:???.net
>>264
失礼。名前は直しわすれましたわ

そうなるとこんなかんじじゃないかね
select ID,Name,IsParent from(
 select 親品番 as ソートキー1,1 as ソートキー2,親品番 as ID,親品名 as Name,true as IsParent from Sample where 注文番号 = 101
 union all
 select 親品番 as ソートキー1,2 as ソートキー2,子品番 as ID,子品名 as Name,false as IsParent from Sample where 注文番号 = 101
) as TB order by ソートキー1,ソートキー2,ID

268 :NAME IS NULL:2020/03/06(金) 03:37:51.75 ID:23zUNF8S.net
いつもながらエスパーがいるね

269 :NAME IS NULL:2020/03/07(土) 04:20:01.39 ID:KvRjYJ+Z.net
DBMS名とバージョン
MySQL 5.6

テーブルデータ

shops
id | name
------------
1 | shopA
2 | shopB
3 | shopC

270 :NAME IS NULL:2020/03/07(土) 04:20:22.33 ID:KvRjYJ+Z.net
DBMS名とバージョン
MySQL 5.6

テーブルデータ

shops
id | name
------------
1 | shopA
2 | shopB
3 | shopC

rates
id | shop_id | rateA | rateB
-----------------------------
1 | 1 | 0.1 | 0.05
※ rateA, rateB は total_price に掛けるパーセンテージ。小数点切り捨て

orders
id | shop_id | type | name | price
-----------------------------------
1 | 1 | A | nameA | 100
2 | 1 | B | nameA | 200
3 | 1 | A | nameB | 50
4 | 2 | A | nameB | 300

欲しい結果
shop_name | type | total_price | x_rateA | x_rateB | exist
----------------------------------------------------------
shopA | A | 150 | 15 | 7 | 1
shopA | B | 200 | 20 | 10 | 1
shopB | A | 300 | 30 | 15 | 1
shopB | B | 0 | 0 | 0 | 0

説明
ordersを集計した結果が欲しいです。そのときordersテーブルが持っているtypeをshopごとに持たせたいです。つまりshopBはtypeBのorderを持っていませんが、集計結果にはtypeBも結果に入ってきてほしいです。
ほかに、ordersを集計しratesテーブルのレートを掛けたものをx_rateA,x_rateBとして集計してほしいです。
existはorderがあったかどうかの0,1です。

よろしくお願いします。

271 :NAME IS NULL:2020/03/07(土) 07:36:24.25 ID:???.net
SQLはりつけられなかったわ
結局typeはordersにしか情報がないなら
select type from orders group by type
でtypeテーブルを作る
それをshopsと直積で結合してその状態から
ratesとordersを結合して集計すればいいんじゃないの
existsは結合したordersのshop_idがnullなら0それ以外なら1

272 :NAME IS NULL:2020/03/07(土) 09:01:41.05 ID:???.net
>>267
1番目のselectでは同じ親品番が複数出てくるためDistinctを追加し、
union allの次のselectでは子品番のnullが出てくるためis not null を追加したところ
目的のデータが取得できました
ソートキーを入れる発想が思い浮かばなかったです
ありがとうございました

273 :NAME IS NULL:2020/03/07(土) 11:04:48.35 ID:???.net
なんか中継クラウドでチェックが入りインジェクションと見なされるみたい
ソースアップロードサイトに上げて、リンク張ればいいかも

274 :NAME IS NULL:2020/03/07(土) 12:22:57 ID:???.net
ここ最近Oracle使ってないから覚えてないけど
今回みたいなのはSQL1回でガチャガチャやるよりも
ストアドプロシジャで結果セット返すようにして
テンポラリテーブル作る
親データINSERT
子データINSERT
ソートして結果を返すってやったほうが自分はいいとおもってるけどね

269もtype欲しさに受注データをgroupbyとかほんとはやりたくないわ
ABしかないならそれ用のテンポラリテーブル作って結果を返すストアド作ったほうがいい気がする

275 :NAME IS NULL:2020/03/07(土) 20:27:09 ID:AGFNapIR.net
SQL Serverでは安易にできるけど
MySQLってストアドで結果セット簡単に返せたっけ?
Oracleはメッチャ大変だった記憶

276 :NAME IS NULL:2020/03/07(土) 22:38:04 ID:???.net
>>270
地味に面倒くせぇ
https://www.db-fiddle.com/f/dQVqiZLJu6ntVKUtaKNSKM/1

277 :NAME IS NULL:2020/03/08(日) 12:55:14.35 ID:56DADZoB.net
>>276
おおお!ありがとうございます!!
すごい。

もし、shopCも入れる場合にはどのようにすればいいですか?typesとCROS JOINだと思うのですが、うまくできませんでした。
欲しい結果
shop_name | type | total_price | x_rateA | x_rateB | exist
----------------------------------------------------------
shopA | A | 150 | 15 | 7 | 1
shopA | B | 200 | 20 | 10 | 1
shopB | A | 300 | 30 | 15 | 1
shopB | B | 0 | 0 | 0 | 0
shopC | A | 0 | 0 | 0 | 0
shopC | B | 0 | 0 | 0 | 0

278 :NAME IS NULL:2020/03/08(日) 13:04:30.24 ID:???.net
>>277
ordersに入っていないshop名をshopsから取得すればできるんじゃないか

279 :NAME IS NULL:2020/03/08(日) 13:08:35.25 ID:???.net
こんな応用も考えられないやつがSQL使うんだな
業務のSQLだったら恐ろしいわ

280 :NAME IS NULL:2020/03/08(日) 14:23:53 ID:56DADZoB.net
>>278
https://www.db-fiddle.com/f/iFRAaUckQWb7FXKb3GRcC4/0

できました。ありがとうございます。

>>276

inner join (select distinct shop_id from orders) as shop_ids
この行は動きとしては cross join なんですね。

ordersのすべてのtypeと、ordersのすべてのshop_idをかけ合わせたベースとなる表をつくり、それ対して1:1になるshopsとratesをinner joinでくっけたあとに、そこにordresをで肉付けするようなイメージなんですね。
そしてsumなどの集計関数があるのでgroup byで集計する単位を決めているんですね。
勉強になりました。

281 :NAME IS NULL:2020/03/08(日) 20:54:18 ID:pHcaE5Qh.net
自作自演か

282 :NAME IS NULL:2020/03/09(月) 21:48:51 ID:???.net
>>280
>inner join (select distinct shop_id from orders) as shop_ids
>この行は動きとしては cross join なんですね。

その通り
join/inner joinにonなどで条件を付与しなければcross joinになる
意図を伝えるためにはcross joinと書いたほうがよかったかもね

283 :NAME IS NULL:2020/03/09(月) 22:53:19 ID:???.net
onかかないinner joinって標準SQLで許可されてる?

284 :NAME IS NULL:2020/03/10(火) 00:43:11.43 ID:???.net
結合条件の指定がないってだけだから、許されると思う

285 :NAME IS NULL:2020/03/10(火) 02:07:58 ID:lOpoK0/l.net
MySQLとOracleのマニュアル見てみたら省略可能になってるけど
ISO/IEC 9075-2:1999だと省略マークないね
結構いろんなDBMSで直積使ったけどエラーになった覚えははないな

286 :NAME IS NULL:2020/03/10(火) 12:45:16 ID:qD23V5J3.net
>>285
SQLSERVERでエラーになったような

287 :NAME IS NULL:2020/03/10(火) 21:57:15.59 ID:JFVN1pud.net
ネタだから付き合う必要はないよ。彼の最近のトレンドは直積。書き込みをよく見れば直積に絡む話ばかりだとわかる。

288 :NAME IS NULL:2020/03/11(水) 11:58:29 ID:???.net
onが必要な場合
on 1=1
とすれば同じ

289 :NAME IS NULL:2020/03/11(水) 17:09:43.87 ID:ce0+fihR.net
>>287
270だけどはじめてここに来たよ。
とても助かって感謝している。

290 :NAME IS NULL:2020/03/11(水) 17:31:53.56 ID:???.net
感謝はいいけど
どういう風に理解してくれたかだよな
次に生かせないでまた質問するだけならもうやめたほうがいい

291 :NAME IS NULL:2020/03/11(水) 19:46:33.41 ID:???.net
また聞けばいいだけだろう

292 :NAME IS NULL:2020/03/11(水) 22:19:53.94 ID:???.net
>>290

>>270での質問の仕方だったり
>>280の自分の理解をフィードバックする姿勢だったり
この手のスレでは珍しいくらいのまともな質問者だろ

それに対してケチつけることしかできないなら
君は人間をもうやめたほうがいい

293 :NAME IS NULL:2020/03/12(木) 01:19:57 ID:xuvPVMNh.net
ここで質問してくるやつは目的を書かないからタチが悪い。

294 :NAME IS NULL:2020/03/12(木) 06:46:46.52 ID:???.net
読解力がないのを人のせいにされても……

295 :NAME IS NULL:2020/03/13(金) 20:38:00.16 ID:???.net
■EXISTSを使用して。

データベース:オラクル

・氏名テーブルの姓、名前を検索情報にして以下の国語テーブル、算数テーブル、
英語テーブルからやまだたろうの、最高点を1レコード抽出するSQLのご教授を
お願いいたします。
※「EXISTS」を使用した、SQLのご教授をお願いいたします。
※英語は最高点が70点と2レコード存在しますが、
1レコードのみを抽出したいです。

■氏名テーブル(主テーブル)
姓 名前
やまだ たろう

■国語テーブル
姓 名前 点数
やまだ たろう80
やまだ たろう90
すずき しろう90

■算数テーブル
姓 名前 点数
いのうえ いちろう20
やまだ たろう50
やまだ たろう90

■英語テーブル
姓 名前 点数
しばた じろう20
やまだ たろう70
やまだ たろう40
やまだ たろう70

▼結果(1レコードのみ出力)
姓 名前 国語の点数 算数の点数 英語の点数
やまだ たろう90 90 70

宜しくお願いいたします。

296 :NAME IS NULL:2020/03/13(金) 21:06:25.90 ID:???.net
宿題は自力でやれ

297 :NAME IS NULL:2020/03/13(金) 22:24:00.52 ID:???.net
せめて、
こうやって見たけどうまく行かない、どうしたらいい?
みたいに、質疑出来るようにして欲しい

298 :NAME IS NULL:2020/03/13(金) 22:33:29.25 ID:???.net
なぜにEXISTS ??
このケースで普通使わんやろ

299 :NAME IS NULL:2020/03/13(金) 22:51:21.65 ID:???.net
最高点抽出するってんなら使うこともあるだろ

300 :NAME IS NULL:2020/03/13(金) 23:25:11.92 ID:???.net
maxの代わりか
実践で使うことはまずないな

301 :NAME IS NULL:2020/03/14(土) 08:59:24 ID:???.net
この条件でEXISTSはどうやってつかうんだ?

302 :NAME IS NULL:2020/03/14(土) 10:03:46 ID:???.net
not exists (自分より点数高い奴)

昔はmax()使うより良い実行計画吐くことも多かったんでよく使われた。

303 :NAME IS NULL:2020/03/14(土) 11:11:26 ID:???.net
氏名テーブル関係なくて笑うわ

304 :NAME IS NULL:2020/03/14(土) 11:21:05 ID:???.net
https://stackoverflow.com/questions/18661642/using-exists-to-find-rows-with-maximum-value

305 :NAME IS NULL:2020/03/14(土) 12:13:36 ID:???.net
さんくす勉強になったわ

306 :NAME IS NULL:2020/03/15(日) 18:02:27 ID:???.net
>昔はmax()使うより良い実行計画吐くことも多かったんでよく使われた。
今となってはバッドノウハウ感満々だな

>>295がどこからこんなお題を持ってきたかが気になるわ

307 :NAME IS NULL:2020/03/15(日) 19:45:32 ID:???.net
今でもmaxだけで常に最適な計画が得られる保証はないわけだし、
引き出しとして持っておいて損はないと思うがな。

308 :NAME IS NULL:2020/03/15(日) 23:07:31.36 ID:???.net
まあ、引き出しとして持っといて損はないんだろうけど
実行計画いじりたいならまずヒントで何とかならんか検討すべきだしな

309 :NAME IS NULL:2020/03/16(月) 08:10:34 ID:???.net
ヒントって、SQLチューニングでも期待通りにならない場合に使う最後の手段って印象だが。

310 :NAME IS NULL:2020/03/16(月) 08:18:17 ID:???.net
そもそもチューニングだのなんだの、
SQLを歪めてまでパフォーマンス気にしなきゃいけないDBが欠陥商品なんだよなぁ
安いモノでもないのに

311 :NAME IS NULL:2020/03/16(月) 10:24:24 ID:???.net
誰か exists と max で検証してみて
その上で議論しないと空回りするよ

312 :NAME IS NULL:2020/03/16(月) 10:55:53.45 ID:???.net
昔はそういうテクも有効だった
今どきはそう言うテクを使う必要は激減してるから使わなくていい、と言うかわかりにくいから使うな
要するに今は極々稀に役に立つかもしれないバッドノウハウ

313 :NAME IS NULL:2020/03/16(月) 22:13:24.85 ID:???.net
not existsはもう少し改善できる余地あるかもしれないが
distinct必要になるし単純なmaxより優れたプランになる可能性は感じられない
http://sqlfiddle.com/#!4/08250/4

314 :NAME IS NULL:2020/03/17(火) 08:18:39 ID:???.net
相関サブクエリはふつうnested loop joinになるが、index張ってないと最悪。
適切なindexを張っていれば集約関数を使う場合よりもfull scanの回数を抑えられる可能性はあるが、
ful scan自体大してかからないような小さいテーブルだと効果はない。

315 :NAME IS NULL:2020/03/17(火) 08:26:08 ID:???.net
>>314
>相関サブクエリはふつうnested loop
いまどき信じられんが

316 :NAME IS NULL:2020/03/17(火) 11:34:00 ID:???.net
適切なindex張ってれば集約関数もindex使うから関係ない

余程間抜けな集約関数使ってる時代遅れのDB以外ではバッドノウハウ

317 :NAME IS NULL:2020/03/23(月) 13:48:25 ID:???.net
oracleって連結したテーブルはupdateできないとかあって
existsを使わないといけないケースが多いな
それ以外はexistsは使わないほうがいい

318 :NAME IS NULL:2020/03/23(月) 20:08:06.00 ID:???.net
>>317
その理由は?

319 :NAME IS NULL:2020/03/23(月) 20:22:44 ID:???.net
遅いとかなんとか

320 :NAME IS NULL:2020/03/23(月) 20:35:43 ID:???.net
maxの代替で使うのがバッドノウハウってだけで
exists自体は別に使いたければ使えばいい

321 :NAME IS NULL:2020/03/24(火) 14:27:09 ID:???.net
>>318
existsはレコード件数ごと参照テーブルの検索が行われるため遅い
inner joinやleft joinで置き換え可能下記URL参照
http://kkoudev.github.io/blog/2013/09/14/sql/

特に not existsは、参照テーブルを前件検索しないと 存在しない事がわからないので特に遅いと思う

322 :NAME IS NULL:2020/03/24(火) 15:24:15 ID:+sBxQxtb.net
マシンパワーで解決できる場合は良くないとされるる
EXISTSやINとかのほうが意図が分かり易いから使っちゃう

323 :NAME IS NULL:2020/03/24(火) 19:49:59.21 ID:???.net
>特に not existsは、参照テーブルを前件検索しないと 存在しない事がわからないので特に遅いと思う

indexがない前提かな?

324 :NAME IS NULL:2020/03/24(火) 22:23:07.96 ID:???.net
今どきの賢いDBMSのオプティマイザなら、相関サブクエリとJoinとで同じ実行計画立ててるぞ

まあ、すべてでうまく置き換えてくれるわけではないが
相関サブクエリを速度対策のみのJoinに置き換えるのもそろそろバッドノウハウ行きだ

325 :NAME IS NULL:2020/03/24(火) 22:26:57.95 ID:???.net
>>321
それはDBMSとオプティマイザ次第だから実行プラン見たほうがいいぞ
LEFT JOIN+NULLチェックよりもNOT EXISTSのほうが効率いいケースは普通にある

326 :NAME IS NULL:2020/03/24(火) 22:48:06 ID:???.net
ちょっと古いけどSQL Serverでの比較
https://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join

シンプルなクエリならオプティマイザが置きかえてくれるだろうけど
複雑になるにつれて変換されない可能性が高くなるからちゃんと確認したほうがいいと思うよ
maxの件とは種類が違う

327 :NAME IS NULL:2020/03/25(水) 00:39:16 ID:Y/wLAjJV.net
SSMSで実行計画の視覚化めっちゃ参考になるんだけど
Oracleで似たようなことできるツールないかなあ

328 :NAME IS NULL:2020/03/25(水) 23:00:25 ID:xq5nC5FI.net
まずは視覚化の意味から勉強しろよ!

329 :NAME IS NULL:2020/03/26(木) 08:39:49 ID:???.net
可視化っ事を言いたいのかな?

330 :NAME IS NULL:2020/03/26(木) 12:58:25.08 ID:???.net
可視化の方がよく使われるけど視覚化と言う言葉もあって別に意味的にはおかしくない
むしろ>>328-329のツッコミが意味不明
https://dictionary.goo.ne.jp/word/%E8%A6%96%E8%A6%9A%E5%8C%96/

331 :NAME IS NULL:2020/03/27(金) 05:50:12.56 ID:YNcJxBjY.net
いや、もともと見えているという指摘だ。

332 :NAME IS NULL:2020/03/27(金) 06:44:22.83 ID:???.net
誰か>>331に話の流れを視覚化してやってくれw

333 :NAME IS NULL:2020/03/27(金) 12:43:21 ID:???.net
SSMSの実行計画表示みたことあるのか?
あれは他のDBでも欲しいよな

SQLSERVERの実行計画ってxmlで保存してあとからSSMSで表示できるはずだから
実行計画のコンバーター作れば良い感じにならんかなぁ

334 :NAME IS NULL:2020/03/27(金) 19:01:19.95 ID:???.net
Oracleで実行計画を見る方法はたくさんある

一番基本的なのはexplain planかSQL*Plusのautoexplain
ただこれはテキストベース

一番凝ってるのはEnterprise Managerで見る方法
これはグラフィカルに見ることが出来る
Enterprise EditionとTuning Packが必要だが

335 :NAME IS NULL:2020/04/02(木) 10:06:52 ID:???.net
りんご 3
バナナ 1
というテーブルから
りんご
りんご
りんご
バナナ
の出力を得たいです
個数分出力することはできますか?

336 :NAME IS NULL:2020/04/02(木) 15:21:33.77 ID:???.net
Postgresならgenerate_series使うと簡単にできる
CTE使えばどのDBでもできると思うけど
わざわざSQLでやるようなものじゃない

http://sqlfiddle.com/#!17/ed939/1

337 :NAME IS NULL:2020/04/02(木) 18:05:39.19 ID:???.net
ちょっと変なSQL作りたいならDBは何かを書いたほうがいいと思うの
ちなみに俺が使ってるDBならできる

338 :NAME IS NULL:2020/04/02(木) 18:17:59.36 ID:???.net
めんどくさい時はプロシージャ書いてしまう

339 :NAME IS NULL:2020/04/02(木) 20:32:18.83 ID:h5xHe3bE.net
日本人? 

340 :NAME IS NULL:2020/04/08(水) 04:43:09.61 ID:4vUSdipG.net
Androidのデータベースアプリについて
https://mevius.5ch.net/test/read.cgi/db/1586288558/

341 :NAME IS NULL:2020/04/19(日) 02:00:10 ID:+bt8+lxH.net
UPSERTの逆みたいな処理をしたいです。
(挿入先テーブルにレコードが存在すればUPDATEし、挿入元データになければ、挿入先テーブルから削除する)

以下の挿入先マスタテーブルがあるとします。
-------------------------
|  id  |  name  |  age  |
-------------------------
|  1  |  Aさん  |   22  |
|  2  |  Bさん  |   20  |
|  3  |  Cさん  |   26  |
-------------------------
そして、以下の挿入元データで更新します。
-------------------------
|  id  |  name  |  age  |
-------------------------
|  2  |  Aさん  |   23  |
-------------------------

この時に、BさんとCさんのデータが消えてAさんのデータが上記のデータで更新されるようにしたいのですが、
どのようなクエリで出来ますでしょうか?

一回、マスタの全レコード削除して、挿入元レコード全てをINSERTし直すのも考えましたが、
データ量が多いのと、参照整合性制約を切ってINSERTしてまた制約を付け直す処理が必要になる為、
可能であればもっと簡単な方法を教えて下さい。

342 :NAME IS NULL:2020/04/19(日) 03:07:03 ID:???.net
>>341
マスタテーブルをdropして
挿入テーブルをマスタテーブルにrenameする。

343 :NAME IS NULL:2020/04/19(日) 04:10:30.93 ID:u/pc2gUb.net
>>341
DELETEとINSERTの二発に分ける
・DBMSによってはDELETEでJOINが使える。
・使えなくてもWHEREでサブクエリを使えば同じことができる

344 :NAME IS NULL:2020/04/19(日) 09:11:09 ID:???.net
>>341
DBMSがわからないので回答できないが
俺の使ってるDBMSなら2回になるけどDELETEとUPDATEで可能

345 :NAME IS NULL:2020/04/19(日) 09:59:00.91 ID:???.net
データ量が多いならなおのこと、1レコードずつ処理される方法より
サクッと入れ替えた方が簡単そうだなぁ。

346 :NAME IS NULL:2020/04/19(日) 12:03:25.90 ID:???.net
>>341
DBMSは?
(てか、質問ならテンプレ使え)

347 :NAME IS NULL:2020/04/19(日) 15:43:35.69 ID:???.net
SQL ServerならMERGE一発で可

ソースに対象データがない場合のアクションはSQL標準のMERGEにはない機能なので
SQL標準のMERGEで対応したければ削除対象のキーを含む挿入元データを作成する

でもそんなんするくらいならテーブル入れ替えるかtruncate+select intoするほうが簡単
レプリしてればどの方法でも別途考慮は必要

348 :NAME IS NULL:2020/04/19(日) 15:45:22.10 ID:???.net
>>341
削除したマスターのレコードを参照してるデータはどうなるの?
CASCADEでDELETE?

349 :NAME IS NULL:2020/04/19(日) 16:01:24.69 ID:???.net
普通データ削除したい時は物理削除ではなく
削除用カラムを追加して削除フラグをたてるだけにする
データデースにはundo とかないので元に戻せないから
どうでもいいデータなら物理削除してもいいけどさ

350 :NAME IS NULL:2020/04/19(日) 16:28:20.09 ID:???.net
外野で言うんだけどさ
マスターデータをこのようにさっくり消しているシステムって何か怖い

351 :NAME IS NULL:2020/04/19(日) 16:48:29.76 ID:???.net
削除フラグは良し悪しあるからね
思考停止状態で削除フラグ入れてるところはDB設計がすぐ腐る

352 :NAME IS NULL:2020/04/19(日) 17:34:54.51 ID:???.net
>>349
普通だと?

353 :NAME IS NULL:2020/04/19(日) 17:38:42.67 ID:uOven4R3.net
>>349
そういう論理削除が普通だと思っていると常に論理削除レコードかどうかを意識するSQLを書かないといけなくなり、テーブルにレコードがたまってしまう。

だから古いレコードは別テーブルに移動させる方がよい。

354 :NAME IS NULL:2020/04/19(日) 18:00:48.66 ID:???.net
印字した帳票と連動してるので発番したものを戻せないとか
ユーザアカウントを一時凍結するとか
理由があれば、まあ

特に意味はないけどお客が安心するから
とりあえず論理削除方式ってのはありがち

んで、容量逼迫するから、月次や年次処理で
一定期間更新がない論理削除データを物理削除する
みたいなのもあったなぁ

355 :NAME IS NULL:2020/04/19(日) 18:05:41.63 ID:???.net
ゆーて結局バックアップは別にとることが多いけどね

356 :NAME IS NULL:2020/04/19(日) 18:42:24.24 ID:???.net
あと削除してもトランザクションログから戻せるよね

357 :NAME IS NULL:2020/04/19(日) 19:02:18.63 ID:???.net
バックアップって、障害時の復旧には意味があるけれど
個別データの復活で使えるの?

358 :NAME IS NULL:2020/04/19(日) 19:24:45.10 ID:???.net
例えば社員マスタで退社した社員を物理削除して削除した社員番号で違う人を登録した場合に不都合が生じる
退社した人のデータが連結されてしまうとかがある

359 :NAME IS NULL:2020/04/19(日) 19:34:36.96 ID:???.net
>>342
その後の事(挿入テーブルはそのまま残す)を考えると

1.マスターテーブルをdrop&create(空テーブルで全件削除と同じ)
2.挿入テーブル全件をマスターテーブルにコピー

にした方がいいな。

360 :NAME IS NULL:2020/04/19(日) 20:02:32.61 ID:???.net
>>358
それは設計のバグだろう。
もしかして自然に発生する障害みたいに思っているのかな。

361 :NAME IS NULL:2020/04/19(日) 20:03:56.80 ID:???.net
このスレで言うのはなんだかそれ運用がおかしくないか?

362 :NAME IS NULL:2020/04/19(日) 20:04:27.96 ID:???.net
>>361>>358

363 :NAME IS NULL:2020/04/19(日) 20:28:06.38 ID:???.net
1から設計できる立場なら避けるけど
改修とかで押し付けられた既存システムキメラとかに
まれによくあるよね

364 :NAME IS NULL:2020/04/19(日) 20:32:02.57 ID:???.net
社員マスタは例えばの話ですが
他のマスターでも起こりうる
論理削除だと永久欠番にできデータの整合性を保てるが物理削除すると前に使われていたかもわからなくなりデータ不整合が発生するリスクがあるんだと言いたかった。

365 :NAME IS NULL:2020/04/19(日) 20:35:23.42 ID:???.net
自然キーじゃなくて得体のしれない「ID」を使ってるとみた。

366 :NAME IS NULL:2020/04/19(日) 20:41:50.95 ID:???.net
はいはい別行ってやれ

367 :NAME IS NULL:2020/04/19(日) 20:43:29.13 ID:???.net
まれによくある
ジョークのつもりなんだろか

368 :NAME IS NULL:2020/04/19(日) 21:16:07.47 ID:???.net
>>358
それは社員番号の採番方式の問題やろ

369 :NAME IS NULL:2020/04/19(日) 21:18:23.65 ID:???.net
下手なたとえをするとろくな事にならない

370 :NAME IS NULL:2020/04/19(日) 21:28:08.99 ID:???.net
社員番号の再利用なんて聞いたことがないな。
俺が世間知らずなだけか?

371 :NAME IS NULL:2020/04/19(日) 21:52:39 ID:???.net
>>370
過去に一度であったことがある
社員数が急増して、想定した桁数で足りなくなったという理由らしい

まあ、SQL関係ない

372 :NAME IS NULL:2020/04/19(日) 22:01:51 ID:???.net
SQLの質問が入る

「そもそもその設計おかしくね?」とツッコミが入る

そのツッコミにまたツッコミが入る

設計談議で盛り上がる

373 :NAME IS NULL:2020/04/19(日) 22:11:03.74 ID:uOven4R3.net
バックアップなんて発想が出てくるのは、よほど小さいデータベースの話。

374 :NAME IS NULL:2020/04/19(日) 22:24:49.63 ID:???.net
>>359
>その後の事(挿入テーブルはそのまま残す)を考えると

挿入テーブルを毎回新規作成すればよくね?
わざわざコピーする価値があるケースのほうが少ない気がするんだけど
古いマスターもdropじゃなくrenameすればアーカイブとして取っておける

375 :NAME IS NULL:2020/04/19(日) 22:42:07 ID:u/pc2gUb.net
質問者不在で盛り上がってるなw

>>349
普通とか書かない方がいいぞ
脳死で削除フラグつけるのはアンチパターンでもある

PK制約に明示的に名前つけてると
テーブル名リネームした時に変わらないでズレて悩むことがあるから注意な

376 :NAME IS NULL:2020/04/19(日) 23:10:45 ID:???.net
>>373
え?

377 :NAME IS NULL:2020/04/20(月) 00:01:22 ID:???.net
>>374
>挿入テーブルを毎回新規作成すればよくね?

そんな事を言い出したら質問の回答にならない。
質問者は処理後に挿入テーブルのデータを全てクリアするなんて
言ってないんだから。

378 :NAME IS NULL:2020/04/20(月) 01:01:56 ID:FyjM5Hbd.net
テーブルを作るんじゃなくて、レコードを移動させろよ!

379 :NAME IS NULL:2020/04/20(月) 01:06:55 ID:???.net
>>377
考え方が社畜の鑑やね

380 :NAME IS NULL:2020/04/20(月) 09:36:35.31 ID:???.net
>>377
挿入テーブルのデータを残したいならそうすればいいだけ
コピーの有無以外にもマスターテーブルを先にdropするやり方は
挿入時にエラーが発生した場合の対処が複雑化するから一般的に悪手

381 :NAME IS NULL:2020/04/20(月) 11:15:49.18 ID:???.net
>>380
それならまず別名でテーブルを作成し次に挿入テーブルから別名テーブルへの
コピーをしてエラーがなければマスタテーブルをdropして
別名をマスターにrenameすればいい。

社員情報のマスターはそれなりの件数があると思うし
処理サイクルは毎日か知らんが(多分毎日だろう)、処理する度に
わざわざDB上に旧データのバックアップテーブルを追加していくのは
どうかと思う。

バックアップならDB外のエクスポートファイル(ファイル名にYYYYMMDD等をつけて)
の圧縮で残せばいいと思う。

382 :NAME IS NULL:2020/04/20(月) 15:05:03.85 ID:???.net
結局、毎回新規作成w
そんな事を言い出したら質問の回答にならないw

383 :NAME IS NULL:2020/04/20(月) 16:29:38 ID:???.net
そろそろ模範解答とやらを出して、次の話題にしようぜ

384 :NAME IS NULL:2020/04/20(月) 18:20:09.97 ID:???.net
>>381
社員マスタならむしろめちゃ件数少ないだろ

385 :NAME IS NULL:2020/04/20(月) 18:27:29.28 ID:???.net
そろそろ別スレ行け

386 :NAME IS NULL:2020/04/20(月) 18:34:24.56 ID:???.net
>>382
>結局、毎回新規作成w
何か問題でもあるのか?

>そんな事を言い出したら質問の回答にならないw
意味不明。
質問者の要求通りの回答をしてるつもりだけど。

387 :NAME IS NULL:2020/04/20(月) 18:46:06.48 ID:???.net
消せるならDELETE(TRUNCATE)してカラムが全部同じならINSERTだろうが
制約があるから消せないって書いてないか?

388 :NAME IS NULL:2020/04/20(月) 20:13:42.34 ID:???.net
そこは制約を一旦無効化してやるだろう。
ただ、再度有効化するのにかかる時間を考えたら UPDATE & DELETE と変わらんかもしれんが。

389 :NAME IS NULL:2020/04/20(月) 20:19:50.76 ID:9OdQ3HCy.net
なんか勝手に処理追加しだしたぞw

390 :NAME IS NULL:2020/04/20(月) 20:21:09.97 ID:???.net
追加された処理ってどれ?

391 :NAME IS NULL:2020/04/20(月) 21:06:31.32 ID:???.net
>>381
単発処理ならいいけど定期処理ならまずやらない
バックアップが依存ジョブになるリスクや運用面への影響を全く考慮できてない

392 :NAME IS NULL:2020/04/20(月) 21:38:53.03 ID:???.net
>>391
バックアップは一緒に処理しないで
バックアップ専用の処理(他のテーブルと合わせて)でいいと思う。

393 :NAME IS NULL:2020/04/21(火) 10:57:26.55 ID:???.net
>>384
質問者(>>341)はデータ量が多いと言ってる。

しかし質問者は未だに返信なしかよw

394 :NAME IS NULL:2020/04/21(火) 19:15:01.09 ID:???.net
設計スレの話題になるが
>>341
のデータで年齢ってあるけど普通は生年月日を定義して必要に応じて年齢を計算なんじゃないかと思うけど
年齢なんて定義するか?

395 :NAME IS NULL:2020/04/21(火) 19:37:15.91 ID:???.net
>>394
>>341は項目としての例を挙げただけだと思う。
項目なんて何でもよかったんだよ。
キー項目があってキー項目でupdateしたいって事を
言いたかっただけだと思う。

396 :NAME IS NULL:2020/04/21(火) 19:47:08.38 ID:???.net
単なるアンケートとかで普通にあるでしょ
アンケートごときに生年月日なんて言う個人情報を登録したくない人は多いだろうし

397 :NAME IS NULL:2020/04/21(火) 20:55:02.10 ID:???.net
この話題、これ以上引っ張る意味あるのか?

398 :NAME IS NULL:2020/04/21(火) 21:55:05.84 ID:???.net
よく見るとマスタに年齢もつのおかしいな
来年になったら更新が必要じゃん
生年月日もったほうがいいよな

399 :NAME IS NULL:2020/04/21(火) 22:03:24.61 ID:???.net
ケースバイケース

400 :NAME IS NULL:2020/04/21(火) 23:43:19 ID:???.net
死者マスタとか

401 :NAME IS NULL:2020/04/21(火) 23:56:53 ID:???.net
お寺で使う法要データーベースかな

402 :NAME IS NULL:2020/04/22(水) 06:44:25.04 ID:???.net
>>397
これはsqlのしつもんですか?

403 :NAME IS NULL:2020/04/22(水) 08:06:50 ID:???.net
飽きたなら新しい話題振ればいいんじゃない?

「ボク、このはなしつまんなーい!」
ってガキじゃないんだから

404 :NAME IS NULL:2020/04/22(水) 09:30:49 ID:oLnoXm0l.net
少ないデータしか扱ったことがないやつは参考にならない。

405 :NAME IS NULL:2020/04/22(水) 11:56:08 ID:???.net
それでは難しい質問をします
下記の複数レコードを1レコードにするSQLを教えて下さい

------------------
|  mail   |
------------------
|  aaa@hoge.com   |
|  bbb@hoge.com  |
|  ccc@hoge.com  |
-------------------
これをカンマ区切りで1レコードにする例は3件だが3件とは限らない
-------------------------------------------
|  mail    |
-------------------------------------------
|  aaa@hoge.com,bbb@hoge.com,ccc@hoge.com |
-------------------------------------------

データベースはSqlserverです

406 :NAME IS NULL:2020/04/22(水) 12:35:12.15 ID:???.net
失職者の仕事できますアピールみたいだ

407 :NAME IS NULL:2020/04/22(水) 13:30:41.69 ID:TJ5jZu/H.net
>>405
縦を横にするのは頻出の質問ではありますが標準的な方法はありません
その後の利用シーンによりますがSQL ServerならUDF書くのもありです

408 :NAME IS NULL:2020/04/22(水) 13:48:47.09 ID:???.net
STRING_AGGでいいんでないの?
ttps://sql55.com/query/sql-server-2017-new-functions-string-agg.php

409 :NAME IS NULL:2020/04/22(水) 15:21:32 ID:???.net
>>407
listagg()は標準(2016)に定義されている
同名の関数が定義されてなくてもgroup_concatやstring_aggのような同等の関数がある
めんどくさいからやらないけどCTEでも実現可

>>405
SQL Serverなら
1. STRING_AGG (2017)
2. COALESCE
3. FOR XML PATH

ただほとんどの場合SQLでやる必要ない

410 :NAME IS NULL:2020/04/22(水) 15:39:47 ID:???.net
>>392
それバックアップ失敗してても困らない前提だよね?
renameはtransactionalに出来ないDBMSでもエラー検知して元に戻せるけど
dropはrollbackできないDBMSだと復旧モデルによってはデータロスト

411 :NAME IS NULL:2020/04/22(水) 15:47:37 ID:???.net
>>393
そりゃ社員マスターじゃないからだろ

412 :NAME IS NULL:2020/04/22(水) 16:24:54 ID:???.net
>>409
いろいろやり方おしえてくれてありがとうございました

COALESCEの場合は下記の様に変数使えばできるのですね知らなかった

DECLARE @STR VARCHAR(8000);

SELECT @STR = COALESCE(@STR + ’,’,’’) +[MAIL] 
FROM テーブル

SELECT @STR 

413 :NAME IS NULL:2020/04/22(水) 18:35:33.03 ID:???.net
3件とは限らないってことはN件なんだから8000桁って指定しちゃだめだろ
アホ

414 :NAME IS NULL:2020/04/22(水) 18:45:00.29 ID:???.net
>>413
アホはお前
https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/char-and-varchar-transact-sql?view=sql-server-ver15

415 :NAME IS NULL:2020/04/22(水) 19:40:26.85 ID:???.net
SQL Serverなら(max)とか別の制限かかる実質LOBな型もあるけど

元質問がSQL Serverだったから8000なんだが
このへんDBMSによってどのくらい違うんだろうな

416 :NAME IS NULL:2020/04/22(水) 19:45:30.09 ID:???.net
VARCHARを問題にしてるんじゃないのか

417 :NAME IS NULL:2020/04/22(水) 20:02:25.33 ID:???.net
>>416
どう問題なの?
MailがメールアドレスならANKしか入らないと思うが

418 :NAME IS NULL:2020/04/22(水) 20:32:42.51 ID:???.net
max指定しろってことでしょ
ケースバイケースなので8000指定が駄目って事はない

419 :NAME IS NULL:2020/04/22(水) 22:13:42 ID:???.net
>>418
> max指定しろってことでしょ
maxはオーバーヘッドあるからmaxならいいかどうかもケースバイケース

420 :NAME IS NULL:2020/04/22(水) 22:24:18 ID:???.net
>>419
同じこと言い直してドヤるのやめて〜ww

421 :NAME IS NULL:2020/04/23(木) 13:14:25.56 ID:A92VRI4I.net
左外部結合を使う というのを文にするときはどうしたいいですか?
Aを左、Bを右、xを共通として左外部結合する
みたいな言い方を考えていたのですが、正しい日本語の文があれば教えてください。

422 :NAME IS NULL:2020/04/23(木) 15:05:14.19 ID:???.net
文章にすることで何を達成したいかっていう目的を書けよ

あらゆる状況に当てはまる万能な回答や
正しい回答があるという考えで通用するのは高校生まで

423 :NAME IS NULL:2020/04/23(木) 15:18:37.03 ID:???.net
外部テーブル、内部テーブル、結合条件あたりが一般的な用語

(例)
Aを外部テーブル、Bを内部テーブル、A.x = B.xを結合条件として外部結合をする場合、
左外部結合なら外部テーブルを左に置いて`A LEFT OUTER JOIN B ON A.x = B.x`と書く
右外部結合なら…

424 :NAME IS NULL:2020/04/23(木) 15:21:53.73 ID:???.net
>>423
左外部結合なら外部テーブルをJOIN句の左側に置いて…

425 :NAME IS NULL:2020/04/23(木) 15:40:57 ID:???.net
ググったらこんなの見つけた

自然言語からSQL文を生成!リクルートのAI A3RT「SQL Suggest API」でクエリを作る
https://ledge.ai/a3rt-sqlsuggestapi/

426 :NAME IS NULL:2020/04/23(木) 15:47:20 ID:A92VRI4I.net
>>422
目的は詳細設計書です。
コードは書けるのですが、日本語文にするとわかりづらく。

427 :NAME IS NULL:2020/04/23(木) 16:04:20.56 ID:???.net
>>426
テーブル間の依存関係は文字だと表現しにくい
ER図がよく使われていると思う
https://it-koala.com/entity-relationship-diagram-1897

428 :NAME IS NULL:2020/04/23(木) 17:12:33.12 ID:A92VRI4I.net
>>422 - >>427
助言ありがとうございます。
考えてみます。

429 :NAME IS NULL:2020/04/23(木) 17:15:33.71 ID:???.net
>>427
ER図で表現できる内容ではないと思うぞ
図にするならベン図で色分けとかだろうけど
詳細設計書なら外部結合自体を知らない読み手を想定する必要はないだろうから
文章とSQLで十分だと思う

>>421
左や右はそんな重要な情報じゃないので
>>423のようにAが外部テーブル(外部表)だってことを明記するのがいいと思う

430 :NAME IS NULL:2020/04/23(木) 18:39:20.99 ID:???.net
そもそも、左外部結合を使うじゃなくて
左外部結合する って書くのが普通じゃないのか

431 :NAME IS NULL:2020/04/23(木) 18:58:23.51 ID:8zqlFX72.net
>>423
外部テーブル、内部テーブルという言い方は聞いたことがない。

結合方法なのにテーブルの種類みたいになっているのはおかしい。

外部表、内部表という言葉は俗語で、Oracle Databaseでは外部表はテーブルではないがテーブルとして扱えるファイルのことを差していたりもする。

432 :NAME IS NULL:2020/04/23(木) 19:01:17.22 ID:8zqlFX72.net
>>426
それはSQLを直訳しようとしているからダメなんだよ。

どういうデータを取得したいのかを書こうとしていない。

433 :NAME IS NULL:2020/04/23(木) 19:02:13.58 ID:8zqlFX72.net
>>430
それ本来は設計書じゃないよ。

434 :NAME IS NULL:2020/04/23(木) 22:03:44.25 ID:???.net
>>426
詳細設計なら
別に日本語文章にしなくても
SQLそのまま書けばいいんじゃね?

何の為の詳細設計か知らんけど

435 :NAME IS NULL:2020/04/23(木) 22:07:22.99 ID:???.net
>>431
outer table, inner tableの訳な、external tableとは別
お前が聞いたことなくても一般的に使われてるぞ
“join outer table”でoracleのリファレンスでもググってみれば

436 :NAME IS NULL:2020/04/24(金) 00:04:56.06 ID:stdEEZWC.net
自然言語言語書き下し翻訳じゃなくて設計なんだから
「XXテーブルをxxコードで探索し存在するものについてはxxを取得する」
とかじゃないのか
建前としてそもそもSQL書く前の話なんだから

437 :NAME IS NULL:2020/04/24(金) 05:05:24.57 ID:???.net
>>435
> お前が聞いたことなくても一般的に使われてるぞ
聞いたことないしググっても出てこん
お前がググった結果のURL貼ってくれ

438 :NAME IS NULL:2020/04/24(金) 05:57:10.61 ID:stdEEZWC.net
>>437
435じゃないけど
日本語
https://www.google.com/search?q=%22%E5%A4%96%E9%83%A8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%22+%22%E5%86%85%E9%83%A8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%22+%28JOIN+OR+%E7%B5%90%E5%90%88%29
英語
https://www.google.com/search?q=%22inner+table%22+%22outer+table%22+join

連語とか漢字片仮名混じりをググる時はダブルクォートでくくるといいよ

439 :NAME IS NULL:2020/04/24(金) 16:41:06 ID:???.net
>>437
site検索すればいいよ
https://www.google.com/search?q="outer+table"+site:docs.oracle.com
で見つかるのが例えばこれ↓

9.3.2 Outer Joins
In ANSI syntax, the OUTER JOIN clause specifies an outer join.
In the FROM clause, the left table appears to the left of the OUTER JOIN keywords, and the right table appears to the right of these keywords.
The left table is also called the outer table, and the right table is also called the inner table.
https://docs.oracle.com/en/database/oracle/oracle-database/18/tgsql/joins.html#GUID-2174C4BA-C852-4050-9269-353A3B40B355

440 :NAME IS NULL:2020/04/25(土) 17:07:49 ID:rcJuFzMJ.net
>>435
だから日本語訳の話だと言っているだろ

441 :NAME IS NULL:2020/04/25(土) 17:10:01 ID:rcJuFzMJ.net
>>439
inner、outerの意味がわかっているのか?

442 :NAME IS NULL:2020/04/25(土) 17:12:35 ID:rcJuFzMJ.net
日本オラクルの翻訳を知らないとはあきれてる。

443 :NAME IS NULL:2020/04/26(日) 13:46:54.98 ID:???.net
くるみぽんちおおおおおおおおおおおおおおおおおおおお

444 :NAME IS NULL:2020/04/27(月) 20:19:07.34 ID:???.net
python3.6.8で作業しています。

ttps://datadryad.org/stash/dataset/doi:10.5061/dryad.8q0s4
この度上のデータベースを利用することになり、
sqlite3でreadmeにあるコマンドを順次実行したところ、
33行目で
sqlite3.OperationalError: near "LOAD": syntax error
と出てそこから先に進むことができません。
指すファイルは作業フォルダにあるはずなのですが、SQLは素人なこともあり、修正すべき場所がわかりません。
ご教授いただければ幸いです。

445 :NAME IS NULL:2020/04/27(月) 20:54:17.13 ID:kgVJ186j.net
>>444
SQLiteにはLOAD DATAコマンドはないからな
.importコマンドでいけるかも
https://sfnovicenotes.blogspot.com/2019/10/sqlite3-tsvtsv.html

446 :NAME IS NULL:2020/04/27(月) 20:55:20.96 ID:CJEbYb0s.net
わざわざhを取っているあたりからネタだと思われる

447 :NAME IS NULL:2020/04/28(火) 09:03:13 ID:/YfVzCiV.net
SQL Server 2014です。

以下のようなテーブルがあって

記号 状態
A   0
A   0
B   0
B   1
B 0
C 0
C 1

記号「A」のような一つも状態「1」を持たない記号を知りたいのですがどのようなSQLで実現できるでしょうか?お願いします。

448 :447:2020/04/28(火) 09:12:03 ID:/YfVzCiV.net
ずれたテーブルを投稿してしまい失礼しました。

記号 状態
A   0
A   0
B   0
B   1
B   0
C   0
C   1

状態の最大値が0の記号を出せばいけるかなと思いついたのですが
状態は文字列となっており断念しました。。。

449 :NAME IS NULL:2020/04/28(火) 11:50:05 ID:???.net
普通にgroup by havingでいけない?

450 :NAME IS NULL:2020/04/28(火) 14:38:14 ID:???.net
group by havingじゃいけなかったわ
not existsで
https://rextester.com/PTTTA8276

451 :NAME IS NULL:2020/04/28(火) 15:02:44 ID:???.net
case式使えばいけなくもなかったわ
https://rextester.com/ESUVD85828

452 :NAME IS NULL:2020/04/28(火) 19:26:29 ID:???.net
結構いろんな方法があるな
https://rextester.com/AACL20435

453 :NAME IS NULL:2020/04/28(火) 22:39:11.85 ID:???.net
SQL-Serverなら文字列でもMax使えるから普通にgroup byとhavingでいけるでしょ
select 記号 from テーブル group by 記号 having max(状態) = '0'

454 :447:2020/04/28(火) 22:59:50.90 ID:???.net
やりたい事ができました
色々アドバイスありがとうございます
同じテーブルにNOT EXISTSとか思いもよりませんでした
大変参考になります

455 :NAME IS NULL:2020/04/29(水) 00:48:38.24 ID:???.net
NOT EXISTSとGROUP BYどっちがパフォーマンスいいんだろ

456 :NAME IS NULL:2020/04/29(水) 13:40:52 ID:???.net
実行計画次第だから、実際のテーブル定義と件数で実行計画比較しないと意味がない

NOT EXISTS(NOT INでも)だと自己結合するから、テーブルの走査が2回必要
HAVINGだと1回で済むので、こっちのほうが早いかもしれないし
インデックスで結合するテーブルの走査が圧倒的に早ければ結合するほうが早いかもしれない

普通のHAVINGにはインデックスきかないよね?
これをインデックス付きビューにしとけばおそらくそれが最速

457 :NAME IS NULL:2020/04/29(水) 15:44:57 ID:???.net
2万件弱で試してみたが直感どおりの結果
https://rextester.com/TOMK9751

458 :NAME IS NULL:2020/04/29(水) 16:59:15.86 ID:???.net
いまどきEXISTSにSELECT 1とか...

459 :NAME IS NULL:2020/04/29(水) 17:55:50 ID:???.net
>>458
SQLに詳しいやつが
なんでSELECT 1使うのか調べたほうがいいよ

460 :NAME IS NULL:2020/04/29(水) 21:59:25.64 ID:???.net
>>456
NOT INてインデックス有効?
NOT EXISTSの方が遥かに速かった記憶が。

461 :NAME IS NULL:2020/04/29(水) 22:20:32.50 ID:???.net
ぐぐったら「SELECT 1の方が速い」「SELECT *の方が速い」「オラクルのバージョンによる」「評価されないのでどっちでもいい」ってマチマチだったので、試してみた
https://rextester.com/QWAU74067

462 :NAME IS NULL:2020/04/29(水) 23:58:51.29 ID:???.net
>>460
NOT INの対象のサブクエリには当然効くでしょ

463 :NAME IS NULL:2020/04/30(木) 00:02:54.61 ID:???.net
インデックスの話とは関係ないが
NOT IN使っても最近はオプティマイザがよろしくやってくれるから昔ほど避ける必要ない

464 :NAME IS NULL:2020/04/30(木) 11:49:14.64 ID:tHc+PwYH.net
phpmyadminをxamppで使用しています
特権タブにlocalhostがありますので、あらたにユーザーを追加しなくてもいいということでしょうか?localhost=自分ということかと思いますです

465 :NAME IS NULL:2020/04/30(木) 20:49:53.13 ID:ZnoS/PPZ.net
>>461
Oracle Databaseの慣習だと1ではなく、Xだけど、データを取得したいのか、データの有無を調べたいかの意志表示でこう書いている。

466 :NAME IS NULL:2020/05/02(土) 12:39:45.35 ID:???.net
date player score movingAvg
20200502  A  90 ?

20200502  B  80 ?
20200502  C  95 ?
20200501  A  80 ?
20200501  B  75 ?
20200501  C  90 ?



という感じで、複数人のプレイヤーのスコアデータがあるときに、
各プレイヤーのスコアの移動平均を求めて別カラム(?のところ)
に保存する方法を教えてください。

スコアの移動平均は、その行の日付を含まないでその行の日付から
過去10日間のスコアの平均とします。

使っているのはsqlite3(python)です。

よろしくお願いします。

467 :NAME IS NULL:2020/05/02(土) 14:37:30.18 ID:???.net
くそめんどくせーから日付の部分は自分で加工しろ
select date,player,score,(select avg(score) from tbl as tbl2 where tbl2.date<tbl.date and tbl2.date>=tbl.dateの10日前) from tbl

468 :NAME IS NULL:2020/05/02(土) 14:57:25.55 ID:???.net
たぶんこんな感じ
日付周りは適当に直して
select
*,
(select avg(score) from scoretable
WHERE player=t.player and date < t.date and date >= (date - 10)
) AS ?
from scoretable t

469 :NAME IS NULL:2020/05/02(土) 15:48:23.05 ID:???.net
歯抜けがなければwindow関数でもいけるけど
歯抜けがある場合にsqliteだとwindow関数でやるやり方わからないな
rowsじゃなくrange指定でdate関数使ったやり方分かる人いたら教えて
https://www.db-fiddle.com/f/wBESjSYhMTd9hTSWyDf9kE/0

470 :466:2020/05/02(土) 15:53:15.27 ID:???.net
>>467
>>468

ありがとうございます!
日付部分は、20200502→2020-05-02という形にして、
date(t.date, "-10 days")などとすればできました。

いただいたアドバイスを元に、

select * , (select avg(score) from scoreTable
WHERE player=t.player and date < t.date and date >= date(t.date, "-10 days"))
as movingAvg from scoreTable t

にて、*と計算されたmovingAvgを抜き出すことができました。
この結果をmovingAvgのカラムに保存したいのですが、
保存まで1つのsql文で書くにはどう書いたらよいでしょうか?
update scoreTable set movingAvg = (select …
のような感じで試みるもうまくいかず、、お願いします。

471 :NAME IS NULL:2020/05/02(土) 16:15:06.13 ID:???.net
update scoreTable
set movingAvg = (select avg(t1.score) from scoreTable as t1 WHERE t1.player=scoreTable.player and t1.date < scoreTable.date and t1.date >= date(scoreTable.date, "-10 days"))

472 :NAME IS NULL:2020/05/02(土) 16:17:08.29 ID:???.net
一応俺のくせなだけだが
別名をどちらかだけつけるなら加工する側のSQLにつけたほうがいいと思う

473 :NAME IS NULL:2020/05/02(土) 16:25:45.50 ID:???.net
純粋に計算で求められる値をテーブルに保存すべきかどうかはよく検討したほうがいいぞ

474 :466:2020/05/02(土) 16:43:36.87 ID:???.net
>>471

ありがとうございます。そのままコピーしてできました!
教えていただいた皆様、大変ありがとうございました。

>>473
保存しないでメモリで計算すべきということでしょうか?
またあとでみたいので途中計算も保存しちゃってます。

475 :466:2020/05/02(土) 17:11:51.32 ID:???.net
全部質問で恥ずかしいのですが、もう1つお願いします。
移動平均の日付範囲の中に要素がなかったときに、
NOT NULL constraint failedというエラーとなります。
(当日を含まず、歯抜けの日もあるため)
avg()がNULLとなる場合をスキップしてそれ以外だけ
計算する方法がありましたら教えてください。

476 :NAME IS NULL:2020/05/02(土) 17:22:57 ID:???.net
>>475
COALESCE

477 :466:2020/05/02(土) 17:32:59.92 ID:???.net
>>476

ありがとうございます。coalesceでぐぐって、
こちらのページをみて、
https://www.dbonline.jp/sqlite/function/index23.html

ひとまず、

update scoreTable set movingAvg =
ifnull((select avg(t1.score) from scoreTable as t1
WHERE t1.player=scoreTable.player and t1.date < scoreTable.date
and t1.date >= date(scoreTable.date, "-10 days")), 0.0)

としてみたらどうやらできました。

ありがとうございました。

478 :NAME IS NULL:2020/05/02(土) 17:57:41.30 ID:???.net
>>469
ポスグレなら RANGE BETWEEN '10 day' PRECEDING とか書けるみたい
(https://masahikosawada.github.io/2018/07/07/Window-Frame/#fnref:syntax)
ちょっとSQL Serverでためしたけど、RANGEとか制約多すぎて使いもんにならんな

すなおに相関サブクエリでやるほうがいいパターンなんだろうかね

479 :NAME IS NULL:2020/05/02(土) 18:02:45.73 ID:???.net
それNULLをスキップしてるんじゃなくてNULLをゼロにしてるだけなんだが...

ちゃんとスキップしたいならWHEREに条件かけよとか
そもそもなんでNOT NULLなんだとか
いやそもそもビューで良いんじゃねえかとか

つっこみどころ満載だな

480 :NAME IS NULL:2020/05/02(土) 18:08:36 ID:???.net
プログラムに限らず、2ちゃんねるの専門系の質問スレって
どこよりもたよりになる。過去何度も助けられてる。
答えてる人々はどういうモチベーションなんだろう。
自己鍛錬的なあれだろうか。

481 :NAME IS NULL:2020/05/02(土) 18:12:16 ID:???.net
そういえば最近自分も外れ値を除外するために移動平均をデータにセットしたな。しかしバラツキが大きいと移動平均と比較しても意味ないので標準偏差も計算してセットした。

482 :NAME IS NULL:2020/05/02(土) 18:13:38 ID:???.net
まあ趣味的なデータっぽいからいいと思うが

自分もビューにしたほうがいいんじゃないかとは思う
日付のデータは当日分または前日分1日だけなら
毎回更新するのはコストがかかりすぎじゃないかという気もする

483 :NAME IS NULL:2020/05/02(土) 18:14:47 ID:???.net
>>477
COALESCEはSQL標準
IFNULLやISNULLはDBMS特有の関数
なので都合が悪いケースじゃなければCOALESCE使う

よく読んでなかったけど
NOT NULL constraint failedって
moving_avgがnullになる可能性もあるのにNOT NULL付けたらだめじゃないの?
10日間のスコア平均が0.0の場合と値が無いケースとの区別ができなくなる

484 :NAME IS NULL:2020/05/02(土) 18:15:59 ID:???.net
毎日1日分のデータを登録するという運用なら
INSERTするときにさっきのAVGのデータをSELECTでひろって
INSERT〜SELECTするという手もあるけどね

485 :NAME IS NULL:2020/05/02(土) 18:22:08 ID:IGZUerYJ.net
>>474
簡単に導出できる値を持つというのとは、二重、三重に値を持つことと同じことになる。

486 :NAME IS NULL:2020/05/02(土) 18:27:50 ID:IGZUerYJ.net
>>477
なんかどんどん変な慣習に引きずられているなw

他のひとも指摘しているけど、NULLを返すレコードがあるなら、そのレコードを初めから排除しとけよ。

487 :466:2020/05/02(土) 18:30:08 ID:???.net
皆様

ご指摘のとおり、自分でNOT NULLをつけており、
それがエラーになっていることがわかっていませんでした。

ビューというは知らないので調べてみます。

色々とご助言ありがとうございます。

488 :NAME IS NULL:2020/05/02(土) 18:33:03 ID:IGZUerYJ.net
>>477
自分のなかで決まりがなさすぎだろ。

なんとかdateという名前にしておきながら、データ型がバラバラとかあからさまに初心者。

489 :NAME IS NULL:2020/05/02(土) 18:56:10.24 ID:???.net
ID:IGZUerYJ
なんだこいつw

490 :NAME IS NULL:2020/05/02(土) 19:26:39.19 ID:???.net
あきらかに初心者な質問にそんな文句いってもなぁ
自分ではなにも回答してないのにマウントだけとりたいのか

なんかsqliteの解説みてると日付型ってもってなさそうだけど
データ型がバラバラってどこ見ていってるんだろうな

491 :NAME IS NULL:2020/05/02(土) 19:51:26.39 ID:???.net
>>487
聞くのはいいけど
自分で試行錯誤した内容でアドバイスもらうのも
ありかと思うぜ

492 :NAME IS NULL:2020/05/02(土) 19:57:09.55 ID:IGZUerYJ.net
YYYYMMDDの書式が年月日だと思うのはエスパーなのかと思っただけ

493 :NAME IS NULL:2020/05/02(土) 19:57:31.25 ID:???.net
SQLお悩み相談所w

494 :NAME IS NULL:2020/05/02(土) 20:22:35.55 ID:???.net
分析能力がないのを言い訳にしてんなよ

495 :NAME IS NULL:2020/05/04(月) 14:30:54.86 ID:YYpoNRhr.net
1 http://i.imgur.com/CW4UUJe.jpg
2 http://images2.imgbox.com/39/cb/qYQo3EWi_o.jpg
3 http://i.imgur.com/3i00gxE.jpg
4 http://i.imgur.com/pp8F1bl.jpg
5 http://i.imgur.com/nCQ9UFR.jpg
6 http://i.imgur.com/LqmlgVI.jpg
7 http://i.imgur.com/JjGvnM1.jpg
8 http://i.imgur.com/uP3HCmf.jpg

496 :NAME IS NULL:2020/05/13(水) 01:53:24.85 ID:???.net
ID | sub
--+----
1 | my
2 | name
3 | is
4 | john.
5 | your
6 | name
7 | is
8 | jane.

こういう、あるいみ文章みたいな文字列を
スペースごとにバラバラにされてレコード化されているテーブルを
ピリオドがある行までをまとめて

group | subs
-----+--------------------
1,2,3,4 | my name is john.
5,6,7,8 | your name is jane.

という風にグループ化して取得するにはどうしたらいいでしょうか。
環境はsqlite3です。場合によっては他DBに移行も考えています...

497 :NAME IS NULL:2020/05/13(水) 03:38:14.71 ID:???.net
CTE使えばできそうだけど
そういうのはSQLじゃなくプログラム側で処理したほうが100倍簡単でメンテしやすいよ

498 :NAME IS NULL:2020/05/13(水) 06:43:41.20 ID:???.net
こういう設計する人って何なんだろうな

499 :NAME IS NULL:2020/05/13(水) 07:12:28.66 ID:???.net
こんな感じかな?
SELECT group_concat(ID,','),group_concat(sub,' ') FROM (
SELECT
a.ID,
MAX(a.sub) AS sub,
SUM(CASE WHEN b.sub LIKE '%.' THEN 1 ELSE 0 END) AS cnt
FROM test_table AS a
LEFT JOIN test_table AS b ON b.ID<a.ID
GROUP BY a.ID
ORDER BY a.ID
)
GROUP BY cnt;

500 :NAME IS NULL:2020/05/13(水) 09:36:09.50 ID:???.net
O(n)でできるところをO(n^2)以上に悪化させてもSQLで処理する意味あるのかな

501 :NAME IS NULL:2020/05/13(水) 18:52:38.85 ID:???.net
なんでもSQLでやろうとする人って保守とかはあまり考えてないよな
まあ俺が関係するわけじゃないからいいけど

502 :NAME IS NULL:2020/05/13(水) 20:05:59 ID:???.net
ウィンドウ関数使ってみた
ttps://ideone.com/Zk56p2

503 :NAME IS NULL:2020/05/13(水) 21:04:00.89 ID:???.net
>>502
嫌がらせかよっ!
てな気分になる

504 :NAME IS NULL:2020/05/13(水) 21:12:20 ID:kncXgfyu.net
>>496
また同じようなネタw

505 :NAME IS NULL:2020/05/14(木) 12:30:36.70 ID:EN6nNPUZ.net
独り言だけど、標準SQLが何でも取り入れてしまうから、もはや標準になってない。プロジェクトの規約にないことは人によって書き方がバラバラで疲れる。

506 :NAME IS NULL:2020/05/14(木) 14:46:19.18 ID:???.net
sqlは広く使われてるlinterとかないからねー
formatterでさえ使って人少ない

507 :NAME IS NULL:2020/06/04(木) 01:17:09.63 ID:???.net
oracleの(+)で外部結合お手軽すぎてこの書き方に慣れてしまった

508 :NAME IS NULL:2020/06/04(木) 01:25:41.30 ID:???.net
体に毒だから、止めた方がいい

509 :NAME IS NULL:2020/06/04(木) 02:19:08.67 ID:???.net
>>507
やめとけ

510 :NAME IS NULL:2020/06/04(木) 16:52:27.35 ID:???.net
データベースSQLSERVERで教えて下さい

変数 @Aがあってnullだったらすべて対象でnull以外だったら
その値のみ更新とかwhere句でつけたいのですが

update テーブルA set カラZ = 1
where (カラムA = @A or @A is null)

とか考えたのですが他にもっとスマートな記述ありますでしょうか

511 :NAME IS NULL:2020/06/04(木) 18:12:28 ID:???.net
(カラムA = @A or @A is null)はselectではよく使うパターン

条件が1つならif (@A IS NULL)のほうがいいかもしれないけど
たくさんあるならそのパターン使えば良いと思うよ
OPTION (RECOMPILE)を付けて各パターンで念の為プランを確認しておくこと

512 :NAME IS NULL:2020/06/05(金) 14:11:18.46 ID:???.net
>>511
やはりorで記述するのが多いのですね。
ありがとうございました。

513 :NAME IS NULL:2020/06/05(金) 20:36:31.47 ID:???.net
with句って今まであんまり使わなかったけどめちゃ便利じゃん
副問い合わせでごちゃごちゃネストするよりも可読性が高まる

514 :NAME IS NULL:2020/06/06(土) 07:39:20.23 ID:???.net
PostgreSQL特有なのか他DBでも一般的なのか分からないけど
 column NOT LIKE '・・・・'
 column NOT IN (・・・・)
 column NOT BETWEEN a AND b
と演算子の前に「NOT」をつけてSQLを書いてもOKなのに
 column NOT ~ value
 column NOT = value
と演算子の前に「NOT」をつけて書くとエラーになるのって、どういう根拠によるものなのでしょう?

どっちも演算子なんだから前者の書き方で統一したいと思ったら出来なくて、
そもそもNOT演算子の意味を考えたら前者も「NOT column LIKE '・・・'」と書かないと
エラーになっちゃうんじゃ?とか考えだしたら何が正しい書き方なのか分からなくなっちゃった
SQLの正しい構文規則みたいな資料って、どれを見ればいいんでしょう?

515 :NAME IS NULL:2020/06/06(土) 08:30:23.42 ID:???.net
SQL BNF でぐぐれ

516 :NAME IS NULL:2020/06/06(土) 09:52:32.08 ID:???.net
>>514
NOT LIKEやNOT BETWEENのNOTとunary operatorのNOTは違うもの
INやLIKEのような一部の演算子についてだけ“NOT LIKE”が一つの演算子として働くイメージ
Postgres特有の話ではない

https://www.sqlite.org/lang_expr.html

517 :NAME IS NULL:2020/06/06(土) 15:44:41.85 ID:???.net
あ、なるほど、>>516の説明で腑に落ちた
プログラミング言語でも「!=」が1つの演算子であり
「a△!△=△b」みたいに「!」「=」を分けて書けないのと同じ要領で、
SQLでも「NOT LIKE」なんかが1つの演算子に相当するということなんですね

BNFはちょっと理解できてないかもだけど、
「NOT」を書く場合の構文としてはLIKEみたいな述語の直前と決められてるってことなのかな

ひとつ賢くなれました、ありがとう

518 :NAME IS NULL:2020/06/06(土) 16:11:51.77 ID:???.net
>「NOT」を書く場合の構文としてはLIKEみたいな述語の直前と決められてるってことなのかな
unary operator(単項演算子)のNOTのほうも別途存在してる

NOT column LIKE ‘foo%’ は NOT (expression)の形で単項演算子のNOT
column NOT LIKE ‘foo%’ は (expression) NOT LIKE (expression)の形で二項演算子的なもの

column NOT = valueは (= value)がexpressionじゃないから単項演算子として成立しない
(NOT =)という二項演算子もないので(expresison) NOT = (expression)も成立しない
IS NOTならあるので成立する

519 :NAME IS NULL:2020/06/08(月) 20:32:19.26 ID:???.net
PL/sql(Postgres)で以下のようなテーブルの更新処理を実装したいです
fetchを入れ子するのではと思いますがいまいち実装サンプルなどが見つからずよく分かりません
例)テーブル(userID、 productID、price)があるとして
userIDごとにpriceから値引き額(別テーブルで定義)を引ききれるまで引く更新を全てのレコードに対して行いたいとしたら

userIDごとにレコードを取得?(ここでまずループ)
上で取得したuserIDごとのレコードをフェッチ(2つ目のループ)し、
該当レコードのpriceから値引き額を引けるだけ引いて更新
値引き額を、そのレコードで引いた金額を差し引いた余りに更新
のような計算イメージ

そもそもPL/SQLの書き方自体怪しいんですが上記のイメージで実装可能なのでしょうか

520 :NAME IS NULL:2020/06/08(月) 22:22:28.21 ID:???.net
普通のsqlで出来るのでは?

521 :NAME IS NULL:2020/06/09(火) 00:48:31.81 ID:???.net
確かにSQLだけでも出来るっぽい。
ttps://rextester.com/KMHR77477

522 :NAME IS NULL:2020/06/09(火) 11:01:46.70 ID:???.net
SQLだけはめちゃくちゃ辛いな

そもそも注文明細的なテーブルの販売価格を直接更新して値引きする時点で設計に欠陥あるよね

523 :NAME IS NULL:2020/06/09(火) 13:41:09.03 ID:???.net
>>521
サンプルコードまでありがとうございます
SQLでもできるんですね
アプリ側で実装できない事情があり頭抱えてたので、この線で一度レスポンスを見てみようと思います
設計自体の欠陥もご指摘の通りで、明細一つ一つを再計算する作り自体がよろしくないですね

524 :NAME IS NULL:2020/06/15(月) 01:08:16.40 ID:???.net
oracleで円周率求めるpiって使えないのか

525 :NAME IS NULL:2020/06/16(火) 21:22:00.12 ID:???.net
ないから自前でFUNCTIONを定義するか直値で書くか
先人の知恵に乗っかるのが楽かと思われ
https://www.shift-the-oracle.com/code_tips.html

526 :NAME IS NULL:2020/06/17(水) 20:25:14.15 ID:???.net
sales

月  金額
1月 1000
2月 2000
3月 1500

ってテーブルを
1月 1000
2月 3000
3月 4500 という累計にするSQL教えて下さい

527 :NAME IS NULL:2020/06/17(水) 20:40:20.21 ID:???.net
月をintegerにした数字のカラムを用意する
1-1,1-2,1-3...1-12で範囲指定してsumを12テーブル
unionして一応ソート
か?

528 :NAME IS NULL:2020/06/17(水) 21:32:38 ID:???.net
>>526
select 月, sum(金額) over (order by 月) from sales;

他のやり方もあるけどwindow関数使うのが簡単
古いDBじゃなければサポートされてる

529 :NAME IS NULL:2020/06/18(木) 01:13:54.11 ID:???.net
window関数ってマジで便利だよな
よくわかってない頃はアプリ側でゴリゴリやってた

530 :NAME IS NULL:2020/06/18(木) 01:18:49.99 ID:???.net
ちょっと脱線で悪いが、

月カラムでデータに”月”入れる?

531 :NAME IS NULL:2020/06/18(木) 09:57:25.00 ID:???.net
>>530
用途による
キーや条件指定で使うカラムなら入れないが
表示用の文字列を入れるカラムなら入れる場合もある

532 :NAME IS NULL:2020/06/22(月) 13:33:00.25 ID:FQCTIBUq.net
「◯年◯月」を日付型に変更したいのですが、どうすればよいでしょうか?

533 :NAME IS NULL:2020/06/22(月) 14:59:39.65 ID:???.net
"年"と"月"を"/"にリプレイス
末尾に日を表す数値を付けて日付型にキャスト

534 :NAME IS NULL:2020/06/22(月) 18:26:31.32 ID:ItHxQxII.net
>>533
ありがとうございます

535 :NAME IS NULL:2020/06/22(月) 18:59:33.06 ID:???.net
/区切りは標準ではない気がするが

536 :NAME IS NULL:2020/06/22(月) 22:17:01.43 ID:n5R9lLii.net
>>533
なんでわざわざ置換するのか?

537 :NAME IS NULL:2020/06/22(月) 23:59:26.66 ID:???.net
自分もお手軽に書くなら>>533かな
「/」「-」何を使うかはDMBSのルールに従う

538 :NAME IS NULL:2020/06/23(火) 05:29:33.32 ID:???.net
>>536
置換しなくてもできるならその方法を書いてよ

539 :NAME IS NULL:2020/06/23(火) 11:33:31.81 ID:???.net
置換せずに数字を取り出して使うってことかもしれないけど
DBによってはparseする時にフォーマット指定できるものもある
Postgreならto_date('2020年12月', 'YYYY年MM月’)で日付型の値が返される

とりあえず質問の仕方がわるい
「どうすればいいでしょうか?」という質問の仕方するやつはロクなのいない

540 :NAME IS NULL:2020/06/23(火) 11:51:08.63 ID:???.net
MySQLはフォーマット指定はできるが年月だけでは日付型に変換されないみたい

STR_TO_DATE('2020年12月', '%Y年%m月')
=> null

STR_TO_DATE('2020年12月1日', '%Y年%m月%d日')
=> 2020-12-01

541 :NAME IS NULL:2020/06/23(火) 13:29:47 ID:???.net
>>539
> 置換せずに数字を取り出して使うってことかもしれないけど
はっきり
> 「◯年◯月」を日付型に変更したいのです
って書いてあるのに何を言ってるんだよw

542 :NAME IS NULL:2020/06/23(火) 13:55:26 ID:???.net
>>541
あたまわるぅw

543 :NAME IS NULL:2020/06/23(火) 14:15:04 ID:???.net
恥の上塗り?w

544 :NAME IS NULL:2020/06/23(火) 18:35:48 ID:???.net
もともとSQLでやるべき処理ではないけど
置換しないとできないと思う理由が理解できないな

545 :NAME IS NULL:2020/06/23(火) 20:28:30.65 ID:???.net
出来なくはないが、置換するほうが楽だろう
そうじゃないと思うならそのやり方書けよって話だろ

546 :NAME IS NULL:2020/06/23(火) 21:14:11.53 ID:???.net
難癖つける系の人がいるね
こういう人がレビュアーにいるとレビューの空気悪くなって生産的な場じゃなくなるんだよなあ

547 :NAME IS NULL:2020/06/23(火) 22:03:04.71 ID:???.net
>>545
もう出てますやん
楽かどうかはDBMS次第

548 :NAME IS NULL:2020/06/24(水) 05:37:16.35 ID:???.net
>>544
DBMS 指定してないから多くの DBMS でできそうな方法を書くのは当たり前だと思うけど?
まあテンプレ使わない>>532が悪いという指摘ならわかるけど

549 :NAME IS NULL:2020/06/24(水) 10:12:19.72 ID:???.net
上塗りの言い訳恥ずかしいw

550 :NAME IS NULL:2020/06/24(水) 19:22:30.78 ID:???.net
>>549
言い訳?
おかしいと言うならちゃんと指摘したらいいんじゃね?

551 :NAME IS NULL:2020/06/24(水) 20:16:07.12 ID:???.net
>>550
涙吹けよw

552 :NAME IS NULL:2020/06/24(水) 21:03:30.50 ID:???.net
>>551
指摘できないお前が涙「拭けよ」w

553 :NAME IS NULL:2020/06/24(水) 21:09:33.40 ID:s9ILUWzT.net
>>538
そもそも文字列として持っているRDBは少数派だよ

554 :NAME IS NULL:2020/06/24(水) 21:12:17.42 ID:s9ILUWzT.net
>>545
暗黙的な変換に違和感がないのならやめた方がいい

555 :NAME IS NULL:2020/06/24(水) 21:26:27.21 ID:???.net
顔真っ赤の言い訳厨だけでお腹いっぱいなのに
別のアホ(いつもの人)が参戦ww

556 :NAME IS NULL:2020/06/24(水) 21:28:41.75 ID:???.net
>>553
そういう話は>>532に言えば?

>>554
暗黙的な変換ってどこから出てきたんだ?w

557 :NAME IS NULL:2020/06/24(水) 21:30:34.94 ID:???.net
>>555
指摘できないなら黙って涙吹いとけw
           ~~~~~~~~

558 :NAME IS NULL:2020/06/26(金) 00:30:11.73 ID:8xj3vrR+.net
>>556
日付型を決まった文字列で指定する製品もあれば、そうでない製品も存在する。

559 :NAME IS NULL:2020/06/26(金) 01:32:53.35 ID:???.net
ちょっとマジで>>554が何を言いたいのかわからんのだが

560 :NAME IS NULL:2020/06/26(金) 05:23:48.53 ID:???.net
俺は>>558も何が言いたいのかよくわからん
恥の上塗りをしてるのはわかるけどw

561 :NAME IS NULL:2020/06/26(金) 09:50:31.74 ID:???.net
上塗り対決なら>>558の勝ち

562 :NAME IS NULL:2020/06/26(金) 12:19:27.18 ID:8xj3vrR+.net
日付を文字列で指定する製品しか知らないんだろ?

563 :NAME IS NULL:2020/06/26(金) 13:37:49.13 ID:???.net
いつもの上塗りマンはさすがにヤベェww
置換野郎はまともだな

564 :NAME IS NULL:2020/06/26(金) 19:17:32.93 ID:???.net
>>562
Access知ってるボク偉いでしょ
ってか?w

565 :NAME IS NULL:2020/06/26(金) 21:29:28.45 ID:???.net
「日付型にキャスト」って書いてるんだからAccessでも文字列で指定できるでしょ

文字列からは日付型の値を生成できないDBMSがあるとして
どうやって特定の日付を指定するんだろうね

566 :NAME IS NULL:2020/06/26(金) 21:51:39 ID:???.net
ユリウス日だろな

567 :NAME IS NULL:2020/06/26(金) 22:22:33 ID:???.net
>>566
それは値の解釈の例だって値を生成するために指定するのは数値か文字列でしょ
仮に数値でしか指定できないとしてもそれは1発ではキャストできないという制限があるだけ

568 :NAME IS NULL:2020/06/26(金) 22:58:54.30 ID:???.net
>>567
ただ書いている質問に答えただけだ
いつまで面倒くさいことやってんだよ

569 :NAME IS NULL:2020/06/26(金) 23:17:27.29 ID:8xj3vrR+.net
>>565
皮肉のつもりだろうが、文字列も数値も内部表現とは異なるよ。

570 :NAME IS NULL:2020/06/26(金) 23:22:35.68 ID:???.net
>>568
おまえ言い訳君だろw

>言い訳?
>おかしいと言うならちゃんと指摘したらいいんじゃね?

571 :NAME IS NULL:2020/06/26(金) 23:28:05.02 ID:???.net
>>570
勝手にグダグダ言っててだれがだれだか知らんけどさ
質問主が知恵の足りない質問して、荒れて終息させないでどっかいっちゃったんだろ
本当に迷惑だわ

572 :NAME IS NULL:2020/06/27(土) 00:14:51.77 ID:???.net
>>571
質問内容はともかく>>534できちんと礼も言って終わってる
以降は>>536>>538が起因

573 :NAME IS NULL:2020/06/27(土) 00:17:00.96 ID:???.net
>>572
そうなんだ、すまん質問主さん
ならどうしようもないな
ホント適当に切り上げてくれ

574 :NAME IS NULL:2020/06/27(土) 07:05:42.26 ID:???.net
>>565
Access知らんのはいいとして知らないなら黙ってなよ
Accessは#2020/06/27#の形式で日付を指定できるって話でキャストとかは関係ない
そもそも「文字列でも指定できる」ことと「文字列以外の方法で指定できる」ことの違いもわかってないのか?

575 :NAME IS NULL:2020/06/27(土) 07:08:51.84 ID:???.net
>>572
DBMSを書いてなかったけど質問内容は別におかしくないでしょ

576 :NAME IS NULL:2020/06/27(土) 08:22:12.27 ID:???.net
質問: 「◯年◯月」を日付型に変更したいのですが
回答: 「置換して日付型にキャストする」

以下斜め上レスの人
「なんでわざわざ置換するのか?」
「そもそも文字列として持っているRDBは少数派だよ」
「暗黙的な変換に違和感がないのならやめた方がいい」
「日付型を決まった文字列で指定する製品もあれば、そうでない製品も存在する。」
「日付を文字列で指定する製品しか知らないんだろ?」
「Accessは#2020/06/27#の形式で日付を指定できるって話でキャストとかは関係ない」

斜め上レスの人は入力は文字列じゃないと思いこんでるのかコレ?
そうだとしてもいろいろおかしいww

577 :NAME IS NULL:2020/06/27(土) 09:41:00 ID:???.net
>>576
> 「Accessは#2020/06/27#の形式で日付を指定できるって話でキャストとかは関係ない」
これは俺だが、>>565に対するレスで質問者とは直接関係しないから含めないで欲しい

578 :NAME IS NULL:2020/06/27(土) 11:28:10.58 ID:???.net
>>577
おかしなレスしてることを自覚したほうがいい
文脈読めずに普段から人に迷惑かけてるタイプ

579 :NAME IS NULL:2020/06/27(土) 12:03:40.62 ID:???.net
>>578
自己紹介?
どこがおかしいのか指摘できないなら黙ってなよ

580 :NAME IS NULL:2020/06/27(土) 12:13:36.13 ID:???.net
質問者がアクセスについて聞いているならともかく
アクセス限定の回答するって事が間違い

これはアクセスについて知ってるよという自己紹介でしかない
あるいはアクセスの宣伝をしたいのか?

581 :NAME IS NULL:2020/06/27(土) 12:28:16.12 ID:???.net
>>580
バカなの?
それとも日本語が理解できないの?

> これは俺だが、>>565に対するレスで質問者とは直接関係しないから含めないで欲しい

582 :NAME IS NULL:2020/06/27(土) 12:37:18.31 ID:lQsU1yWZ.net
>>576
それは日付型は関係なく文字列の変換にすぎない。

583 :NAME IS NULL:2020/06/27(土) 13:09:23.86 ID:???.net
>>581
ここは質疑応答スレ
日記帳じゃない

584 :NAME IS NULL:2020/06/27(土) 13:32:07.28 ID:???.net
>>583
そういう話は>>554, 558, 562, 565に言えよw
俺は
> Access知らんのはいいとして知らないなら黙ってなよ
って書いてあるんだし

585 :NAME IS NULL:2020/06/27(土) 15:06:31.96 ID:???.net
専用スレに行けよ

586 :NAME IS NULL:2020/06/27(土) 15:18:56.95 ID:???.net
メンタル病んでるww

587 :NAME IS NULL:2020/06/27(土) 15:22:02.90 ID:???.net
>>579
おまえ犯罪者の考え方だわ

588 :NAME IS NULL:2020/06/27(土) 16:36:51.93 ID:???.net
>>587
>>586

589 :NAME IS NULL:2020/06/27(土) 16:37:46.29 ID:???.net
いきなり犯罪者の考え方とか基地害かよw

590 :NAME IS NULL:2020/06/27(土) 21:36:53.19 ID:???.net
>>587
わかる
勘違いの逆恨みで放火したり
煽り運転したりするやつ

591 :NAME IS NULL:2020/06/27(土) 21:54:54.44 ID:???.net
Excel VBAスレでよく発狂してるおじさんと同一人物っぽいね
技術的な話しても無駄だからスルー推奨

592 :NAME IS NULL:2020/06/27(土) 22:22:35.52 ID:???.net
>>590
いきなり犯罪者とか言う奴の方が怖いわ
自覚なさそうだしww

593 :NAME IS NULL:2020/06/27(土) 22:39:04.77 ID:???.net
煽り運転やストーカーの思考と同じだから
どっちかと言えば、黙ってろと言う人の方が怖い

594 :NAME IS NULL:2020/06/27(土) 22:42:35.23 ID:???.net
日本語の理解力なさすぎだろ
知らないなら黙ってた方が恥をかかなくて済むぞ
って言わないと理解できないのか?ww

595 :NAME IS NULL:2020/06/27(土) 22:52:28.46 ID:???.net
軽率に開示請求できる時代によくやるなぁ

596 :NAME IS NULL:2020/06/27(土) 23:05:24.77 ID:???.net
「俺の邪魔する奴は許さない!」

ですよね

597 :NAME IS NULL:2020/06/28(日) 07:24:40.63 ID:???.net
>>595
なんの話?

598 :NAME IS NULL:2020/06/28(日) 08:36:06.98 ID:???.net
SQLを素でシークルって言ってるのを初めて聞いた

新鮮だった

599 :NAME IS NULL:2020/06/28(日) 08:36:13.00 ID:???.net
すげぇこいつらまだやっとるw
もっとやれやれ!

600 :NAME IS NULL:2020/06/28(日) 09:01:12.93 ID:???.net
>>596
恥ずかしいからやめたらって言われて逆上してるだけだろw

601 :NAME IS NULL:2020/06/28(日) 22:04:29.06 ID:zI4R0AVo.net
>>598
英語圏ではよく言うだろうね

602 :NAME IS NULL:2020/06/28(日) 22:38:08.43 ID:???.net
30年くらい前、シークェルみたいな言い方してた人がいたな

603 :NAME IS NULL:2020/06/28(日) 22:46:36.07 ID:???.net
私はジョナサン

604 :NAME IS NULL:2020/06/28(日) 22:55:09.89 ID:???.net
Wikipediaによればシークェルでも間違いではないらしい
https://ja.wikipedia.org/wiki/SQL

605 :NAME IS NULL:2020/06/29(月) 01:44:48.04 ID:p4nhH9Iw.net
問題なのはいまだにストラクチャードクエリーランゲージだと説明されるところかな。

606 :NAME IS NULL:2020/07/05(日) 14:06:56.86 ID:???.net
SQLiteで作成したデータベースファイルをSQLServerで読み込むことはできますか?

607 :NAME IS NULL:2020/07/05(日) 19:07:33.30 ID:???.net
>>606
とりあえずこの辺りかな
https://qastack.jp/superuser/138787/is-it-possible-to-open-a-sqlite-database-from-within-microsoft-sql-server-management-studio
頻度とかの要件を書いたほうがより適切な回答が得られるかも

608 :NAME IS NULL:2020/07/05(日) 20:57:32.79 ID:3IvJ5boS.net
何がしたいのかよくわからない質問によく答えようとするね。
ExcelファイルのXML形式のデータを直接、読み込むようなことは言っていないと思う。

609 :NAME IS NULL:2020/07/05(日) 21:49:38.57 ID:???.net
>>608
>ExcelファイルのXML形式のデータを直接、読み込むようなことは言っていないと思う。

別人だが>>607のURLにはそんなこと書いてないぞ
どこ見てんの?

>>606
とりあえずスレチなのでSQL ServerのスレかSQLiteのスレへどうぞ

610 :NAME IS NULL:2020/07/05(日) 22:04:01.91 ID:???.net
>>607
レスありがとう
形式が違うから無理っぽいですね
他アプリで作られたデータベースファイルを参照したいのですが、
ずぼらせずにDBMSそろえたほうがよさそうですね

>>609
スレチでしたか、タイ産します

611 :NAME IS NULL:2020/07/05(日) 22:16:18 ID:???.net
>>609
よくわからん人なのでスルーでお願い

>>610
中身読んだ?
何をしたいのかよくわからんけど読み込みならODBCでいけることが多いよ
厳しい性能要件があるとか設定をいじりづらいマシンとか特殊な事情があるなら別だが
まあDBMS揃えられるならそれに越したことはないけどね

612 :NAME IS NULL:2020/07/05(日) 22:33:39.86 ID:3IvJ5boS.net
例え話がわからなかったか。質問者の表現だとまるでバイナリーデータをそのまま自分の手段で読み込む方法を知りたいと解釈できる。

回答者はそんなのおかしいからこうだと当然、示す。

この流れが自作自演に見て仕方がない。

613 :NAME IS NULL:2020/07/05(日) 22:35:59.54 ID:3IvJ5boS.net
設計の概念がないアドバイスはやめた方がいい。

ちゃんとデータ移行をする手順をわからせないと途中経過がわからないものを量産して自分も他人もはまる。

614 :NAME IS NULL:2020/07/05(日) 22:56:12.79 ID:???.net
>>608
> ExcelファイルのXML形式のデータを直接、読み込むようなことは言っていないと思う。
&#8597;
>>612
> 質問者の表現だとまるでバイナリーデータをそのまま自分の手段で読み込む方法を知りたいと解釈できる。

クマーかな?

>>613
途中経過?
ODBCとかリンクサーバーとかでググってから出直してこいよ

615 :NAME IS NULL:2020/07/05(日) 23:00:09.58 ID:3IvJ5boS.net
処理を繋いで原因不明のバグで苦しむタイプだな

別のセッションでデータが更新されることを考慮していない。

616 :NAME IS NULL:2020/07/05(日) 23:10:23.66 ID:???.net
間違い指摘されて書いてもない要件でイチャモンつけるクズw

617 :NAME IS NULL:2020/07/06(月) 04:17:20.32 ID:obRVc8Qx.net
SQLiteの内部データをSQL Serverに直接、読み込ませるという話なのに、勝手に脳内変換して、ODBC接続で解決させるあたりは勝手すぎる。

これはデータが動かないことを前提としたもので、かつSQLの文法そのものの違い、RDBMSの違いを安易に無視したもので、保守性にも問題がある。

SQL Serverはマテリアルズドに批判的なので、ついこう言ってしまう。

そもそも自作自演の疑いがあるんだが。

618 :NAME IS NULL:2020/07/06(月) 04:18:04.73 ID:obRVc8Qx.net
SQLiteの内部データをSQL Serverに直接、読み込ませるという話なのに、勝手に脳内変換して、ODBC接続で解決させるあたりは勝手すぎる。

これはデータが動かないことを前提としたもので、かつSQLの文法そのものの違い、RDBMSの違いを安易に無視したもので、保守性にも問題がある。

SQL Serverはマテリアライズドに批判的なので、ついこう言ってしまう。

そもそも自作自演の疑いがあるんだが。

619 :NAME IS NULL:2020/07/06(月) 09:09:47.71 ID:???.net
いちゃもん付けるだけ付けて何も解決してない2重投稿のゴミ。

620 :NAME IS NULL:2020/07/06(月) 09:42:16.99 ID:obRVc8Qx.net
だから手順を踏めと言っている。エスクポート、インポートを無視して、SQLiteが保証していないODBC接続を勧める方が基地階

621 :NAME IS NULL:2020/07/06(月) 10:08:05.05 ID:???.net
>>611
さんくす、ODBCで読み込みとか基本的なDB操作ならできるのかな
ちょとしらべてみます

>>617
なるほどね、SQLiteが作成したファイルは独自のフォーマットだから
SQLServerでは読み込まないほうがいいってことですか、さんくす

622 :NAME IS NULL:2020/07/06(月) 11:40:25.72 ID:???.net
いつものことながらDB板ではID付きを相手にしたほうが負け
論理が通じる相手じゃないんだから

623 :NAME IS NULL:2020/07/06(月) 17:20:16 ID:???.net
一般論で言うと、質問者がID付きで書き込む事は推奨だと思うぞ

624 :NAME IS NULL:2020/07/06(月) 18:14:24.35 ID:???.net
回答者のことじゃね?

625 :NAME IS NULL:2020/07/06(月) 18:18:22.55 ID:???.net
じゃあ、質問者以外のID付きはNGで良いんではないか

626 :NAME IS NULL:2020/07/07(火) 02:36:32.55 ID:???.net
なるほど、理論が通じる相手じゃないので、スルーってことで

627 :NAME IS NULL:2020/07/07(火) 02:39:07.95 ID:???.net
データ移行の方法を知りたいと脳内補完するほうがよっぽど自然だと思うが
直接とか、バイナリーデータをそのまま自分の手段で読み込むとか
おかしな脳内補完してんだな

628 :NAME IS NULL:2020/07/07(火) 07:50:12.59 ID:???.net
>>627
SQLiteで作成した「データ」をSQLServerで読み込むことはできますか?
と書かれてるならそうとも取れるけど読みたいのは「データベースファイル」だしね
まあ質問者がそこら辺をあまり区別してないことも考えられけどね
まあ既に質問者それなりに納得してるのに今更悔しがりすぎでしょw

629 :NAME IS NULL:2020/07/07(火) 11:30:55.26 ID:???.net
VBAおじさんがあらわれた!
どうする?

- たたかう
- スルーする
- ID付きを召喚する

630 :NAME IS NULL:2020/07/10(金) 11:29:50.12 ID:ZnmsHRPS.net
既存の複数テーブルを連結して、
連結した仮想テーブルにテーブルとしての名前を付けておく方法があったようなきがするんだけど
どうやってやるんだっけ?

631 :NAME IS NULL:2020/07/10(金) 12:56:45.43 ID:???.net
>>630
view?
じゃなければ最低限DBMS名と名前をつけた後に何したいかを書いてね

632 :NAME IS NULL:2020/07/10(金) 17:47:46.34 ID:???.net
しかもSQLの質問じゃねーし

633 :NAME IS NULL:2020/07/10(金) 23:28:31.98 ID:???.net
SQLServerなんですが、Pathを格納するのにふさわしいデータ型ってなんでしょう?
nvarchar(300)?ntext?nvarchar(max)?

634 :NAME IS NULL:2020/07/11(土) 02:31:57.06 ID:???.net
まずお前が言うPathとは何かを正確に定義しろ

635 :NAME IS NULL:2020/07/11(土) 08:20:19.99 ID:???.net
>>634
さんくす、PathはWindows10のディレクトリのことです、例えば
"C:\Program Files\Microsoft SQL Server\80\COM\sqlvdi.dll"とかです
日本語が混ざることもありますUTF8です

636 :NAME IS NULL:2020/07/11(土) 09:27:42.87 ID:???.net
DB設計スレいけ

637 :NAME IS NULL:2020/07/11(土) 11:07:02 ID:???.net
nvarchar(256)

638 :NAME IS NULL:2020/07/11(土) 11:29:12 ID:???.net
>>635
windowsはファイル操作の文字コードは標準ではshift-jisを
使っていると思う

639 :NAME IS NULL:2020/07/11(土) 12:03:03 ID:???.net
いつの時代の話だ

640 :NAME IS NULL:2020/07/11(土) 12:51:27.85 ID:???.net
WindowsのファイルパスとかはUTF-16LEが標準

SQL Serverのnvarcharも基本的にUTF-16用(古いUCS-2も含めて)
2019からchar/varcharでUTF-8をサポートするようになったけど
素直にUTF-16でnvarchar使うほうが堅い

長さはデフォルトの260の制限ありで使ってる前提なのかどうかによる
制限ありのまま使っててもサロゲートペアも考えるとmax以外は安心できない

ファイルパスの文字列はインデックス用と割り切って長さを制限しておいて
それとは別にバイナリでシリアライズしたものを格納しておいて
実際にPathを使う場合はそれを使うというのも一つ

641 :NAME IS NULL:2020/07/11(土) 15:04:28 ID:???.net
windows日本語環境 の標準入出力はshift -jis のままのはず
もしユニコードに変わっていたら既存バッチファイルとか
文字化けで動かなくなる
ただしwindowsの内部処理は全世界共通だからユニコードだと思う
例えばコマンドプロンプトの文字コードを調べる場合は
下記url参照
https://qiita.com/user0/items/a9116acc7bd7b70ecfb0

642 :NAME IS NULL:2020/07/11(土) 16:18:56.64 ID:???.net
>>636
そんなスレがあるのれすね失礼しました
>>637
さんくすそれでいってみます
>>638
たしかに昔からSHIFT−JISだったのにいつからか新規テキストがUTF8?16?に
なってたからエンコードかわったのかなと

>>640
サンクスなるほど特殊文字を使いまくってたら簡単に限界突破するんですね
厳密にするならテクニックが必要ですか

>>641
ゆわれてみたらたしかに過去のファイルとかの文字エンコードとか
問題出てきそうなのに

643 :NAME IS NULL:2020/07/12(日) 16:03:13.83 ID:FwpDDjYd.net
UTF-8にしようとした理由がわからない。

644 :NAME IS NULL:2020/07/12(日) 16:13:19.88 ID:???.net
>>643
いや勘違いとゆうか、メモ帳で新規作成するとUTF8になってたから
Win10からはUTF8になったのかなと

645 :NAME IS NULL:2020/07/12(日) 16:15:22.05 ID:FwpDDjYd.net
SQL Serverでnvarchar型を使うときは、この文字列はUnicodeですよという指定が毎回、必要になる。

UTF-8にしておけば何もかも解決すると思ってしまったんだろうが、Windows、SQL ServerにとってはUTF-8は扱いにくい。

自分自身も常にUTF-8を意識してつかわないといけない。アスキー文字はSJISでもUTF-8でも同じ文字コードだから、日本語がない場合はミスに気づきにくい。

646 :NAME IS NULL:2020/07/12(日) 17:23:03.00 ID:???.net
>>641
コマンドプロンプトのデフォルトエンコーディングが日本語環境ならcp932というだけ
それは特定アプリのエンコーディング設定のデフォルト値の話で他のアプリとは関係ない

ファイル名には絵文字も扱えるがcp932環境下で実行するバッチファイルだと
そのファイル名を文字列としては正しく扱えない

647 :NAME IS NULL:2020/07/12(日) 17:23:04.66 ID:???.net
>>630
Oracleの場合なら
create view か
create materialized view

648 :NAME IS NULL:2020/07/12(日) 19:35:34.99 ID:???.net
SQL Serverで扱う言語が多国語でないなら、SJIS選択で良いかも

649 :NAME IS NULL:2020/07/12(日) 20:53:30.30 ID:???.net
>>645
UTF-8なんてわざわざ使うものじゃないのね
文字エンコードなんて気にもしなくなってた

650 :NAME IS NULL:2020/07/12(日) 22:40:16.78 ID:???.net
nvarcharはUTF-8じゃねぇっつーの

651 :NAME IS NULL:2020/07/13(月) 00:01:02.35 ID:Ogkq8wUQ.net
UnicodeでUTF-16を使わせるものだけど、どのRDBMSもこういう歴史をたどっていて、nvarcharはUnicode用と説明している。UTF-8とUnicodeとnvarcharの関係がわかっていれば、こんなところで質問しないはず。

652 :NAME IS NULL:2020/07/13(月) 00:59:38.50 ID:???.net
ググって知ったかしようとしても
バレバレなのが辛いところだね〜

653 :NAME IS NULL:2020/07/22(水) 01:31:24 ID:???.net
使用環境オラクル
Date Remain Total
7/24 100 200
7/23 0 0
7/22 10 50
7/21 10 200
と集計した後に、稼働日換算で経過日数を把握して作業残のOK NG判定をしたいです
case when Date=today() then Remain/Total else 0 as Nday
case when Date=today()-1 then Remain/Total else 0 as N-1day
...
これだとカレンダー日で経過日数把握になるので、曜日毎や連休毎にSQLを直さないといけないです。
カレンダーマスターを見つけてくれば出来ますか?
Date Weekday
7/24 1
7/23 0
7/22 6
7/21 5
無かった場合、Total = 0 を用いて稼働日判定したいです

654 :NAME IS NULL:2020/07/22(水) 01:59:00 ID:???.net
何日前まで計算するつもりなのだろう?

655 :NAME IS NULL:2020/07/22(水) 03:39:09.81 ID:???.net
>>653
暗黙の前提を置き過ぎててやりたいことが理解できないよ

>case when Date=today()-1 then Remain/Total else 0 as N-1day
これtoday()が7/22を返す場合、Remain/Totalは10/200で0.05になるわけ?

作業残のOK/NG判定って何? どうなればOKなの?

>無かった場合、Total = 0 を用いて稼働日判定したいです
Total = 0なら稼働日ではないと断定できるということ?

656 :NAME IS NULL:2020/07/22(水) 06:38:20 ID:???.net
説明不足で申し訳ない
結果をそのままグラフにできるツールがあってそこに結果を投げ込もうとしている
だから0.05のOKNG判定は視覚的に工場責任者が判断
0/0は非稼働の運用になっている
稼働3日まで計算し、4日目以降はRemainの明細を別で表示させる予定

657 :NAME IS NULL:2020/07/22(水) 06:42:10 ID:???.net
1年で365カラムのデータ
10年で3650カラムのデータ

658 :NAME IS NULL:2020/07/22(水) 09:57:47.85 ID:???.net
totalが0になっているレコードを除いて1日前、2日前のremain/totalの値が欲しいってことかな
ttps://rextester.com/LYWT38038

v653の SELECT * FROM t653 WHERE total<>0 ってところ、UNION SELECT TRUNC(CURRENT_DATE),0,0 FROM DUAL 追加すると今日のデータが無い場合にも対応出来ると思う

659 :NAME IS NULL:2020/07/22(水) 11:40:36.04 ID:LdTec9jX.net
おまえら暇だな

660 :NAME IS NULL:2020/07/22(水) 15:18:43.94 ID:???.net
それを見ていた君も暇人

661 :NAME IS NULL:2020/07/23(木) 07:01:10 ID:???.net
ありがとうございます
方向性分かったのでやってみます
こんなサイトがあったとは!こういうのに書いて質問したほうが分かりやすいので、活用します

662 :NAME IS NULL:2020/07/23(木) 10:55:38.73 ID:???.net
row_number()使ってtotal<>0を条件にしてインラインビュー作ればカレンダー作れないかな?
あとはそれをjoinしてcaseでそのrow_numberを条件にして持ってくる感じ
下のsqlで0が当日、1が前稼働日になるかんじ
今外なので正しく動くか検証できず無責任ですまないが

select
date,
row_number() over(order by date desc)-1 dateno
from xxx
where date<=trunc(sysdate)
and total<>0

663 :NAME IS NULL:2020/07/23(木) 19:29:08.32 ID:???.net
何が言いたいかさっぱりわからんw

664 :662:2020/07/23(木) 20:54:04.53 ID:???.net
>>663
わからんかね?
658 を一部利用させてもらい作ってみた
ttps://rextester.com/YEOZQ54266

665 :662:2020/07/23(木) 21:01:57.03 ID:???.net
あー、ちょっと補足
今日の日付の代わりに固定値 2020/7/27を指定している
それとd0が今日でd1が1日前、d2が2日前…という形にしている(稼働日換算で)

666 :NAME IS NULL:2020/07/27(月) 23:20:37.13 ID:???.net
■やりたいこと
.1.3.6.1.2.1.10.127.1.3.9.1.324
等の末尾だけを関数使って切り取りたい

■データベース
MYSQL5.7

■求める結果
.1.3.6.1.2.1.10.127.1.3.9.1.324
をselectすると
324
になってほしい。

■補足
上の例でいうと、324から前の数字は不定です。
登場する文字は、0-9と、.のみです。それ以外の文字が出てくることはありません。

よろしくお願いします。

667 :666:2020/07/27(月) 23:35:34.17 ID:???.net
ググりが足りませんでした。

SELECT SUBSTRING_INDEX('.1.3.6.1.2.1.10.127.1.3.9.1.324', '.', -1);

でいけました。
スレ汚しすみませんでした。

668 :NAME IS NULL:2020/08/05(水) 10:34:16.06 ID:???.net
行き詰ってしまったので皆さんの知恵をお貸しください
DBはMS SQL Server 2012です

FROMにてROW_NUMBER()とPARTITION BYを用いて直近の日付を取得し、
SELECTにてその日付を期間指定に用いて合計を集計するということを想定して作成したSQLが以下となっています

サブTの日付が同日となるデータが存在することを失念しており、行き詰りました
同日の場合は次に古い日付を取得したいのですがどのような方法があるか教えて頂きたいです
以下のSQLを活かす必要はありません
結果として期間指定した集計値を取得できればいいですが、ひとつのSQLにて完結したいです。


SELECT
マスタT.コード
,(SELECT SUM(価格)
FROM 購入T
WHERE 購入T.コード = マスタT.コード
AND 購入T.購入日 BETWEEN サブT_2.日付 AND サブT_1.日付
) AS 価格計_期間1
,(SELECT SUM(価格)
FROM 購入T
WHERE 購入T.コード = マスタT.コード
AND 購入T.購入日 BETWEEN サブT_3.日付 AND サブT_2.日付
) AS 価格計_期間2

FROM
マスタT

--日付取得1
LEFT JOIN
(SELECT ROW_NUMBER() OVER(PARTITION BY コード ORDER BY 日付 DESC) AS RowNo
,コード
,日付
FROM サブT
) AS サブT_1
ON サブT_1.コード = マスタT.コード
AND サブT_1.RowNo = 1

--日付取得2
LEFT JOIN
(SELECT ROW_NUMBER() OVER(PARTITION BY コード ORDER BY 日付 DESC) AS RowNo
,コード
,日付
FROM サブT
) AS サブT_2
ON サブT_2.コード = マスタT.コード
AND サブT_2.RowNo = 2

--日付取得3
LEFT JOIN
(SELECT ROW_NUMBER() OVER(PARTITION BY コード ORDER BY 日付 DESC) AS RowNo
,コード
,日付
FROM サブT
) AS サブT_3
ON サブT_3.コード = マスタT.コード
AND サブT_3.RowNo = 3

669 :NAME IS NULL:2020/08/05(水) 14:20:42.29 ID:???.net
>>668
10~20行程度のサンプルデータとクエリをhttps://rextester.com/とかのサイトに上げて
欲しい結果セットイメージを書いてくれ

LEFT JOIN以下のところは無駄じゃないの?って感じる

670 :NAME IS NULL:2020/08/05(水) 15:12:00.09 ID:???.net
日付でgroup byしてhavingでcountが1だけとればいいんじゃね

てか直近って書いてるけど、直近三日分とかそんな感じか
まずちゃんとした要件考えたほうがいいんじゃね

671 :668:2020/08/05(水) 16:13:08.44 ID:???.net
https://rextester.com/XKXE69398

rextesterを使ってみました
初めてなのですが見れますでしょうか?

実行結果3行目が、
3 3 200 NULL 20/07/15-20/07/31 20/07/15-20/07/15
となっていると思いますが、これを
3 3 200 200 20/07/15-20/07/31 20/07/08-20/07/15
としたいです。
集計期間にデータが無い場合はNULLのままで構いません。

正確に言うと4つの日付を取得して3つの期間の集計をします

672 :NAME IS NULL:2020/08/05(水) 16:23:30 ID:???.net
>>668
集計でROW_NUMBERする下記のようにすればいいと思います

SELECT コード,
,case when RowNo = 1 then sum(価格) else 0 end as 価格計_期間1
,case when RowNo = 2 then sum(価格) else 0 end as 価格計_期間2
FROM (
  SELECT コード, 日付 ,sum(価格) as 価格
  ,ROW_NUMBER() OVER(PARTITION BY コード ORDER BY 日付 DESC) AS RowNo
  FROM サブT GROUP BY コード, 日付
) AS M
GROUP BY コード

673 :NAME IS NULL:2020/08/05(水) 17:26:22.15 ID:???.net
なんだこのSQLw

674 :NAME IS NULL:2020/08/05(水) 18:05:59.01 ID:???.net
>>671
やりたいことは理解できた

ROW_NUMBER() OVER(PARTITION BY コード ORDER BY 日付 DESC) のところを
DISTINCT DENSE_RANK() OVER(PARTITION BY コード ORDER BY 日付 DESC) にすれば良いと思う
日付が同日かどうかの判定で時刻を除いた部分での比較が必要ならもうちょい追加が必要

ただ考え方としてコード、期間、価格計で一旦まとめてから
その後に縦横変換するほうがスジがいい気がする

675 :NAME IS NULL:2020/08/05(水) 18:11:46.50 ID:???.net
こんなのはどう?
https://rextester.com/HLTXE73872

676 :NAME IS NULL:2020/08/05(水) 18:43:35.01 ID:???.net
↓こんな感じで先に求めたい集計期間の開始/終了日の表を作る
https://rextester.com/PIL77023

んでそれと購入テーブルをJOINさせて出力用の形に整形するのは最後
集計ロジックと整形ロジックを分けたほうがメンテがしやすい

677 :668:2020/08/05(水) 22:13:57.31 ID:???.net
>>674-676
みなさんありがとうございます
今試す時間がないので取り急ぎお礼だけで失礼します
参考にさせていただきます

678 :NAME IS NULL:2020/08/06(木) 01:53:32.50 ID:RlDmGsR2.net
結合する必要がないのに結合
SELECT句にSELECT文

集合演算の概念がないとやらかす典型

679 :NAME IS NULL:2020/08/06(木) 07:49:56.75 ID:???.net
【質問テンプレ】
・DBMS名とバージョン
Access 2000

・テーブルデータ(かなり単純化しています)
(日付,品)=(801,A)(801,A)(801,B)(801,C)(802,A)(802,C)(803,B)(803,C)

・欲しい結果
日付 全  A  B  C
801  4   2   1  1
802  2   1     1
803  2      1  1

・SQL文
クエリ1
select テーブル.日付 as 日付, テーブル.品 as 品, count(テーブル.品) as 全 from テーブル group by テーブル.日付, テーブル.品;
クエリ2
select クエリ1.日付 as 日付, 仮全.全 as 全, 仮A.A as A, 仮B.B as B, 仮C.C as C from ((
[select クエリ1.日付, sum(クエリ1.全) as 全 from クエリ1 group by クエリ1.日付]. as 仮全
left join [select クエリ1.日付, sum(クエリ1.A) as A from クエリ1 where (クエリ1.品=A) group by クエリ1.日付]. as 仮A on 仮全.日付=仮A.日付)
left join [select クエリ1.日付, sum(クエリ1.B) as B from クエリ1 where (クエリ1.品=B) group by クエリ1.日付]. as 仮B on 仮A.日付=仮B.日付)
left join [select クエリ1.日付, sum(クエリ1.全) as C from クエリ1 where (クエリ1.品=C) group by クエリ1.日付]. as 仮C on 仮B.日付=仮C.日付;

・現実の結果
日付 全  A  B  C
801  4   2   1  1
802  2   1
803  2

データを集計して縦横に項目が並んだテーブルの形にまとめたいのですが、
上記のようにjoinすると、前の部分で該当なしがあるとその後が結合されません。
どうしたらいいか教えてください。

680 :NAME IS NULL:2020/08/06(木) 10:53:39.90 ID:???.net
>>679
PIVOTは使えないバージョン?

681 :NAME IS NULL:2020/08/06(木) 11:03:19.36 ID:???.net
SQL Serverのやつも縦横変換にはPIVOT使える
CASE式で頑張るよりかは多少マシ

682 :679:2020/08/06(木) 16:14:25.78 ID:???.net
>>680
PIVOTって聞いたこともなかった
調べて試したらくっそ簡単にできたwww
ありがとうございました

683 :NAME IS NULL:2020/08/06(木) 17:39:06.82 ID:???.net
有休休暇の前年度繰越のベストな実装って何?

684 :NAME IS NULL:2020/08/06(木) 18:21:27.56 ID:???.net
>>683
スレチ

685 :NAME IS NULL:2020/08/07(金) 06:40:04 ID:???.net
有休だから普通に休む

686 :668:2020/08/07(金) 12:27:43.29 ID:???.net
>>674-676
みなさんありがとうございました
みなさんのヒントをいただいてなんとか実装できそうです
今回WITHとDENSE_RANK初めて覚えました
ありがとうございます

687 :NAME IS NULL:2020/08/11(火) 19:28:58.64 ID:???.net
SQL文の中に同じ定数が何度も出てきていて、それを変更したいときに全部変えるのが面倒なのですが、
最初にたとえばa=7, b=2みたいに宣言しておいて、SQL文の中で(データ+a)*bみたいな計算をすることはできますか?

688 :NAME IS NULL:2020/08/11(火) 19:39:00.40 ID:???.net
>>687
多くのRDBMSで独自にSQLを拡張してるから、DBMS何か書け

689 :NAME IS NULL:2020/08/11(火) 22:32:28.94 ID:???.net
>>687
「how to declare variables in <データベース名>」でググる

690 :NAME IS NULL:2020/08/12(水) 00:03:04.85 ID:???.net
自分なら、SQLを呼び出す処理言語側の文字列編集機能を利用すると思う

691 :NAME IS NULL:2020/08/12(水) 11:10:53.53 ID:???.net
>>688
access2000です

>>689
VBAの話が引っかかってきてSQLの話が見当たりません

692 :NAME IS NULL:2020/08/12(水) 12:18:20.38 ID:???.net
>>691
さすがに2000とか知らんけど

フォーム作ってそこにテキストボックスなりを追加して参照
標準モジュールで関数作る
パラメータクエリにする

ぐらいじゃね

693 :NAME IS NULL:2020/08/12(水) 12:21:07.34 ID:???.net
>>690
ホストアプリがあるならアプリ側でパラメタ使うのが良いけどな
文字列編集はインジェクションの問題があるからお勧めしかねる

694 :NAME IS NULL:2020/08/13(木) 12:23:47.95 ID:/Y5MMyFg.net
sqlite3で
CREATE TABLE dup (name text, size int, inum int,md5 text, primary key (name,size,md5));
とテーブル作って,ファイル名,ファイルサイズ,i-node番号,md5の値を入れてやって,
そこから重複したファイルを探すためにはどういうクエリ書くといいでしょうか.
sizeとmd5が同じでinumは異なるが重複してる条件です.
実際には2Mファイルくらいで実行予定 on macos yosemite.
find . -type f -exec md5 \{\} \; | sort -k4 | guniq -f 3 -dD
でいけけど,サラに近いマシンなので
gnuのuniq入れるのめんどうだから試しにこういう方法だとどうかなと思って.

695 :NAME IS NULL:2020/08/13(木) 12:56:55.33 ID:???.net
inumがユニークならsizeとmd5でgroup byしてカウントが2以上のもの
ユニークじゃないならsizeとmd5とinumでdistinctしてから上記

696 :NAME IS NULL:2020/08/13(木) 16:22:47.09 ID:/Y5MMyFg.net
>>695
ありがとうございます.

select * from dup natural join (select size,md5 from dup group by size,md5 having count(*)>1) group by inum having count(inum)=1;

こんなかんじでいけました.

697 :NAME IS NULL:2020/08/13(木) 21:47:36.96 ID:???.net
漠然とした変な質問になるけどクエリ1000行のスクリプトってどんなん?
そんなん扱うことあります?

698 :NAME IS NULL:2020/08/13(木) 22:02:16.28 ID:???.net
テーブル初期作成時のinsert文で作ったことはある

699 :NAME IS NULL:2020/08/13(木) 22:06:03.40 ID:???.net
たしかにそれなら1000行いくこともありますね
なんかまだよくわからないんすけど1000行くらいのSQL書けるようになってくれ言われて、ハイ?みたいな
行数の問題かーいと

700 :NAME IS NULL:2020/08/13(木) 22:18:05.90 ID:???.net
SQLをスクリプトで生成するようにしてて生成結果が1000行超えたことはある
2500行くらいになってた

701 :NAME IS NULL:2020/08/13(木) 22:36:24.13 ID:???.net
>>699
>1000行くらいのSQL書けるようになってくれ

かなりヤバイ臭いがするから
1~2年以内の転職を見越して仕事をしたほうがよさそう

702 :NAME IS NULL:2020/08/13(木) 22:59:31.09 ID:???.net
単純にINがめちゃくそ多いだけだったら笑う

703 :NAME IS NULL:2020/08/13(木) 23:26:15.44 ID:???.net
データをベタで書いて行数が多いSQLを指して
1000行くらいのSQL書けるようになってくれとは言わんだろう

ビジネスロジック盛り盛りの長ったらしいストアドを書いてるんじゃないの?

704 :NAME IS NULL:2020/08/13(木) 23:30:35.12 ID:???.net
>>703
勢いで書いてしまうかも知れないが、
半年後訳分からなくなりそう

705 :NAME IS NULL:2020/08/16(日) 16:25:58.32 ID:0fCZGJKA.net
googleて個人の検索履歴をすべて保存しているらしいんですがmysqlなんかのデーベース使ってるんですかね?

706 :NAME IS NULL:2020/08/16(日) 18:52:04.52 ID:???.net
GoogleならBigTableとかSpannerとかだろう

707 :NAME IS NULL:2020/08/16(日) 18:58:24.65 ID:???.net
https://headlines.yahoo.co.jp/cm/main?d=20200816-00000014-kyodonews-int
GAFAはやばいらしい
Microsoftもだめだろうな

708 :NAME IS NULL:2020/08/16(日) 19:37:20 ID:RJFVZd8g.net
http://pawahara.epizy.com/

709 :NAME IS NULL:2020/08/18(火) 12:14:31.56 ID:???.net
>>689
ありがとう。
自分が使ってるマイナーDBでも、やりかた解ったよ。

710 :NAME IS NULL:2020/08/19(水) 02:19:19.16 ID:???.net
HeidiSQLで同じテーブルをコピーしたら容量のとこが毎回違うんだけど、これってアバウトな数値なんかな?
データもテーブルの型も同じはずなんだけどな

711 :NAME IS NULL:2020/08/19(水) 16:24:07.32 ID:???.net
>>710
たいていのDBで、テーブルのレコードが格納されている領域はある程度の空きを作るようになっている
だから実データ量が同じでもテーブルの格納に使う容量は同じとは限らん

そのHeidiSQLとやらが表示しているのが何かわからんし、それ以外の要因の可能性もまあなくはないがな

712 :NAME IS NULL:2020/08/19(水) 17:46:32.07 ID:???.net
データを追加する順番が全く同じでなければfill factorとかを含めて容量が変わる可能性はある

同じデータを同じソースからデータの順序を含めて同じ方法で複数回コピーしたんなら
fill factorは同じだろうからそれが原因で容量が毎回変わる可能性低いので
圧縮の失敗とか他のリソース状況に左右される要因のほうが可能性が高いかも

もしInnoDBでSHOW TABLE STATUSを使ってるんなら
Data_lengthやIndex_lengthはおおよその値みたいだから
INNODB_TABLESPACESみて実際の値で確認が必要

713 :NAME IS NULL:2020/08/22(土) 16:44:07.34 ID:???.net
>>701
遅レスでほんとすみません
他答えてくれた方々も

とりあえずまだ全貌わからずなのですが転職見据えつつでいこうと思います
ありがとうございます

714 :NAME IS NULL:2020/08/25(火) 02:44:52 ID:???.net
旧システムとかなり違う新システムを設計することになったのですが、
旧システムからのデータの移植も必要です。

テーブル設計がほぼ別物なのですが、大まかな流れとしてはどのように進めればよいのでしょうか?

715 :NAME IS NULL:2020/08/25(火) 07:50:43 ID:???.net
一般論すぎて答えようがない

716 :NAME IS NULL:2020/08/25(火) 09:28:09.07 ID:???.net
>>714
> 旧システムとかなり違う新システム
> 旧システムからのデータの移植も必要
地雷臭しかしない…

717 :NAME IS NULL:2020/08/25(火) 10:26:12.08 ID:???.net
それ自体は別に地雷臭はせんやろ
データ移行の伴う普通のシステム移行

718 :NAME IS NULL:2020/08/25(火) 10:57:38.42 ID:???.net
移行プロジェクトも普通の開発プロジェクトと流れは同じ
要件定義 -> 設計 -> 実装 -> テスト -> リリース -> 監視・運用

データ移行の要件はシステム移行の要件次第なので
システム移行計画がきちんと立てられてなければそこからやる必要がある

実装レベルだと既存データの精査やデータコンバージョン方法の検討とか必要だけど
全体の移行計画からすればそういうのは些末な問題
(新システムの設計時に考慮されてなければ詰む可能性はある)

https://www.oracle.com/technetwork/middleware/oedq/successful-data-migration-wp-1555708.pdf
http://www.etlsolutions.com/wp-content/uploads/2012/11/Data-Migration-eBook.pdf
https://www.datamigrationpro.com/data-migration-checklist-planner/

719 :NAME IS NULL:2020/08/25(火) 11:03:37.23 ID:???.net
>全く新しい、別の何かに、生まれ変わる

720 :NAME IS NULL:2020/08/25(火) 11:10:48.97 ID:???.net
> かなり違う新システム
> テーブル設計がほぼ別物
これのデータ移行が普通ねぇ…

721 :NAME IS NULL:2020/08/25(火) 13:13:11.75 ID:???.net
システム改修じゃなくて、新システム構築なんだから普通だろ

まあSQLの問題じゃないから、これ以上はどっか設計のスレいけ

722 :NAME IS NULL:2020/08/25(火) 13:48:39.69 ID:???.net
>>721
はいはい、システム移行したこともないド素人の貴重な意見ありがとうございますw

723 :NAME IS NULL:2020/08/25(火) 14:04:04.80 ID:???.net
>>722
そんな経験不足でなんで偉そうなんだよww

724 :NAME IS NULL:2020/08/25(火) 14:18:47.36 ID:???.net
>>723
>>717,721に言ってやれよw

725 :NAME IS NULL:2020/08/25(火) 14:41:58.92 ID:???.net
自分が経験したことないから地雷臭がするんですよね。
わかりますよ。

でもその地雷臭はあなたから臭ってるだけですから。

726 :NAME IS NULL:2020/08/25(火) 15:27:12.44 ID:???.net
経験がないからノー天気になってるだけのド素人乙w

727 :NAME IS NULL:2020/08/25(火) 15:36:58.30 ID:???.net
SQLと全く関係がないし
DB設計を語るスレで思いっきりやってくれ

728 :NAME IS NULL:2020/08/25(火) 15:54:51.59 ID:???.net
質問者や回答者を揶揄することでしか自尊心を満たせなくなってるんやろな

いつもの人だろうけど↓こいつと思考パターンがそっくりで地雷臭どころか地雷そのものなんじゃ・・・
https://president.jp/articles/-/38175

「35年以上ドライバーをやっているから、運転技術は並じゃないんです。みんな俺をナメやがるけど、わかっていないだけなんです」
「アイツはわかっていないんですよ。俺は邪魔するやつに注意をしてやってるだけ」

729 :NAME IS NULL:2020/08/25(火) 16:05:53.15 ID:???.net
スレタイも読めずに新システム構築とか

730 :NAME IS NULL:2020/08/25(火) 16:09:19.48 ID:???.net
なるほど経験豊富な>>717,721の考え方を説明してくれてるのか
まあキチはどこにでもいるからw

731 :NAME IS NULL:2020/08/26(水) 09:57:30.17 ID:???.net
質問です。

JavaアプリからOracleDBにアクセスしています。
selectしたSQLの結果は、
DBサーバーキャッシュされ、
ResultSetのnext()でfetch数ごとにクライアントに取得してくる
といった認識なのですが、

このときIndexなどは
最初に結果キャッシュを作るまでに影響しているだけで
next()時には参照せず関係しないのでしょうか?
それともfetchする度に条件をみて結果キャッシュを作成しているのでしょうか?

732 :NAME IS NULL:2020/08/26(水) 11:49:02.79 ID:???.net
>>731
>next()時には参照せず関係しないのでしょうか?

SENSITIVEかどうかによるんじゃないかな
SQLじゃなくJavaの質問なので詳しくはJavaのスレで聞いてね

733 :NAME IS NULL:2020/08/26(水) 21:35:32.89 ID:???.net
sqlserverとかはメモリーにキャッシュしてるけどオラクルもそうじゃねえ
メモリー容量によるんじゃねえ
javaはよくわからんけどphpならそういう時は全件配列に読み込んで配列を回す
SQLサーバのメモリーを使うかアプリケーションサーバのメモリーを使うかの違いだけどださ

734 :NAME IS NULL:2020/08/26(水) 23:16:14.54 ID:???.net
Javaでどういうコード書いて、それがどういうSQLで発行されてるかだけど
カーソル使ってるんじゃなかったか

ORACLEのスレ行ってカーソルの動作聞くのが良いんじゃね

735 :NAME IS NULL:2020/08/26(水) 23:37:19.08 ID:???.net
ResultSet.TYPE_SCROLL_SENSITIVEっつうのがあるのよ
fetchするときにDBが更新されてれば更新後のデータが取得される

気になるなら通信内容を確認したり
DB側でどういうSQLが発行されてるかを覗けば良いと思う

ただAPIで公開されている以上の動作は告知なく変更される可能性があるので
確認した動作に依存するようなコードは書かないほうが良い

736 :NAME IS NULL:2020/08/27(木) 00:26:23.94 ID:???.net
そんなコロコロ変わるAPIでもなさそうだけどねぇ むしろDBMSによるところが大きそうなので移植のときに影響があるだろう

737 :NAME IS NULL:2020/09/10(木) 03:51:56.49 ID:hevdIxjAK
芸人ヒロシが「ひとり」という生き方を選ぶまで
https://gendai.ismedia.jp/articles/-/72045
「僕、いらないんじゃない?」ーーテレビから離れたヒロシ48歳、「ネガキャラ」の覚醒
https://news.yahoo.co.jp/articles/6b396136d148a4d51ee0897571f95e47003c5a7e
芸人ヒロシ「ぼくがソロキャンプにハマった理由」
https://www.hotpepper.jp/mesitsu/entry/cocolo/18-00369
50歳独身、彼女も友達もゼロの「ヒロシ」が今大注目を浴びる理由。絶望せずにひとりで生きる術
https://ddnavi.com/review/591425/a/
「ひとりがいいです」〜ヒロシが語るソロキャンプ
https://www.yomiuri.co.jp/topics/20190111-OYT8T50008/
「プロのひとり上手」ヒロシが語る「ひとりの楽しみ方」
https://gendai.ismedia.jp/articles/-/72042

738 :NAME IS NULL:2020/10/01(木) 17:43:28.97 ID:???.net
sqlserverのsqlについて質問いいですか?
一時テーブルから、本テーブルにデータを移行するsqlを作りたいです。
両テーブルは項目は同じだけれど、必須制約が異なり、本テーブルのみに必須制約がついている項目があります。その項目にはデフォルト値が設定されています。
Insert-Select文で、nullの場合はデフォルト値を設定するような書き方ができないでしょうか?

ISNULL(項目,default)←エラーになりますが、こういう事がやりたいです。

739 :NAME IS NULL:2020/10/01(木) 18:01:45.48 ID:???.net
isnullで間違ってないと思うが使い方が間違ってるんだろう

740 :NAME IS NULL:2020/10/01(木) 21:47:30.24 ID:???.net
defaultは値や項目名じゃなくて予約語だからな
ISNULLには指定できないだろう

あらかじめ挿入元テーブルをデフォルト値で更新しとくのが楽だと思うが
それかwhereで条件分けして2種類のinsert select文書くとか

741 :NAME IS NULL:2020/10/01(木) 23:45:23.07 ID:???.net
デフォルト値にしたいカラムだけ除いてinsert intoすればいいじゃん。カラムを列記するのが面倒くさいのか

742 :NAME IS NULL:2020/10/02(金) 00:17:54.42 ID:???.net
>>738です
やっぱり出来ないですよね…
一時テーブルにデータあった場合は、それを登録しなきゃあかんので、valueから外すとかも出来ないんですよねー
面倒だけど、ISNULL(項目,項目のデフォルト値)を手動で設定します。
ありがとうございました。

743 :NAME IS NULL:2020/10/02(金) 02:25:40.48 ID:yhrmxStj.net
>>738
デフォルト値はNULLが指定されたときに使われるものではない

744 :NAME IS NULL:2020/10/02(金) 02:29:10.50 ID:yhrmxStj.net
>>742
デフォルト値を勘違いする人間ばかりだから仕方ないけど、一方でNULLはNULLという値でもあるんだよ。

745 :NAME IS NULL:2020/10/02(金) 09:58:46.73 ID:???.net
nullは値じゃねえよ
大概の値が書けるとこで指定出来るだけ
本来指定出来ないとこでも指定できるようになってるケースも多い

746 :NAME IS NULL:2020/10/02(金) 11:08:38.54 ID:???.net
>>745
相手にしたら負け

747 :NAME IS NULL:2020/10/02(金) 15:36:52.05 ID:yhrmxStj.net
>>745
NULL valueと言ったりもします。日本語だとNULL値と言います。

748 :NAME IS NULL:2020/10/02(金) 15:42:12.65 ID:yhrmxStj.net
NULLは値がないことをあらわすのですが、NULLは値がないことを示す値で、NULLというデータがデータファイルに書き込まれます。

749 :NAME IS NULL:2020/10/02(金) 15:43:28.01 ID:yhrmxStj.net
NULLは値がないことをあらわすのですが、NULLは値がないことを示す値で、NULLというデータをあらわすデータがデータファイルに書き込まれます。

750 :NAME IS NULL:2020/10/02(金) 17:35:37.50 ID:???.net
>>738
どうしてもディフォルト値を明示したくなくてかつId列みたいな列がありレコードが一意に特定できるなら
insert into テーブル (Id, 非必須制約列)
 select Id, 非必須制約列 from 一時テーブル;
update テーブル
 set 制約列 = isnull(一時テーブル.非必須制約列, テーブル.非必須制約列)
 from 一時テーブル
 left join テーブル on 一時テーブル.Id = テーブル.Id;
みたいに一旦ディフォルト値を入れて元の値がNullで無いなら更新しちゃうぐらいしか思いつかん

751 :NAME IS NULL:2020/10/02(金) 18:11:35.90 ID:???.net
そもそもなぜその一時テーブルを元テーブルと同じにしないのか

752 :NAME IS NULL:2020/10/02(金) 18:25:48.52 ID:???.net
>>750
ISNULL使えば普通にできるやろ
https://rextester.com/FWZZ15285

753 :NAME IS NULL:2020/10/02(金) 18:46:34.77 ID:???.net
>>752 は一体何ができたつもりになってるんだろう…

754 :NAME IS NULL:2020/10/02(金) 18:50:43.39 ID:???.net
>>738
MERGE文を使えば出来そうな気がしないでもない(未検証)

755 :NAME IS NULL:2020/10/02(金) 19:02:28.98 ID:???.net
>>753
??
>>738のやりたいことと>>752にどういう違いがあるの?

>>738のやりたいことと>>750が違うことは理解できるんだけど

756 :NAME IS NULL:2020/10/02(金) 19:31:05.84 ID:???.net
>>738
あ、頑張ってMERGE文を使わなくても
拘りないなら、単純に2回insertすればいいのか

必須項目ありのものと
必須項目なしのものと

後者のinsert-selectのときに
insert項目から必須項目なしの項目を除けば
勝手にdefault値が入る

757 :NAME IS NULL:2020/10/02(金) 19:33:11.83 ID:???.net
今更だけど
なお、一意制約違反は考えないものとする
で、いいの?

758 :NAME IS NULL:2020/10/02(金) 20:40:33.02 ID:???.net
>>754
merge に対して insert は最大一回しか書けないから無理じゃね?

759 :NAME IS NULL:2020/10/02(金) 20:42:10.54 ID:???.net
>>755
>>738のやりたいこと理解してる?
まあ具体的にどこがおかしいと書けてない時点で…

760 :NAME IS NULL:2020/10/02(金) 20:43:14.44 ID:???.net
>>756
それ既に>>740に書かれてる
> それかwhereで条件分けして2種類のinsert select文書くとか

761 :NAME IS NULL:2020/10/02(金) 20:45:15.87 ID:???.net
>>757
>>738自体には一意制約に関する条件はないけど?

762 :NAME IS NULL:2020/10/02(金) 20:50:02.14 ID:???.net
>>758
そんな制約あったっけ?

763 :NAME IS NULL:2020/10/02(金) 21:14:48.46 ID:???.net
>>762
insert が書けるのは WHEN NOT MATCHED [ BY TARGET ] で、これは最大一個しか書けない

764 :NAME IS NULL:2020/10/02(金) 21:15:47.03 ID:???.net
あー、INSERT文にはデフォルト値をリテラルで指定せず
テーブル定義から持ってきたかったってことか

INFORMATION_SCHEMAとか使って
デフォルト値を取得してそれをISNULLに渡してやればできるが
その手間をかける意味があるのかな?

765 :NAME IS NULL:2020/10/02(金) 21:41:34.20 ID:???.net
INFORMATION_SCHEMAを使う例
https://rextester.com/FVI61214

766 :NAME IS NULL:2020/10/08(木) 10:21:30.44 ID:???.net
なんじゃこの流れ
デフォルト値書けばいいだけのところを2回インサートとかインサートしてからアップデートとかw

767 :NAME IS NULL:2020/10/10(土) 07:49:23.38 ID:???.net
うむ、あたまとろけそうだ

768 :NAME IS NULL:2020/10/10(土) 15:10:26.65 ID:???.net
ほんとうに関係ないことを聞くのかもしれないですけど、データベースをチューニングするとは具体的にどのようなことを指すのでしょうか?
統計情報をいじるとか、実行計画を変更することですか?

もしそうであるとするならば現状内部に搭載されているものよりもいい設計を自分達で作るということになるのでしょうか?

769 :NAME IS NULL:2020/10/10(土) 16:26:14.46 ID:???.net
DBMSの設定、動作環境を変える
DB設計を変更する
SQLを変更する
アプリケーションの作りを変更する

まあ、こんな感じか

770 :NAME IS NULL:2020/10/10(土) 17:22:35.22 ID:???.net
分かりやすいのは
SQLの書き方を変える、インデックス構成を変える、アプリのSQL発行回数を減らす

インデックスじゃなくテーブル設計を変更したりストレージの構成を変更したりすることもある

771 :NAME IS NULL:2020/10/10(土) 17:47:23.55 ID:ohvIi5QJ.net
>>770
SQLの発行回数を減らすという点だけは間違い。

772 :NAME IS NULL:2020/10/10(土) 17:50:56.29 ID:ohvIi5QJ.net
>>768
そのチューニングは、俗にSQLチューニングと呼ばれるもの。

DBMSの設定を変えることもチューニングと呼ばれるが、設定を変えなければいけない状況はほぼ終わっていることを意味する。

773 :NAME IS NULL:2020/10/10(土) 18:52:40.96 ID:fmeIQc78.net
昔はハードウェアのスペックが低く、ネットワークも遅かったから、チューニングなるものが必要だった。

いまのチューニングは性能無視の設計のせいで問題になっていることへの対応ばかり。

774 :NAME IS NULL:2020/10/10(土) 19:09:02.00 ID:???.net
続けたいならDB設計へ移動して

775 :NAME IS NULL:2020/10/11(日) 00:05:12.53 ID:???.net
「アプリのDB性能をチューニング」であればSQL(DML)の改善も含まれるだろうけど
>>768の書きっぷりだとDB単体のチューニングを意図してるのかな
キャッシュ設定とか同時接続数とかパフォーマンスに関わるパラメータ設定はいっぱいあるわけで
その手のパラメータ設定もDDLの一種だからSQLの範疇・・・・と強弁しようと思ったけど
設定ファイル直書きしないといじれないようなパラメータのほうが多いか

メモリやストレージ自体を増設して物理で殴るのもチューニングだし
テーブルの結合回数が少なくなるようにあえて正規化を崩して1テーブルにまとめるとか
過去データを別テーブルに切り出してテーブルを分ける&データ量を減らすのもチューニング
古いDBMSだとSQL文中で使うインデックスを指定できたりもしてそういうので性能改善するのもチューニング
少量であるマスタデータについてアプリ側でstaticに保持して都度DBから取得しないようにするのもチューニング
どこまでがDBのチューニングに該当するかは、>>768が意図してるチューニング対象次第

776 :NAME IS NULL:2020/10/11(日) 00:50:11.01 ID:htFnFZMI.net
20年くらい前の書き込みみたいだなw

777 :NAME IS NULL:2020/10/11(日) 09:23:19.11 ID:???.net
皆さんかなりわかりやすかったです!
ありがとうございます。

じゃあ自分も既存のSQLを効率化するために変更したことがあるのでチューニング経験があるって言えば嘘にはならないわけですね

778 :NAME IS NULL:2020/10/11(日) 18:54:37.44 ID:htFnFZMI.net
>>777
具体的に何をどうしたのかと必ず聞かれるから、結構、面倒な話になるよ。

779 :NAME IS NULL:2020/10/13(火) 09:55:42.86 ID:HZoI7/m3.net
集計の書き方がわからず、どなたか教えてください。

■DBMS名とバージョン postgreSQL 10.14
■テーブルデータ
id hiduke   basho   jikan   ninzu
--------------------------------------------
1 2020/10/01 東京本社  09:00   3
2 2020/10/01 東京本社  10:00   6
3 2020/10/01 東京本社  11:00   9
4 2020/10/01 大阪支社  09:00   0
5 2020/10/01 大阪支社  10:00   2
6 2020/10/01 大阪支社  11:00   1
7 2020/10/02 東京本社  09:00   3
8 2020/10/02 東京本社  10:00   0
9 2020/10/02 東京本社  11:00   6
10 2020/10/02 大阪支社  09:00   0
11 2020/10/02 大阪支社  10:00   5
12 2020/10/02 大阪支社  11:00   2

■欲しい結果
東京本社
     2020/10/01  2020/10/02
09:00    3       3
10:00    6       0
11:00    9       6

大阪支社
     2020/10/01  2020/10/02
09:00    0       0
10:00    2       5
11:00    1       2

■説明
来店者の人数の集計で
場所と日付・時間の集計表を作成したいです。
場所の数は少ないので各社ごとに問い合わせてもよいと思います。
よろしくお願いいたします。

780 :NAME IS NULL:2020/10/13(火) 10:26:10.89 ID:???.net
>>779
そもそもそれ集計ですらないだろw
表に組みたいならアプリ側でやった方がいい
支社単位ならまだ無理やりやれなくはないけど「東京支社」とか「大阪支社」とかどうやって出力する気なんだ?

781 :NAME IS NULL:2020/10/13(火) 10:57:58.93 ID:???.net
SQL使う必要ないwww

782 :778:2020/10/13(火) 12:03:54.61 ID:HZoI7/m3.net
>>780.780
確かに集計ではないですね。
質問として適当ではなかったと反省しています。
実際は、関東地区(管轄する本社支店)の来店者数とか
全社での来店者数とかが必要になってくるわけでして。
支店ごと、地区ごとで、問い合わせるのはよいのですが、
アプリ側で加工するのではなく、
SQLの結果を回して表示できたらいいなと思っての質問です。
よろしくお願いいたします。

783 :NAME IS NULL:2020/10/13(火) 12:09:18.72 ID:???.net
case式やcrosstabでできるけど
メリットないからアプリでやるべき

それと対象の日付数が固定でないなら
日付を縦に時刻を横にしたほうがいい

784 :NAME IS NULL:2020/10/13(火) 13:39:10.72 ID:???.net
使ったことないけどrollupでなんとかなるんじゃね

785 :NAME IS NULL:2020/10/13(火) 13:39:42.83 ID:???.net
>>782
SQLの結果をどうやって表示するんだ?
何らかのアプリが必要だと思うが…
まさかpsqlで表示させるとかか?

786 :NAME IS NULL:2020/10/13(火) 13:59:32.76 ID:???.net
>>779
ムリにでもSQLで
表整形したいってのなら
それはそれで頭の体操っぽいお題か

787 :778:2020/10/13(火) 16:26:31.51 ID:HZoI7/m3.net
返信ありがとうございます。
SQLの結果をPHPで取得してforeachで回して表示するつもりです。
>783
そうですね。時間が横軸ですね。
時間固定で、日付が変動すると、私の拙い文章でよくわかっていただけました。
びっくりです。

SQLで元データを取得して、PHPで加工組直しして表示するよりも
SQLでデータをずばりを取得して、PHPで行表示の方がシンプルでないですか。

全社、あるいは東京と大阪の合計の日付・時間のクロス(?)集計は
どのようなSQLを投げますか?
みなさんは、データを丸っと抜いてアプリで集計しますか?

788 :NAME IS NULL:2020/10/13(火) 17:48:14.42 ID:???.net
>SQLでデータをずばりを取得して、PHPで行表示の方がシンプルでないですか。
同意。

時間横軸固定ならシンプルにCASEでいいんでない?
SELECT
basho,hiduke
,SUM(CASE jikan WHEN '09:00' THEN ninzu ELSE 0 END)
,SUM(CASE jikan WHEN '10:00' THEN ninzu ELSE 0 END)
,SUM(CASE jikan WHEN '11:00' THEN ninzu ELSE 0 END)
FROM テーブル
GROUP BY basho,hiduke
ORDER BY basho,hiduke

789 :NAME IS NULL:2020/10/13(火) 20:56:51.40 ID:???.net
PHPって縦横変換が簡単にできないの?
transposeとかそういう名前の関数でだいたい一発なんだけど

790 :NAME IS NULL:2020/10/13(火) 22:02:47.85 ID:???.net
phpなら表示はwebページだと思うけど横長のテーブルは
横へのスクロールが面倒で見にくいから縦長にしたほうが
いい。人間の目は横方向にスライドして見ていくのが苦手だから比較は縦方向に並べたほうがいい。

791 :NAME IS NULL:2020/10/13(火) 22:52:59.85 ID:???.net
SQLの場合はピボットする時も含めて
基本的に横のカラム数が固定で縦の行数が可変なんだよ
逆もできなくもないけど面倒になるだけ

792 :NAME IS NULL:2020/10/13(火) 23:31:58.53 ID:???.net
>>789
バージョンによるけどこんな感じ >縦横変換
https://ideone.com/AdL09A

793 :NAME IS NULL:2020/10/14(水) 00:50:51.70 ID:???.net
>>792
null渡すのがなんか微妙だけどそのくらいでできるならアプリでやったほうが簡単そうに思える

794 :778:2020/10/15(木) 15:15:31.24 ID:3rqzyp6L.net
出張があって返信できませんでした。
みなさん、ありがとうございます。
>788 SQLありがとうございました。その線でいきます。助かりました。
>789 縦横といいますか、CでもJava(多分)でもPHPでも多元配列に入れて添え字の
入れ換えだと思います・・・。>792さんはarray_map使って格好いいです。
私はたぶんfor文を入れ子にするとかの泥臭いやり方です。

795 :NAME IS NULL:2020/10/20(火) 23:13:56.49 ID:pOjtJopP1
うちの動画編集マンが月収600万円稼いでる件について
https://www.youtube.com/watch?v=yVlxnDp41zE&t=241s
【生ハム帝国】月収2000万の生活を告白
https://www.youtube.com/watch?v=dG-oh6vBbyI&t=439s
平均月収700万の動画編集者達が過去の辛かった仕事、楽だった仕事についてリアルに語ります。
https://www.youtube.com/watch?v=vBuBhd0ckRI
【月収120万円】医大生動画編集者の多角化戦略
https://www.youtube.com/watch?v=ldY5HY_EWQc
医学生→月200万になった体験談とノウハウ
https://www.youtube.com/watch?v=3eA3ua-dLmk&t=368s
MVクリエイターの時給は動画編集者の〇倍!?【インタビュー】
https://www.youtube.com/watch?v=aaP0Q6wDO0Q

796 :NAME IS NULL:2020/11/12(木) 10:23:22.89 ID:???.net
すみません、
SQL Server Developerエディションについて教えて下さい。
このエディションは開発用となっていますが、機能的にはスタンダードと同レベルで使えるのでしょうか?
また実稼働では使用不可とはおもいますが、ライセンス的にはどこでみわけてるのでしょうか?
使用していると定期的に確認メッセージが出たりするのでしょうか?

797 :NAME IS NULL:2020/11/12(木) 10:53:13.32 ID:???.net
>>796
スレチ

798 :NAME IS NULL:2020/11/12(木) 19:43:36.05 ID:???.net
>>796
>>1 を読め
> このスレは
> 「こういうことをやりたいんだけどSQLでどう書くの?」
> 「こういうSQLを書いたんだけどうまく動きません><」
> などの質問を受け付けるスレです。

なのでこっちへ行け
Microsoft SQL Server 総合スレ 12
https://mevius.5ch.net/test/read.cgi/db/1534679537/

799 :NAME IS NULL:2020/11/29(日) 22:11:58.15 ID:???.net
質問させてください。
Postgresql 9.6を使用していますが、他のでも似たようなことができれば参考までに教えてほしいです

テーブル名:TEAM
------------------------
team_id name nation
1 Ferrari Italy
3 Mercedes German

テーブル名:DRIVER
driver_id name car_number age team_id
-----------------------------------------------------
1 Hamilton 44 35 3
2 Bottas 77 31 3
3 Leclerc 16 23 1
4 Vettel 5 33 1


ほしい出力結果:
ID TEAM DRIVER_A CAR_Num_A DRIVER_B CAR_Num_B
-------------------------------------------------------------------------------------
1 Ferrari Leclerc 16 Vettel 5
3 Mercede Hamilton 44 Bottas 77

説明:
各チーム2人のドライバー情報がありますが、チーム毎に一つのレコードで、かつドライバー毎にカラムを分けて出力したいです。
今はそれができないので、以下のようにドライバーAとBでカラムを分けずに一つのカラム内で,区切りで表示させてます
SELECT
TEAM.team_id as ID
TEAM.name as TEAM
string_agg(driver.name, ',' ORDER BY driver_id) as DRIVER
string_agg(driver.car_number, ',' ORDER BY driver_id) as CAR_Num

FROM TEAMS
LEFT JOIN driver on TEAMS.team_id = driver.team_id

ORDER BY
TEAM.team_id

800 :797:2020/11/29(日) 22:19:41.74 ID:IfXrDILF.net
書き忘れましたが、テーブルは弄れないです。出力方法だけでどうにかしたい。
説明にある現在の出力結果は↓みたいな状態

ID TEAM   DRIVER      CAR_Num
------------------------------------
1 Ferrari   Leclerc,Vettel  16,5
3 Mercedes Hamilton,Bottas 44,77

TABで区切ってたので表示が見づらくすみません

801 :NAME IS NULL:2020/11/29(日) 22:37:38.58 ID:???.net
team_id、team_id + 1 で
二人分のdriver_idを求めても良いのかな

802 :797:2020/11/29(日) 22:51:38.61 ID:IfXrDILF.net
>>801
引退などでdriverテーブルからドライバーが削除される場合、driver_idにが必ずしもdriver_id+1じゃなくなる場合があります。
たとえば上記例でBottasが引退してnewbieという新人がMercedesのドライバーになった場合、newbieのdriver_idは5になるので…できないことになるかと

803 :NAME IS NULL:2020/11/29(日) 22:55:29.76 ID:???.net
team_idとdriver_idを紐付ける情報が無いと無理でしょう
その情報をもたせた新しいテーブルを作ると言うのは?

804 :797:2020/11/29(日) 23:48:20.51 ID:IfXrDILF.net
>>803
自分はSELECTするだけで作れない立場なんです…
string_agg(driver.name, ',' ORDER BY driver_id)でHamilton,Bottasって配列みたいになっているはずなので
そこからSPLIT(string_agg(driver.name, ',' ORDER BY driver_id)',', 1)みたいにしてn番目の要素を取り出すことができればいいんですが

805 :NAME IS NULL:2020/11/29(日) 23:59:23.14 ID:???.net
>>804
どのチームのドライバが引退して新人が来るか分からないんでしょ?
そうするとテーブル途中のドライバが引退し、最後に新人が追加されることもあると思うよ

806 :797:2020/11/30(月) 00:16:03.97 ID:mk7AKPzA.net
>>805
確かにそうなのですが、ドライバーが引退した場合、そのレコードは削除(使用不可)されるので、
例えばdriver_idが3のBottasが引退して削除、その後DRIVERテーブルにdriver_idが5のnewbieがteam_id 3として新規追加された場合、
string_agg(driver.name, ',' ORDER BY driver_id)の結果はHamilton,newbieのように出力されるからいける気がしたんです

807 :797:2020/11/30(月) 00:16:46.80 ID:mk7AKPzA.net
Bottasのdriver_idは2でした。失礼しました

808 :797:2020/11/30(月) 01:13:20.43 ID:mk7AKPzA.net
普通にsplitできて解決しました…失礼しました。
split_part(string_agg(driver.name, ',' ORDER BY driver_id),',',1) as DRIVER_A,
split_part(string_agg(driver.car_number, ',' ORDER BY driver_id),',',1) as CAR_Num_A,
split_part(string_agg(driver.name, ',' ORDER BY driver_id),',',2) as DRIVER_B,
split_part(string_agg(driver.car_number, ',' ORDER BY driver_id),',',2) as CAR_Num_B

809 :NAME IS NULL:2020/11/30(月) 23:26:02.52 ID:???.net
>>799
もう解決したみたいだけどwindow関数使うやり方を書いておく
https://rextester.com/FYRWPG99446

こういうのはアプリ側でやったほうが簡単だしテストや変更管理も楽でいいと思う

810 :NAME IS NULL:2020/12/15(火) 12:01:32.79 ID:zQSBdFCX.net
select date(time),count(*) from a group by date(time);
これで日付毎のカウントは出せるんですけど、やりたいのは、その日付までのcountなんです。
それを出来ればワンライナーでやりたい
出来るでしょうか?

811 :NAME IS NULL:2020/12/15(火) 12:13:19.72 ID:???.net
>>810
できると思うけど
とりあえずDB Fiddleとかrextesterにサンプルのテーブルとデータを書いて
https://www.db-fiddle.com/
https://rextester.com/l/postgresql_online_compiler

812 :NAME IS NULL:2020/12/20(日) 12:06:59.88 ID:???.net
100m走の記録で、
名前、日時、記録、付随情報
というデータがたくさんあります
全記録の最高はMaxで簡単に求まりますが、歴代最高の変遷を一覧にして、そのレコードの全項目を表示させたいです
JOINを何度か使えばできないことはないのですが、ものすごく重くなってしまいました
できるだけ軽く一覧を出力するにはどうしたらいいか教えてください

813 :810:2020/12/20(日) 13:24:33.28 ID:???.net
すみません、自己解決しました
WHERE句に、SELECTでその日時以前の記録の最高を取得してそれがレコードの記録と一致しているものというふうに指定したらあっさり出ました
お騒がせしました

814 :NAME IS NULL:2020/12/20(日) 13:27:02.81 ID:???.net
select T1.*
from  TableName T1
where  not exists (
        select *
        from  TableName T2
        where  T1.日時 > T2.日時
        and   T1.記録 > T2.記録
    )
;

815 :NAME IS NULL:2020/12/25(金) 14:49:01.43 ID:???.net
CREATE USERはCREATE文とUSER句によって構成されているの?
それとも、CREATE USER文?

816 :NAME IS NULL:2020/12/25(金) 16:32:04.77 ID:???.net
CREATE USER文

817 :NAME IS NULL:2020/12/31(木) 13:47:26.28 ID:5sVnraIZU
自由な働き方を求め10代〜20代の登録が拡大。フリーランス登録者約3.4倍に増加。
https://prtimes.jp/main/html/rd/p/000000348.000010591.html
フリーランス向け報酬即日払いサービス『先払い』申込件数5,000件突破
https://prtimes.jp/main/html/rd/p/000000048.000047439.html
ITフリーランスの独立支援サービス『テックビズ』&定額制全国住み放題『ADDress』提携開始
https://prtimes.jp/main/html/rd/p/000000035.000047639.html
リース、フリーランスのためのお部屋探しアプリ「smeta」の正式版をリリース、提携賃貸管理戸数が6万戸を突破
https://prtimes.jp/main/html/rd/p/000000032.000042693.html
家族50万円・単身30万円を支給、新潟県が「テレワーク・フリーランス移住」で応援金
https://www.bcnretail.com/market/detail/20201225_205952.html
ワーケーション会社員増加中、定額制宿泊サービス「HafH」を実体験
https://finance.yahoo.co.jp/news/detail/20201231-00257105-diamond-column
「フリーランススタート」の掲載案件数、累計16万件を突破
https://codezine.jp/article/detail/13393
フリーランスエンジニア専門の案件一括検索サイト「フリーランススタート」、
掲載案件数1ヶ月で10,000件増加し、累計掲載案件数16万件突破!さらにリモートワークの掲載案件数5,000件突破!
https://prtimes.jp/main/html/rd/p/000000012.000038976.html
フリーランス向けの求人は「テレワーク可能」が主流に 2021年は労働者の地方への移住が進む?
https://nlab.itmedia.co.jp/nl/articles/2012/25/news118.html

818 :NAME IS NULL:2021/02/09(火) 22:58:24.78 ID:9NjCCljT.net
専ブラBB2Cでワッチョイを正規表現でNGしたいんだけどうまくいかない
第2オクテット(仮にXXとして)だけ固定でこれじゃダメだろうか
.*XX.*

819 :NAME IS NULL:2021/02/11(木) 08:07:42.02 ID:???.net
ちょっとみなさん
SQLでCASE WHEN...って書くとSQLがわけわかんなくなるから
なるべくコードでやるようにしてたんですが

逆なのか!?
じつはSQLだけで独立してテストできるから
コード上で分岐がいらないから
SQLのほうにCASE WHEN書いたほうがいいんですか!???

820 :NAME IS NULL:2021/02/11(木) 10:45:27.88 ID:???.net
まさか抽出条件までをコード実装してるのか?
ありえんだろ

821 :NAME IS NULL:2021/02/11(木) 10:48:38.21 ID:???.net
さすがにそんなことしない
カラムの値の切り替え

822 :NAME IS NULL:2021/02/11(木) 10:56:09.76 ID:???.net
caseを全否定するならなら最初からちゃんと書けよ
1つの抽出項目を複数カラムで共有する程度でわかんなくなるなら
コードでやっておけば良い

823 :NAME IS NULL:2021/02/11(木) 11:10:50.23 ID:???.net
わからんだけで
テストはしやすい

テストしやすいんだ

824 :NAME IS NULL:2021/02/11(木) 11:15:03.37 ID:???.net
開発とメンテ要員で持ってる手駒と相談しな
SQLじゃない

825 :NAME IS NULL:2021/02/11(木) 11:38:32.91 ID:???.net
ケースバイケース
常にどちらかがいいわけじゃない

826 :NAME IS NULL:2021/02/11(木) 12:01:31.63 ID:???.net
パフォーマンスと変更しやすさのトレードオフ

827 :NAME IS NULL:2021/02/11(木) 14:42:10.54 ID:???.net
DBのほうが速いし変更しやすいじゃねーか

828 :NAME IS NULL:2021/02/11(木) 14:55:37.55 ID:???.net
>>827
そう感じる人はSQLで書くほうがいい選択

829 :NAME IS NULL:2021/02/11(木) 23:25:36.43 ID:PiRh1S8f.net
>>819
SQLにするとテストはいらないという不思議な日本人はかなりいるのでそうなることがある。

830 :NAME IS NULL:2021/02/11(木) 23:29:33.85 ID:PiRh1S8f.net
SQLはストラクチャードクエリーランゲージの略ではないよ。

831 :NAME IS NULL:2021/02/15(月) 23:12:03.28 ID:???.net
CASEをSQL内に移動しまくったが
変更がSQL内で完結しなくなって一瞬で破綻した
結局どっちも手入れなきゃいけなくなるなら
最初から融通が利くプログラムに書いたほうがいいじゃねーか

832 :NAME IS NULL:2021/02/15(月) 23:36:34.59 ID:???.net
それはダサい

833 :NAME IS NULL:2021/02/16(火) 00:00:00.67 ID:???.net
移動しまくるほどCASE式使うのは使い方がおかしいか設計がおかしい可能性大

834 :NAME IS NULL:2021/02/16(火) 09:20:56.80 ID:???.net
おかしい世界に合わせなきゃ生きていけないんだよおおおお

835 :NAME IS NULL:2021/02/16(火) 12:17:29.11 ID:???.net
修正先のSQLってプログラムとべつに存在してるのか?

836 :NAME IS NULL:2021/02/16(火) 13:51:22.49 ID:???.net
ストアド使うパターンと埋め込み使うパターンとあるからな

837 :NAME IS NULL:2021/02/17(水) 03:26:45.75 ID:???.net
その状態で>>831みたいなことになるなら俺も設計がおかしいと思うぞ

838 :NAME IS NULL:2021/02/17(水) 12:47:26.40 ID:???.net
Excel脳だとひとつ上の行の列〇〇が△△ならこの行の列□□を■■するなんて平気で言うからw

839 :NAME IS NULL:2021/02/17(水) 14:40:12.81 ID:???.net
それはCASE式だけじゃ解決できないしSQLでやるべき処理でもないな

840 :NAME IS NULL:2021/02/22(月) 16:26:52.56 ID:???.net
ネットの掲示板みたいなデータって、以下みたいに連番で管理するのが普通だと勝手に思ってるのですが、
何千億件にもなるかもしれないレコードから数個のレスを抽出する場合、全レコード走査みたいになってパフォーマンスが落ちたりしないんでしょうか?
----------------------------------------------------
| スレッド番号 | 自身のレス番号 | 内容 |
|--------------------------------------------------|
|   12345   |     1     | 内容 |
|--------------------------------------------------|
|   〜数千万の 他スレのデータレコード〜   |
|--------------------------------------------------|
|   12345   |     2     | 内容 |
|--------------------------------------------------|


双方連結リストにして、再帰クエリで[次のレス番号]が _ になるまで辿るのと、どっちがパフォーマンスいいのでしょうか?
-----------------------------------------------------------------------
| スレッド番号 | 自身のレス番号 | 次のレス番号 | 内容 |
|---------------------------------------------------------------------|
|   12345   |     1     |     2   | 内容 |
|---------------------------------------------------------------------|
|   12345   |     2     |     _   | 内容 |
|---------------------------------------------------------------------|

841 :NAME IS NULL:2021/02/22(月) 17:08:25.66 ID:???.net
>>840
スレッド番号+レス番号で常にデータが並ぶようにインデックス貼るから
後者が前者よりパフォーマンスがよくなることはない

レス番1の次はレス番2なのはわかりきってるのに
それをわざわざデータで管理するのは無駄

現実的なことを言えばすべての板のすべてのスレを1つのテーブルで管理しないし
キャッシュするので毎回DBのテーブルを読みに行ったりもしない

842 :NAME IS NULL:2021/02/22(月) 23:03:50.07 ID:???.net
連結リストはないにしてもクラスタ化インデックスのないDBだとパフォーマンスの問題出てくる
パーティショニングで軽減できるけど件数が多いと困りそう
クラスタ化インデックスがあるDBでもインサート量によっては
ページスプリットが頻発して問題が出てくる可能性がある

てことで今ならRedis使うかな

843 :NAME IS NULL:2021/02/23(火) 20:34:10.74 ID:VuNQtHeV.net
>>840 はただ単にインデックススキャンの概念がわかっていないだけじゃないのか

844 :NAME IS NULL:2021/02/23(火) 22:29:40.26 ID:???.net
SQL Serverで統計情報を一気に百個作れるクエリって書けますか…?
一個一個作るの大変なんです…

845 :NAME IS NULL:2021/02/23(火) 22:49:55.67 ID:hKEGBDE+.net
>>844
何のためのT-SQLなのか

846 :NAME IS NULL:2021/02/24(水) 00:19:13.89 ID:???.net
SQL Serverで統計情報を手動で作る必要があったことはないな

必要ならクエリを生成する簡単なプログラム書けばいいんじゃないの?
条件の種類が多ければ簡単じゃないかもしれないけど

847 :NAME IS NULL:2021/02/24(水) 00:27:41.13 ID:???.net
↓こういうやつってことだよね
https://docs.microsoft.com/ja-jp/sql/relational-databases/statistics/statistics?view=sql-server-ver15#query-selects-from-a-subset-of-data

リンク先には2種類しかパターンが出てないし
100個必要だとしても条件の種類は片手で数えられそうだから
とりあえずT-SQLを吐き出すスクリプトを書くのがよさそう

848 :NAME IS NULL:2021/02/24(水) 03:56:16.62 ID:???.net
検証を行いたくて取り敢えず検証環境に統計情報を100個ほど作成する必要があるんです…
出来ればそのクエリを教えていただけるとありがたいです…

849 :NAME IS NULL:2021/02/24(水) 10:31:54.27 ID:???.net
検証でいきなり100個も手動で作る意味がわからん
リンクのページに説明してあるAUTO_CREATE_STATISTICS オプションやAUTO_UPDATE_STATISTICS オプションは理解してる?

850 :NAME IS NULL:2021/03/04(木) 19:29:19.31 ID:???.net
MS SQL Server 2000でConcat関数を使いたいのですが
ストアドで作れますか?

851 :NAME IS NULL:2021/03/04(木) 21:15:31.42 ID:???.net
ISNULLと+で基本同じことはできる
が20年前のバージョンを使う意味がわからん

852 :NAME IS NULL:2021/03/06(土) 01:35:40.78 ID:???.net
どの製品も
ドキュメントが都合の悪いことかいてなすぎ
データベース界隈闇が深すぎる

853 :NAME IS NULL:2021/03/06(土) 01:37:19.00 ID:???.net
SQLがエラーになったとき
なんでエラー番号がついてないんでしょうか。
調べにくすぎます

854 :NAME IS NULL:2021/03/06(土) 01:58:28.48 ID:???.net
エラーメッセージが親切なRDBを選びましょう

855 :NAME IS NULL:2021/03/06(土) 20:58:48.48 ID:NVAocQUJ.net
安かろう悪かろうだからな

856 :NAME IS NULL:2021/03/06(土) 22:48:52.40 ID:???.net
エラーメッセージはOracleが一番不親切だけどなw

857 :NAME IS NULL:2021/03/06(土) 23:32:12.24 ID:IktepjBV.net
>>856
あえて変えてないだけだよ。他のRDBMSは原因がたくさんあっても、すべて同じだったりとこっちの方が困る。SQL Serverなんてどうすりゃいいのかわからないエラーコードをはく。

858 :NAME IS NULL:2021/03/06(土) 23:33:28.02 ID:IktepjBV.net
MySQL系はなんか間違ってますというエラーメッセージばかり。

859 :NAME IS NULL:2021/03/06(土) 23:36:12.11 ID:???.net
Oracleが最も不親切
次にMySQLが不親切
どっちもボラクル

860 :NAME IS NULL:2021/03/07(日) 00:00:28.08 ID:5tx0Ca07.net
マニュアル無視タイプだな

861 :NAME IS NULL:2021/03/07(日) 08:36:13.65 ID:???.net
「ORA-XXXXX?なにこれわけわかんない。もっと親切なメッセージ表示して!」

862 :NAME IS NULL:2021/03/07(日) 16:03:11.69 ID:???.net
あえてエラーメッセージを不親切にすることで
DBコンサルティングwな仕事を作ってんだよ
リテラシーの低い時代遅れの企業でしか使われないRDB業界のCOBOL

863 :NAME IS NULL:2021/03/07(日) 21:57:04.27 ID:???.net
マニュアル読めない顧客のかわりに仕事するのはごく普通のことだが

864 :NAME IS NULL:2021/03/08(月) 08:57:49.82 ID:cCLh9unq.net
>>862
製品マニュアルを無視するタイプでしょ?

865 :NAME IS NULL:2021/03/08(月) 09:34:18.52 ID:???.net
ORA-12550
詳細: 構文エラーが発生しました

866 :NAME IS NULL:2021/03/08(月) 11:04:43.11 ID:???.net
>>844
メンテナンスプランで統計情報の自動更新できるけど

867 :NAME IS NULL:2021/03/08(月) 12:34:11.75 ID:???.net
>>865
それな

868 :NAME IS NULL:2021/03/08(月) 14:34:13.37 ID:cCLh9unq.net
初心者か

869 :NAME IS NULL:2021/03/10(水) 03:02:29.24 ID:???.net
SQLって独学でスキル伸ばすの難しいですね
独学でやろうにもテストデータやテスト用テーブルを用意するのが手間
そもそも大量のテーブルJOINしたりwindow関数で優先度付けたりと複雑なSQLは業務用件をなんとか実現するうえで出来上がるものだし独学だとそういうのを書く動機や発想がないというか

独学で時間かけてダラダラやるより実戦で2週間ほど揉まれたほうが圧倒的に伸びる

870 :NAME IS NULL:2021/03/10(水) 11:43:32.19 ID:???.net
テストデータやテーブルを用意するのが面倒だと感じるならDBMSが用意してるSample Database使えばいい
SQL ServerのAdventureWorksやWideWorldImportersのようなやつ

データ量が足りなければインサート文を生成するスクリプトか直接インサートするスクリプトを書いてデータを足せばいい
100万件くらいならそれで十分

簡単なスクリプトを書く技術力を持ち合わせてないならSELECT INSERTとかSQLの範囲でできることをやればいい
それもまた勉強になる

871 :NAME IS NULL:2021/03/10(水) 11:50:21.69 ID:kfO0BfR8.net
的外れ

872 :NAME IS NULL:2021/03/11(木) 20:59:42.35 ID:???.net
Oracleがややこしすぎるからそういう印象になるのかもしれない
インストール簡単なフリーの使えよ

873 :NAME IS NULL:2021/03/11(木) 21:34:35.29 ID:???.net
Oracleはインストールだけで400万とってた時期あったなww
そりゃ売れなくなるよ

874 :NAME IS NULL:2021/03/11(木) 22:26:53.82 ID:???.net
どのランキングみてもいまだにOracleがトップシェアだが、売れなくなったってのはどこの話?

875 :NAME IS NULL:2021/03/11(木) 22:51:03.73 ID:???.net
>>874
どこのランキングだよwww
正気か?

876 :NAME IS NULL:2021/03/11(木) 22:54:25.25 ID:???.net
大阪市のシステムでOracleにバグがあると分かってたのに何も通告しなかった
シェア以前の信義の問題だな

877 :NAME IS NULL:2021/03/11(木) 23:06:28.02 ID:???.net
MySQL込みでベンダーとしてはOracleがトップシェアですってオチでしょ

オラクル信奉者は世情に疎くて技術力が低いやつが多くて嫌だよねー

878 :NAME IS NULL:2021/03/11(木) 23:28:19.81 ID:???.net
>>875
https://db-engines.com/en/ranking
https://www.statista.com/statistics/809750/worldwide-popularity-ranking-database-management-systems/
https://www.t4.ai/industry/rdbms-market-share

いやどっちが正気だよw

879 :NAME IS NULL:2021/03/11(木) 23:47:44.84 ID:???.net
ほらね、リテラシーが驚くほど低い

db-engines.comのランキングはpopularityであってマーケットシェアではない
販売数量や金額などの情報は全く加味されてないデータ
2番目のstatista.comは1番目のdb-engines.comが元ネタなので同じ
3番目のt4はMySQL+OracleでベンダーとしてはOracleがトップですよって書いてる

880 :NAME IS NULL:2021/03/11(木) 23:55:54.99 ID:???.net
そういうダメ出しじゃなくてデータは出せないの?

881 :NAME IS NULL:2021/03/12(金) 00:16:09.99 ID:???.net
商用DBMSでOracleがトップシェアじゃないというならトップはMS SQL Serverか?
Expressを数に含めるのかどうかとか難しいな。

882 :NAME IS NULL:2021/03/12(金) 00:28:12.08 ID:???.net
適当にググってもだいたいORACLEっぽいけどなぁ
まぁぺーぺーSEにはどうでもいいけど

883 :NAME IS NULL:2021/03/12(金) 00:36:23.84 ID:???.net
アマゾンやGoogleは何使ってたっけ

884 :NAME IS NULL:2021/03/12(金) 00:37:48.17 ID:???.net
>>880
信頼できる調査会社のレポートはタダじゃないんだよ
個人で買えるような価格じゃないから必要なら会社で買ってもらってくれ

885 :NAME IS NULL:2021/03/12(金) 00:44:13.53 ID:???.net
問:シェアはどの位?
答:企業秘密です

886 :NAME IS NULL:2021/03/12(金) 12:07:28.89 ID:???.net
オラクルのAnnual Report見れば
新規のライセンスが右肩下がりなのはすぐわかるよ

Javaの有料化はDBの落ち込みをカバーするため

887 :NAME IS NULL:2021/03/12(金) 13:07:36.92 ID:???.net
さっそくサイト見にいったらいまだにWeb Forms使っててビックリ
前々から思ってたがオラクルってWeb周りの技術力ないよな

888 :NAME IS NULL:2021/03/12(金) 13:53:07.85 ID:???.net
Cobol使い続けるのと同じ匂い

889 :NAME IS NULL:2021/03/12(金) 17:31:12.15 ID:???.net
同じ臭い

890 :NAME IS NULL:2021/03/12(金) 20:42:29.57 ID:???.net
加齢臭

891 :NAME IS NULL:2021/03/12(金) 21:39:30.86 ID:???.net
Web+DBが流行り始めた当時、まだcgiのサイトも多かったけどmod_plsql使ったOWSは爆速だったな。

892 :NAME IS NULL:2021/03/12(金) 21:42:37.74 ID:4vmjrkQr.net
>>887
自分の仕事が減る恐怖から批判しても意味はない。オラクル社はビジネスとしてやっているんだから、サポートに費用がかかることを勧めるはずがない。

893 :NAME IS NULL:2021/03/12(金) 21:43:41.33 ID:4vmjrkQr.net
>>891
その中途半端に古い知識で語るのはやめろよw

894 :NAME IS NULL:2021/03/12(金) 21:48:18.03 ID:4vmjrkQr.net
Webサイトを見てどうとか周回遅れにもほどがある。

895 :NAME IS NULL:2021/03/12(金) 22:03:32.44 ID:???.net
Web周りの技術力ってISSとWebSphereとOASのどれが優れているかとかいう議論ならわかるが、
「あそこはまだWebForm使ってるんだって。ププw」って優越感感じてるなら逆に恥ずかしい。

896 :NAME IS NULL:2021/03/12(金) 22:09:19.34 ID:4vmjrkQr.net
Google Formの利用拡大をどう非難できるのか、彼に尋ねてみたいわ。

897 :NAME IS NULL:2021/03/12(金) 22:11:49.65 ID:4vmjrkQr.net
だいたいWebLogicを擁するオラクル社に対してWeb技術が低いとか頭がおかしいのかね。

898 :NAME IS NULL:2021/03/12(金) 22:15:07.96 ID:???.net
Webでのシェアってどの位?

899 :NAME IS NULL:2021/03/12(金) 22:19:39.47 ID:4vmjrkQr.net
シェアじゃなくてどれだけビジネスとして成功しているかだろw

900 :NAME IS NULL:2021/03/12(金) 22:26:26.38 ID:???.net
>>895
論点分かってない上に加齢臭がやばいな

901 :NAME IS NULL:2021/03/12(金) 22:28:54.59 ID:???.net
なんというか>>877の言う通りだな
一人だけならいいんだけど

902 :NAME IS NULL:2021/03/12(金) 22:31:30.53 ID:???.net
いまだにWeb Forms使っててビックリ→Web周りの技術力ないよな

ここにどんな論点が?

903 :NAME IS NULL:2021/03/12(金) 22:43:10.92 ID:???.net
>>901
それは「Oracleをdisる俺に反論する奴は全員Oracle信奉者」ってやつだな

904 :NAME IS NULL:2021/03/12(金) 22:48:00.47 ID:4vmjrkQr.net
Web画面屋さんの仕事が減ってカリカリしてんのかな?

905 :NAME IS NULL:2021/03/12(金) 22:58:22.68 ID:4vmjrkQr.net
Oracle APEXを使っていれば、オラクル社のサポートがあるんだから何が気に入らないのかさっぱりわからない。

906 :NAME IS NULL:2021/03/12(金) 23:56:40.33 ID:???.net
GoogleやアマゾンもOracle使ってるの?
それならシェアは大きいだろうなw

907 :NAME IS NULL:2021/03/13(土) 00:07:40.20 ID:rDR1FBCT.net
シェアにこだわる理由がわからない。数はどの製品も右肩上がりなんだし。

908 :NAME IS NULL:2021/03/13(土) 00:11:30.11 ID:???.net
シェアについては自慢できないわけですか?

909 :NAME IS NULL:2021/03/13(土) 00:22:14.43 ID:rDR1FBCT.net
無償版を含めるとOracle DatabaseとSQL Serverで現実は9割だろうな。

910 :NAME IS NULL:2021/03/13(土) 00:29:08.51 ID:???.net
ねーよ

911 :NAME IS NULL:2021/03/13(土) 00:45:23.63 ID:rDR1FBCT.net
MySQLはいまだにポンコツだしな

912 :NAME IS NULL:2021/03/13(土) 00:48:23.84 ID:???.net
MySQLの性能を上げるわけには行かないんだろうな

913 :NAME IS NULL:2021/03/13(土) 01:03:09.94 ID:rDR1FBCT.net
よく勘違いされるけど、MySQLはサン・マイクロシステムズを買収したら、くっついてきたもので、オラクル社が買収したわけではない。

914 :NAME IS NULL:2021/03/13(土) 01:06:48.57 ID:???.net
余計なものなら手放せば良いのに

915 :NAME IS NULL:2021/03/13(土) 11:35:51.33 ID:???.net
>>895
>Web周りの技術力ってISSとWebSphereとOASのどれが優れているかとかいう議論ならわかるが

わかんねーよwww
わかるのはお前だけやぞ
ISSてw

916 :NAME IS NULL:2021/03/13(土) 12:31:35.35 ID:rDR1FBCT.net
とりあえずWebと言っておけば、時代に取り残されていないと思っているんだろうな。

917 :NAME IS NULL:2021/03/13(土) 12:42:01.44 ID:???.net
Oracleもクラウド事業ってやってたんだっけ?
シェアはどれくらい?

918 :NAME IS NULL:2021/03/13(土) 12:56:56.33 ID:???.net
だから単なる誤字をあげつらっても恥ずかしいだけだってw

919 :NAME IS NULL:2021/03/13(土) 13:22:20.05 ID:rDR1FBCT.net
>>917
AWS上で動いているOracle Databaseの多さを知ったらびっくりするタイプ?

920 :NAME IS NULL:2021/03/13(土) 14:35:20.20 ID:???.net
>>918
単なる誤字をあげつらってると捉えるほうが恥ずかしいぞ

DB板だから基本的なWebの技術を知らない事は別に恥ずかしいことじゃない
恥ずかしいのは自分がどのくらい無知なのかを自覚せず斜め上のレスを繰り返してる事

921 :NAME IS NULL:2021/03/13(土) 14:43:28.95 ID:???.net
お釈迦様の手のひらに乗って得意そうにしている孫悟空の図

922 :NAME IS NULL:2021/03/13(土) 14:47:30.70 ID:???.net
ISSってもしかしてIISのことだったの?
Web周りの技術力と言われてWebSphereやOASを出してくるのもどうかと思うが比較対象にIISを入れるのはもっとどうかと思う

923 :NAME IS NULL:2021/03/13(土) 15:06:31.27 ID:SZN15G0F.net
OASが昔のものだと指摘しない、IISがたいしたものではないと思っている等、知識がおかしいな。

924 :NAME IS NULL:2021/03/13(土) 15:45:28.46 ID:???.net
OASってまだ息してるの?
10年以上前に終わった製品だと思ってたんだが

925 :NAME IS NULL:2021/03/13(土) 17:55:28.69 ID:U+US2J/5.net
Oracle Application Server 10gを知っている人間が少ない。

926 :NAME IS NULL:2021/03/13(土) 18:03:52.91 ID:???.net
>>924
そいつの時計の針は20年前で止まってる

927 :NAME IS NULL:2021/03/13(土) 18:25:30.89 ID:???.net
逆に言えばその昔からアプリケーションサーバーやWebフレームワーク作る技術は持っていたってことじゃん。

928 :NAME IS NULL:2021/03/13(土) 18:55:56.49 ID:???.net
誰か使ってる?

929 :NAME IS NULL:2021/03/13(土) 19:26:15.80 ID:???.net
>>928
10年前に使ったと言うかあるシステムの前提ソフトだったからセットアップしたことはある

930 :NAME IS NULL:2021/03/13(土) 21:07:55.41 ID:???.net
>>927
20年前ならアプリケーションサーバー製品の優劣が
ITベンダーのWeb周りの技術力を測る指標の一つにはなったかもしれんな

20年前ならね

931 :NAME IS NULL:2021/03/13(土) 21:20:47.52 ID:???.net
>オラクル信奉者は世情に疎くて技術力が低いやつが多くて嫌だよねー
これってさオラクル使い続けてるような会社はベンダー依存度が高く保守的なカルチャーのところが多いから
技術者が育ちにくかったり技術トレンドを把握してなかったりする傾向が強いんじゃないかな
そう考えると汎用機やCOBOLと同じ匂いがする理由もよく分かる

932 :NAME IS NULL:2021/03/13(土) 21:41:46.38 ID:???.net
>>931
COBOLerと違って自分たちがレガシー化してることに自覚がないから余計に質が悪い

933 :NAME IS NULL:2021/03/13(土) 21:52:44.31 ID:???.net
SQLのテストむずかしくないですか
分離できないし

934 :NAME IS NULL:2021/03/13(土) 22:03:44.64 ID:rDR1FBCT.net
>>933
ちゃんとテストするのは本当に難しい。

SQLのテストをしない文化があるところだと、なんでもかんでもSQLに処理を押し付けて隠蔽して、手抜きをする。

935 :NAME IS NULL:2021/03/13(土) 23:43:42.92 ID:???.net
>>931
OracleはNULLと空文字列の同一視をいい加減どうかしてほしいってのとやたら金がかかるところを別にすれば
そう悪いところはないと思うがな。
Oracleがレガシーだと言っている人たちはいったい何を使っているんだろう。もはやRDBMSじゃないのかな。

936 :NAME IS NULL:2021/03/13(土) 23:55:03.25 ID:???.net
SELECTがFROMの前にくるのってくそめんどくさいよ
microsoftががまんできなくなってオレオレSQL作っちゃうだけあるよ

937 :NAME IS NULL:2021/03/14(日) 00:08:43.32 ID:???.net
>>935
日頃SQL-Server使ってるせいもあるけど例えばTO_CHAR()の書式修飾子とかなかなか慣れんわ
なんでまたトグル動作なんてわけわからん仕様にしたんだろ…

938 :NAME IS NULL:2021/03/14(日) 00:23:57.15 ID:???.net
Oracleは動きが遅すぎるからなあ

939 :NAME IS NULL:2021/03/14(日) 00:24:46.37 ID:???.net
新しいフレームワークに対応させるのにどれだけ時間かけてるのかって…

940 :NAME IS NULL:2021/03/14(日) 00:28:11.51 ID:r8cV92Rv.net
しつこく同じことばかり書くおっさんばかり

941 :NAME IS NULL:2021/03/14(日) 00:31:22.35 ID:r8cV92Rv.net
エドガー・F・コッドは後出しでNULLと空文字を分けた。数値型まで空を定義するように言ってしまったが、数値型の空数値については意味不明で、どの製品も無視している。

942 :NAME IS NULL:2021/03/14(日) 01:07:16.31 ID:???.net
オラクルはnullと空文字区別しないんだっけ?

943 :NAME IS NULL:2021/03/14(日) 02:52:22.47 ID:r8cV92Rv.net
>>942
文字型は空文字列という値がない。空文字列のつもりでシングルクォーテーションでくくられた見た目が空文字列のものを、自動的にNULLとみなす仕様がある。

944 :NAME IS NULL:2021/03/14(日) 10:28:03.50 ID:???.net
>>936
べつにOracleに限らず、SQLをどうにかしてほしいってのは確かに思う。
COBOLと同じで「英文に近ければ誰でも使えるんじゃね?」って発想していた時代の産物だしな。

945 :NAME IS NULL:2021/03/14(日) 10:31:54.48 ID:r8cV92Rv.net
>>944
俺もSQLの構文は好きじゃないけど、デファクトスタンダードになってしまうと、もう変えられないからなあ。

946 :NAME IS NULL:2021/03/14(日) 11:11:51.88 ID:???.net
select句にcase式で数十個の分岐を書きたいのですが、
ルーチンのように先頭か末尾に書くことはできないのでしょうか。

947 :NAME IS NULL:2021/03/14(日) 12:04:55.84 ID:???.net
>>946
ユーザー定義の関数にすれば?
SQLiteとかじゃなければSQLで関数定義できると思うけど

948 :NAME IS NULL:2021/03/14(日) 12:07:00.78 ID:r8cV92Rv.net
>>946
見た目をすっきりさせたいという意図なら、WITH句を使う。

下記のようなサイトを参考にして
https://itsakura.com/sql-with

949 :NAME IS NULL:2021/03/14(日) 12:15:50.94 ID:???.net
それじゃすっきりしねーよ

950 :NAME IS NULL:2021/03/14(日) 13:20:30.16 ID:r8cV92Rv.net
本人がどう質問しているのかよく読みましょう。

951 :NAME IS NULL:2021/03/14(日) 15:07:40.16 ID:???.net
関数の意味でルーチンって言ってるのかもね

952 :NAME IS NULL:2021/03/14(日) 15:40:44.22 ID:???.net
Oracleは独自拡張でWITH句で関数定義できるからそのこと言ってるんじゃないの?
じゃなければ間違ったWITH句の使い方

953 :NAME IS NULL:2021/03/14(日) 15:58:09.44 ID:???.net
これだからオラクルユーザーはw

954 :NAME IS NULL:2021/03/14(日) 16:39:09.16 ID:???.net
その手のは言ったもん勝ちだな。

これだからOracleユーザーはw
これだからSQLServerユーザーはw
これだからMySQLユーザーはw

言われにくいのはPostgresくらいかな。

955 :NAME IS NULL:2021/03/14(日) 17:22:39.59 ID:???.net
>>954
まーた文脈読めないレスしやがって
これだからAccessユーザーはww

956 :NAME IS NULL:2021/03/14(日) 17:50:46.58 ID:???.net
これだから他DBMSユーザーを貶すことしかできない奴はw

957 :NAME IS NULL:2021/03/14(日) 17:54:36.87 ID:???.net
>>935
RDBMS製品としてのOracleがレガシー化してるという話ではなく
Oracleを使い続けてるような組織や技術者がレガシー化してる(もしくはレガシー化しやすい)という話でしょ

当てはまらない会社がないわけではないけど傾向としては思い当たる節がかなりある

958 :NAME IS NULL:2021/03/14(日) 17:59:49.51 ID:???.net
OracleでSQL覚えたため、そのあと外部結合の書き方で苦労した

959 :NAME IS NULL:2021/03/14(日) 18:13:58.58 ID:???.net
わかる
(+)の書き方に慣れちゃった 結合条件は全てWHEREにないと落ち着かない

960 :NAME IS NULL:2021/03/14(日) 18:59:49.73 ID:???.net
組織や技術者のレガシー化ってまた意味がよくわからん雰囲気ワードだな。
具体的にはどういう状態のことを言っているんだろう。

961 :NAME IS NULL:2021/03/14(日) 19:06:53.31 ID:GjReX37m.net
>>959
それOracleだけじゃなくて、他のRDBMSでもその構文は使える。

標準SQLの方がよい構文はそちらがスタンダードになっているだけ。

ここは本当に中高年しかいないなw

962 :NAME IS NULL:2021/03/14(日) 19:19:55.84 ID:???.net
>>958
MySQLで覚えてたらもっと酷いことになってた

963 :NAME IS NULL:2021/03/14(日) 19:29:53.11 ID:???.net
(+)構文がオラクル以外でも使えるって初耳だが
ググってもそれらしい情報出てこんし

964 :NAME IS NULL:2021/03/14(日) 20:10:07.13 ID:???.net
少なくともSQL-Serverではdocsには載ってないから使えないと思う
秘密のコマンドでOracle互換モードとかあるのかも知れんがw

965 :NAME IS NULL:2021/03/14(日) 20:22:16.65 ID:r8cV92Rv.net
>>963
PostgreSQL、Db2など。

そもそもどの製品も独特な外部結合構文を持っていて、Oracle Databaseだけが独特なのではない。

966 :NAME IS NULL:2021/03/14(日) 20:47:53.70 ID:???.net
そういう話じゃないと思うが・・・

967 :NAME IS NULL:2021/03/14(日) 21:12:24.04 ID:???.net
>>960
>Web周りの技術力ってISSとWebSphereとOASのどれが優れているかとかいう議論ならわかるが、

↑これがレガシー化
自覚がない本人かもしれんが

968 :NAME IS NULL:2021/03/14(日) 21:31:09.20 ID:???.net
相当なルサンチマンを抱えてるんだろうなw

969 :NAME IS NULL:2021/03/14(日) 22:53:26.21 ID:???.net
レガシー化というのは時代の変化や環境の変化に対応できなくなってること

旧式化して時代遅れになってると言ってもいいが
簡単にはリプレースできないしがらみや機能や考え方が硬直的というニュアンスも含む
逆に硬直性の無いものはレガシーとは言わない

人に対して使う場合は時代遅れと老害を足して2で割ったものと思っておけばいい

970 :NAME IS NULL:2021/03/14(日) 23:12:19.06 ID:???.net
普段言われている奴が使いたがる用語

971 :NAME IS NULL:2021/03/15(月) 00:56:53.79 ID:???.net
943です、皆さん回答ありがとうございます
やりたかったのは、食品の販売だとすると、
イチゴや大根の商品コードを対して、果物や野菜、といった分類をCASE式でつけたいのですが、20行程度のSQLの冒頭に数十行のselect句があると頭でっかちに感じた次第です。

972 :NAME IS NULL:2021/03/15(月) 01:03:00.08 ID:???.net
>>971
例えばイチゴの場合に果物か野菜かの判定をSQL文の中で行わせたいって事か?

973 :NAME IS NULL:2021/03/15(月) 01:19:12.21 ID:???.net
>>971
それは商品コードを管理するマスタに分類を持たすとか、判断用のビュー作とかするのが普通じゃないかと思うんだが
まあ、設計はスレ違いではあるが、設計見直すべきだと

974 :NAME IS NULL:2021/03/15(月) 07:31:16.03 ID:???.net
>>936
おおっ!

975 :NAME IS NULL:2021/03/15(月) 08:22:46.90 ID:???.net
>>973
>>管理用のビュー
943です。ビューならいじりやすいですね。20年前にソフト屋さんに作って貰った販売管理で、データ取得用のビューがあります。ただ上のコード分類とて30か50個の商品コードのことです。規模が小さいのにオラクルなので他のソフト屋さんに驚かれます。

976 :NAME IS NULL:2021/03/15(月) 10:11:02.70 ID:8bMPGxFo.net
>>975
20年前ならOracleかSQL Serverの二択ですからね。

977 :NAME IS NULL:2021/03/15(月) 11:41:58.64 ID:???.net
普通にPostgreSQLやMySQLも使われてただろ

978 :NAME IS NULL:2021/03/15(月) 11:42:41.74 ID:8bMPGxFo.net
普通w

979 :NAME IS NULL:2021/03/15(月) 12:09:48.61 ID:???.net
SQL SERVERですが decimalの最大桁数(Permission)とバイト数について
1 - 9桁 5バイト
10 - 19桁 9バイト
20 - 28桁 13バイト
29 - 38桁 17バイト
となってると思いますがデータの桁数が多少変動し不明確な場合、
極論各バイト数の最大(9桁、19桁、28桁、38桁)をとっておけば、
実際の桁数少なくてもバイト数も変わらないし無駄はないかなと思っているのですが、この考え合っていますでしょうか?
皆さんどうされていますか?

980 :NAME IS NULL:2021/03/15(月) 15:35:38.96 ID:???.net
>>971
それはCASE式じゃなく分類コードを管理するテーブルを作るべきケース
行と列の縦横変換はPIVOTとかの関数を使う

分類が変化しそうにもないなら既存の商品テーブルに分類コードのカラムを追加するのが望ましいが
なんらかの事情でそれが難しいようなら商品コードと分類コードの紐付きを管理するだけの別テーブルを作るのでも構わない

981 :NAME IS NULL:2021/03/15(月) 15:49:14.81 ID:???.net
>>979
バイト数以外で最大有効桁数を制限しておきたい理由がなければその方針でいいんじゃない
とりあえず9桁にしておくってみたいなケースはよくあるよ

PermissionじゃなくPrecisionね

982 :NAME IS NULL:2021/03/15(月) 20:32:28.15 ID:8bMPGxFo.net
>>979
桁数は大きくしておいて、どうしても小さくしたいのなら、あとから変えればいいだけ。

983 :NAME IS NULL:2021/03/15(月) 20:35:28.41 ID:8bMPGxFo.net
日本円の金額項目なら、9桁は小さいから、よく考えた方がいい。

984 :NAME IS NULL:2021/03/16(火) 23:50:58.51 ID:???.net
MAXが1億って、比較的小さい規模の企業ではないかな
個人商店でも溢れそうな気がする

985 :NAME IS NULL:2021/03/17(水) 00:24:46.52 ID:???.net
仮に金額入れるとしても9桁で十分なユースケースはいくらでもあるだろう
smallmoneyとか何のためにあると思ってるんだ?

それに9桁ならMAXは約10億だぞ
大丈夫か?

986 :NAME IS NULL:2021/03/17(水) 11:07:02.06 ID:5VYW3mpQ.net
間違ってますよ

987 :NAME IS NULL:2021/03/17(水) 11:08:02.26 ID:5VYW3mpQ.net
約10億という言い方が馬鹿っぽい

988 :NAME IS NULL:2021/03/17(水) 11:21:48.74 ID:???.net
>>987
また恥ずかしいレスしちゃったねw

989 :NAME IS NULL:2021/03/17(水) 12:02:24.73 ID:5VYW3mpQ.net
おちんちんが小さくて恥ずかしいです。

990 :NAME IS NULL:2021/03/17(水) 18:23:25.88 ID:???.net
馬鹿っぽいと言っておけば
自分の馬鹿さを隠せるとでも思ったのか

991 :NAME IS NULL:2021/03/17(水) 18:56:12.21 ID:5VYW3mpQ.net
仕事の会話だったら、普通は9億いくつという言い方をする。約10億だと10億以上もあるということになり、認識がずれてしまう。

992 :NAME IS NULL:2021/03/17(水) 19:44:25.72 ID:???.net
スレが活発になって嬉しいw

993 :NAME IS NULL:2021/03/17(水) 21:23:38.42 ID:???.net
桁数の話してるんだから普通の人は約10億で最大九億九千九百九十九万九千九百九十九ってわかると思うんだが…

994 :NAME IS NULL:2021/03/17(水) 21:49:39.92 ID:5VYW3mpQ.net


995 :NAME IS NULL:2021/03/17(水) 21:50:17.62 ID:5VYW3mpQ.net
中学校からやり直しですね。

996 :NAME IS NULL:2021/03/17(水) 21:51:05.93 ID:5VYW3mpQ.net
正確には小学校からだった。

997 :NAME IS NULL:2021/03/17(水) 21:58:14.11 ID:???.net
毎度赤っ恥かく原因はクソみたいなマウンティング精神にあることを気付こうな
いい年してそれじゃヤバいで

998 :NAME IS NULL:2021/03/17(水) 22:39:56.28 ID:5VYW3mpQ.net
やばいですね。

999 :NAME IS NULL:2021/03/22(月) 23:31:39.87 ID:???.net
with句とfromのサブクエリ、皆さんどのように使い分けていますか?

1000 :NAME IS NULL:2021/03/23(火) 14:44:47.25 ID:/NGqi0As.net
>>999
基本的には前者にしておく。

1001 :NAME IS NULL:2021/03/23(火) 20:51:04.53 ID:???.net
ほかが戸惑わないようにサブクエリ

1002 :NAME IS NULL:2021/03/23(火) 21:06:13.65 ID:???.net
999

1003 :NAME IS NULL:2021/03/23(火) 21:44:51.12 ID:/NGqi0As.net
WITH句は徐々に浸透しているから、WITH句を使わない決まりがないなら、WITH句はどんどん使うべき。

1004 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1004
257 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver.24052200