X



トップページDB@2ch掲示板
1002コメント316KB
SQL質疑応答スレ 19問目
レス数が1000を超えています。これ以上書き込みはできません。
0001NAME IS NULL垢版2019/05/23(木) 20:25:40.60ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:
SQL質疑応答スレ 18問目
https://mevius.5ch.net/test/read.cgi/db/1515071542/
0002NAME IS NULL垢版2019/05/23(木) 20:29:13.07ID:???
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/
0003NAME IS NULL垢版2019/05/23(木) 20:31:43.25ID:???
過去スレ
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/
0004NAME IS NULL垢版2019/05/23(木) 20:34:29.61ID:???
よくある質問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
;
0005NAME IS NULL垢版2019/05/23(木) 20:36:39.27ID:???
よくある質問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
;
0006NAME IS NULL垢版2019/05/23(木) 20:40:07.78ID:???
よくある質問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によって文法がかなり違うので注意
0007NAME IS NULL垢版2019/05/23(木) 20:41:16.91ID:???
よくある質問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
0008NAME IS NULL垢版2019/05/23(木) 20:43:39.42ID:???
よくある質問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ならこれを適当に改変すれば動きますが
 どのみちお奨めしません。
0010NAME IS NULL垢版2019/05/25(土) 01:14:38.34ID:1nV7ZQjK
空文字列を入れたがるやつにかぎって、レコードによっては空文字列だったり、NULLだったりと両方想定してないといけない設計にして、運用ではまる。
0011NAME IS NULL垢版2019/05/25(土) 01:39:12.17ID:???
苦労しているんだね
同情します
0012NAME IS NULL垢版2019/05/25(土) 06:44:36.96ID:LBGwosS9
SQLじゃなくてテーブル設計の質問なんですが、お願いします。

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

という風にするべきなのでしょうか?
最初の設計だとカラムが増えていくのに対して、この方法だとレコードがとんでもない数になっていくのですが・・・・
0013NAME IS NULL垢版2019/05/25(土) 07:25:57.81ID:???
毎回思うけどレコード増えてなにが困るん?
0014NAME IS NULL垢版2019/05/25(土) 07:54:17.35ID:???
>>13
@もともと1レコードに収まっていたデータを多数のレコードに分割すると、読み取りのパフォーマンスは落ちないでしょうか?
A副作用ですが、正規化することで、正規化前と比べてテーブル数が増える(20倍程度)と、結合で速度が落ちないか?
という点が不安です。
0015NAME IS NULL垢版2019/05/25(土) 08:54:05.38ID:???
>>12
倉庫が増えたら項目増やさないといけなくなるのと
倉庫ごとに数量、単価、金額もちたくなるとさらに項目が増える

もとのデータは下のテーブル形式で、夜間処理で照会用の中間テーブルとして上のテーブルをつくればいい
0016NAME IS NULL垢版2019/05/25(土) 10:08:56.32ID:???
>>15
おっしゃる通りです。経験のなさから、そこまで考えが及びませんでした。
まずは第三正規形に正規化した状態でのパフォーマンス確認からしてみます。
0017NAME IS NULL垢版2019/05/25(土) 11:34:00.50ID:???
>>12
その商品、特定倉庫1ヶ所にしまうのかい?
0019NAME IS NULL垢版2019/05/25(土) 13:46:20.37ID:Z+RZPCej
縦横問題はRDBができて以来定番の課題&質問になってるな
PIVOTとかも使いにくいしいい加減DBMS側でうまいことしてほしいところ
0020NAME IS NULL垢版2019/05/26(日) 00:42:51.61ID:???
今なら
「ラクテンスーパーポイントスクリーン」
登録するだけでRポイント150pが貰える!

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

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

完了

祭りだ♪ヽ('∀')メ('∀')メ('∀')ノワッショイ
0021NAME IS NULL垢版2019/05/26(日) 03:38:10.70ID:2BWK9yiY
>>14
あなたは30年前からタイムマシンに乗ってやってきたのですか?
0023NAME IS NULL垢版2019/05/31(金) 19:07:06.33ID:???
たまには30年先から来た人に話を聞いてみたい
0024NAME IS NULL垢版2019/05/31(金) 23:38:45.60ID:5a1yvLIB
>>23
過去には行けるが未来には行けない。これが現代の常識。
0026NAME IS NULL垢版2019/06/01(土) 00:31:01.74ID:bltHuGZw
>>25
逆にだった。時間の流れが遅いところにいると、時間の流れが速いところに戻ったときに未来にたどりつく。
0027NAME IS NULL垢版2019/06/01(土) 01:34:20.85ID:???
現在から過去に行けるなら、未来人が現在に来ることは可能だな

現代の常識だとそうなる
0028NAME IS NULL垢版2019/06/02(日) 23:01:40.17ID:???
ここSQLスレじゃなくなったん?
0030NAME IS NULL垢版2019/07/13(土) 19:26:52.20ID:AJIqdE5u
今更だが、SQLの正しい記述ってのはあるのか?
0031NAME IS NULL垢版2019/07/13(土) 20:51:42.24ID:???
今更だが、正しさとはなんだ?
0035NAME IS NULL垢版2019/07/14(日) 08:50:25.15ID:KDHP+Bri
>>34
はい。
0037NAME IS NULL垢版2019/07/29(月) 21:32:16.54ID:???
点数テーブル
名前 日付 点数
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していて複雑なので、文も大分長くなってますしこれでいいのか不安になってます
0038NAME IS NULL垢版2019/07/29(月) 21:38:08.33ID:???
普通にleftjoinして加算すれば
0039NAME IS NULL垢版2019/07/29(月) 21:48:46.85ID:???
ありがとうございます!
+で繋げたら普通に足し算できたんですね・・・お恥ずかしい
ゲタのほうに該当がなかった場合点数+NULLみたいにならないか不安ですが試してみます!
0040NAME IS NULL垢版2019/07/30(火) 00:01:05.07ID:???
COALESCEなりCASEなりでNULLを0にすればいいんでない?
0042NAME IS NULL垢版2019/07/31(水) 22:15:14.94ID:???
37の意図する事が今一分からないだが、
単純に点数テーブルとゲタテーブルをマージして
Group by して sum取っちゃ拙いのか?

MySQLだとこんな具合で
select `名前`,`日付`,sum(`点数`) from (
select `名前`,`日付`,`点数` from `点数テーブル`
union
select `名前`,`日付`,`点数` from `ゲタテーブル`
) g
group by `名前`,`日付`;
0043NAME IS NULL垢版2019/07/31(水) 22:32:34.75ID:???
>>37がやってるってのがそれだろ。
しかも>>37は正しくunion all使ってるのにお前は間違えてるし。
0045NAME IS NULL垢版2019/08/01(木) 08:09:51.16ID:???
まあunionでもいいと思うが万が一ゲタ側のレコードに対応するレコードが点数テーブルにない時もレコード出力されちゃうから俺ならleft joinでやると思う
0046NAME IS NULL垢版2019/08/01(木) 20:10:22.24ID:???
>>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 人, 日, 点
)

見づらく恐縮なのですが、よろしくお願いします
0047NAME IS NULL垢版2019/08/01(木) 22:23:33.88ID:???
2番目のgroup by はやばい.
正誤で言えば、1番目が正しい
0049NAME IS NULL垢版2019/08/02(金) 09:43:54.13ID:???
ありがとうございます!
確かにAはおかしかったですね・・・
@のほうで書いてみたいと思います
ありがとうございました!
0050NAME IS NULL垢版2019/08/02(金) 22:05:00.81ID:???
サブクエリする必要はないけど
Aも別に間違いじゃないけどな
SELECT 人, 日, 点+SUM(ゲタ)
  FROM 点T
  LEFT JOIN ゲタT
  ON 点T.人 = ゲタT.人
  AND 点T.日 = ゲタT.日
  GROUP BY 人, 日, 点
0051sage垢版2019/08/03(土) 13:02:52.10ID:wjgyF6r3
>>47
なにがやばくてどう間違ってるのか詳しく

どう書いてもまあいいんだが、気になるなら実際のテーブル(インデックス)構成と件数で実行計画取ってみれ
0052NAME IS NULL垢版2019/09/01(日) 09:35:29.97ID:???
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のところに入れる方法をお願いします。
0053NAME IS NULL垢版2019/09/01(日) 16:47:32.11ID:???
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
;
005452垢版2019/09/01(日) 17:52:32.35ID:???
>>53
大変ありがとうございました。
使わせていただきます。
0055NAME IS NULL垢版2019/09/20(金) 14:25:08.89ID:???
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
0056NAME IS NULL垢版2019/09/20(金) 16:17:33.29ID:???
HAVING使うぐらいか?

SELECT * FROM xxx WHERE name IN
(
SELECT name FROM xxx GROUP BY name HAVING 1<COUNT(*)
)
ORDER BY name, datetime
0057NAME IS NULL垢版2019/09/20(金) 16:43:23.46ID:???
>>56
出来ました!
group by はhaving でしたね。
ありがとうございました。
0058NAME IS NULL垢版2019/09/20(金) 18:25:52.08ID:???
こんなんでいいだろ

select *
from xxx T1
where exists (
  select *
  from xxx T2
  where T1.name = T2.name
  and T1.datetime <> T2.datetime
)
0060NAME IS NULL垢版2019/09/21(土) 17:16:57.39ID:???
テーブルのレコード数が多くてnameのカーディナリティも十分高いなら
一般には>>56より>>58の方が良いだろ。
0061NAME IS NULL垢版2019/09/21(土) 19:24:27.30ID:8nH6piRt
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
の方が速いかも
0062NAME IS NULL垢版2019/09/21(土) 20:59:51.16ID:???
日時が同じデータはありえないという条件をいわれてないなら
普通はこんなsqlはかけないわw
0063NAME IS NULL垢版2019/09/21(土) 21:17:13.99ID:???
> nameとdatetime で主キーとしています。
0064NAME IS NULL垢版2019/09/21(土) 21:52:58.94ID:???
>>61
環境によるから実際に実行計画をみてみなきゃ確実なことは言えないのはその通りだけど、
そのsqlはサブクエリでfull scan 1回、外側で1回、nameのカーディナリティが高ければ
中間データも大きくなり、しかもJOINにインデックスが使われないときているから、
メモリに入りきらないようなテーブルの場合は極端に遅くなりそう。
0065NAME IS NULL垢版2019/09/21(土) 22:28:07.41ID:???
nameのカーディナリティが高い場合、>>56>>61では中間データが大きくなり
メモリに乗り切らないことが考えられ、>>58のほうが速い可能性がある。

nameのカーディナリティが低い場合、>>58ではexistsの条件に早くひっかかる
可能性が大きくなり、やはり>>58のほうが速い可能性がある。
0066NAME IS NULL垢版2019/09/21(土) 22:58:15.28ID:???
>>58は相関サブクエリにインデックスが使われ、datetimeの比較は2エントリ目で
必ず判断がつくから、実のところ速度はカーディナリティにあまり影響されない。
0067NAME IS NULL垢版2019/09/22(日) 04:36:57.50ID:???
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や環境、実際のデータ、インデックスの追加で変わると思う。
0068NAME IS NULL垢版2019/09/22(日) 11:03:21.51ID:oC+qLfZI
>>67
素晴らしい。結局最初のであまり問題ないね
最近はよっぽど遅い場合を除いて
意図が分かるように書くのがいい感じよね
0069NAME IS NULL垢版2019/10/01(火) 22:47:53.79ID:yfemt3Lz
すいません
教えてください…
カラムは2つです(アクセスログです)
IP
CGI

複数種類あるCGIに対してどのCGIに
このIPからは何回、このIPからは何回アクセスされたというのを集計したいのですが
SQLが思いつきません…
だれか教えてください…
0070NAME IS NULL垢版2019/10/01(火) 23:20:09.22ID:???
>>69
一旦各CGIがLogに出力して
日替わりや週替わり月替わりで集計したらどうか
0071NAME IS NULL垢版2019/10/02(水) 09:28:22.87ID:???
>>69  select CGI,IP,count(*) from テーブル group by CGI,IP;
0072NAME IS NULL垢版2019/10/07(月) 18:48:19.40ID:???
Windowsでデータベースを使いたく、今xamppをインストールして、PHPから学んでる最中なのですが、
mySQL(実際はMariaDB)で作ろうと考えていたのですが、私の目的のデータベースが作れるのか、調べてもなかなか出てこなくて、
ひょっとすると、リレーショナルデータベースでは出来ないのでは?と薄く疑問に思ってるのですが、、以下のデータベースを作ることは可能でしょうか?

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

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

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

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

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

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

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

accessをちょっと齧った程度の感覚ではできそうな気がするのですが
0074NAME IS NULL垢版2019/10/07(月) 22:08:37.13ID:nrBGAukj
>>72
そういうことをするためにリレーショナルデータベースは存在します。
0075NAME IS NULL垢版2019/10/08(火) 00:01:01.76ID:???
>>73>>74
ありがとうございます
安心して勉強続けます
0076NAME IS NULL垢版2019/10/08(火) 00:10:43.96ID:???
得意とか苦手とか、心の内面的な部分はどうSQLにしたら良いだろうね
0077NAME IS NULL垢版2019/10/08(火) 08:53:23.09ID:???
その人の平均スコアより何%以上良ければそのコースは得意とか、そんなんじゃね?
0078NAME IS NULL垢版2019/10/08(火) 20:09:49.20ID:???
数字のことはよく知らないけど、そういうのは平均値より偏差値が良いんじゃないの?
0079NAME IS NULL垢版2019/10/08(火) 21:08:15.53ID:1lB5cEuR
なぜ仕様の話になるのか?
0080NAME IS NULL垢版2019/10/13(日) 17:00:31.98ID:???
宿泊人数を日毎に集計したい。
テーブル構成は、
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が考えられますか?
0081NAME IS NULL垢版2019/10/13(日) 18:53:50.12ID:???
>>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
0083NAME IS NULL垢版2019/10/27(日) 15:00:48.42ID:???
以下の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)  



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

 
0084NAME IS NULL垢版2019/10/28(月) 00:43:36.69ID:6SIOZDZ3
>>83
解釈としてはxとyの突き合わせだが
DBMSによってどう最適化するかは異なるから
実際は実行計画を見てみるしかない。
そのサイトの裏側が何だかわからないので手元で実行計画を見てみるといい
https://www.atmarkit.co.jp/ait/articles/0408/25/news101.html
0085NAME IS NULL垢版2019/10/31(木) 02:56:13.58ID:taiLajBl
>>83
簡潔に指摘するとALL句の意味を取り違えています。

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

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

あなたが考えた処理方法では、@はともかくA〜Dを行っていまうと、最大の国だけでなく、同じ大陸の他のレコードまで取得してしまいます。
0086NAME IS NULL垢版2019/11/09(土) 06:00:59.81ID:???
table1 親品番,子品番
table2 品番,品名

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

table1,2のjoinでON句に親品番=品番や子品番=品番とすると片方ずつは取得できますが、両方同時に取得することはできますか?
0087NAME IS NULL垢版2019/11/09(土) 08:41:59.09ID:???
table1ひとつにtabl2をふたつJOINしてやればいいんだよ
0088NAME IS NULL垢版2019/11/09(土) 10:19:33.50ID:???
>>87
ありがとうございます
週明けに試してみます
0089NAME IS NULL垢版2019/11/09(土) 11:12:26.19ID:af/bSZEC
いかにも初心者らしい質問ですね
0090NAME IS NULL垢版2019/12/24(火) 16:02:18.63ID:???
SQL Server 2014です。

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

どうすればいいのでしょうか?(´・ω・`)
0091NAME IS NULL垢版2019/12/24(火) 20:19:09.24ID:joe7BHe1
>>90
おそらく半角の濁点、半濁点が無視さらているのでしょう。

まずは自分が見ている濁点、半濁点の文字コードを調べてください。
0092NAME IS NULL垢版2019/12/24(火) 20:55:24.36ID:???
照合順序なにでやってだめだったんだよ
バイナリ系のやつならいける気がするけど
0093NAME IS NULL垢版2019/12/24(火) 21:29:38.72ID:joe7BHe1
キャラクタセットも自分で調べないようでは話にならない。
0094NAME IS NULL垢版2019/12/24(火) 21:31:04.18ID:joe7BHe1
条件が半角カタカナ文字だったらどうなるのか書いてくれよ。

エスパーじゃないからわかんねえよ!
0095NAME IS NULL垢版2019/12/24(火) 22:30:40.39ID:???
many to manyって中間テーブルつかわなあらわせないの?
0096NAME IS NULL垢版2019/12/24(火) 22:37:11.00ID:???
べつに中間じゃなくてもいいよ。
0098NAME IS NULL垢版2019/12/25(水) 08:01:52.36ID:???
create table T (
a,
b,
unique(a, b)
)

これがaとbのmany to many
0099NAME IS NULL垢版2019/12/25(水) 09:58:53.56ID:???
>>92
ありがとうございます。
照合順序で、てっきりCS・AS・KS・WSしか頭に入ってませんでした。
BINで判別できました。
0100NAME IS NULL垢版2019/12/25(水) 10:09:08.06ID:H+1gr7tn
マイク製品は大文字、小文字、全角、半角文字を同じのみなすからなあ。

変な仕様だけど、SQL Serverの照合順序を変えることが、SQLの質問なのか?
0103NAME IS NULL垢版2019/12/25(水) 22:35:06.89ID:H+1gr7tn
>>102
複合列の一意制約の構文だろうけど、どのRDBMSかは俺もわからない。
0104NAME IS NULL垢版2019/12/25(水) 22:48:21.03ID:???
どのって、ふつうに標準SQLでしょ。
0105NAME IS NULL垢版2019/12/26(木) 04:09:32.90ID:???
>>98は、見方によってはaとbの中間テーブルだがな
0106NAME IS NULL垢版2019/12/26(木) 09:54:56.49ID:???
aとbの中間ってなんだそれ
0107NAME IS NULL垢版2019/12/26(木) 15:59:01.34ID:z/i15tE2
>>106
服のうえから触るんじゃないの?
0108NAME IS NULL垢版2019/12/26(木) 20:15:51.39ID:???
触るか触られないぎりぎりが良いの
0109NAME IS NULL垢版2019/12/31(火) 18:20:49.42ID:???
ものすごく初歩的な質問すいません。

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

また、このようなスキルを身に付けるにあたって、分かりやすい参考書のような書籍などありますでしょうか?
0111NAME IS NULL垢版2019/12/31(火) 19:08:31.03ID:???
一気に書き換えるってことは
DeleteしてInsertかな?
ODBC接続してSQL発行すれば良いのでは
0112NAME IS NULL垢版2019/12/31(火) 19:30:30.84ID:0OK2Hg3S
>>109
古いExcel VBAの逆引き本に書かれている。ただ、正解はないのでどれが最適なのかは深く考えないこと。
0113NAME IS NULL垢版2019/12/31(火) 21:08:53.58ID:???
>>110->>112
レスありがとうございます。

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

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

質問ばかりですいません。
よろしくお願いします。
0114NAME IS NULL垢版2019/12/31(火) 21:23:28.95ID:???
>>113
そのID/PASSがテーブルを更新する権限があるかどうかが問題
てか、マジでそのデータベース管理してる人にそんなことして良いのか確認しなよ
ヘタこいてデータぶっ壊しましたテヘペロ
で済むならいいけど
0115NAME IS NULL垢版2019/12/31(火) 22:34:09.63ID:???
普通DBの参照権限は貰えても更新権限は与えないよね。
0116NAME IS NULL垢版2019/12/31(火) 22:46:40.05ID:???
そうだね
Excelで扱うデータを引っ張るような業務レベルだと
テーブル更新権限までは持たせないと思う
0117113垢版2020/01/01(水) 00:19:05.18ID:???
>>114->>116
そうですか…
せっかくスキルを身に着けたとしても、更新権限が付与されないのであれば意味がないですね。
おそらく管理者に確認しても、余計な事するな、となりそうなので

ただSQLの知識はあっても損はないので、買った本くらいは通読してみようかと思います。
0118NAME IS NULL垢版2020/01/01(水) 00:22:06.91ID:???
ぶっちゃけ、そのヤろうとしてることはクラッキングだからな
管理者の許可を得ず、データにアクセスして改竄
0119NAME IS NULL垢版2020/01/01(水) 10:09:37.97ID:???
家のPCでSQLSERVERとかPostgreSQLとか構築してみたら勉強になる
めっちゃ簡単だし
0120NAME IS NULL垢版2020/01/01(水) 14:10:53.11ID:mYS4vz8I
>>119
そんなことをしなくても、Excelシートをリレーショナルデータベースとして扱える。
0122NAME IS NULL垢版2020/01/01(水) 16:19:37.37ID:???
数百万レコード保存できるエクセルがあるそうです
0123NAME IS NULL垢版2020/01/01(水) 16:21:51.32ID:???
ネタで言っている様にしか聞こえないw
0124NAME IS NULL垢版2020/01/01(水) 16:33:58.73ID:mYS4vz8I
>>122
100万レコードなら可能
0125NAME IS NULL垢版2020/01/03(金) 23:02:49.24ID:???
unique cnstraintに引っかかるとエラーが帰ってくるの?
0127NAME IS NULL垢版2020/01/04(土) 18:42:45.71ID:???
このエラーをtry exceptで例外処理して重複するのを防ぎたいんだけど
commitしないとエラーがでなくて
毎回addする毎にcommitするしかないですか?
0128NAME IS NULL垢版2020/01/04(土) 18:47:13.70ID:???
既に存在する場合は登録しない様にすればいい
0129NAME IS NULL垢版2020/01/04(土) 22:30:42.23ID:???
>>127
普通はコミットするまでにエラーがでると思うが
使ってる言語かDBMSのスレで聞け
0130NAME IS NULL垢版2020/01/06(月) 02:30:42.66ID:pHBrkoE+
売上を記録するテーブルの設計について教えて下さい。

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

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

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


Aの場合、販売後に商品コードが変わると、販売時の商品名が分からなくなり、
Bの場合、販売後に商品名が変わると、販売時の商品コードが分からなくなるので、
@が一番いいのかな、と思うのですが、本当にそれでいいのでしょうか?
0131NAME IS NULL垢版2020/01/06(月) 06:10:26.40ID:???
普通1だし、商品名変わったら新しくID発行するだけで上書きはしないよね。
0132NAME IS NULL垢版2020/01/06(月) 07:02:36.84ID:???
普通は、商品コードと数量だろ?
(属性は足りないと思うけど)
0133NAME IS NULL垢版2020/01/06(月) 07:50:15.92ID:???
その要件なら@で仕方ないと思うが、商品名の追跡が必要なら商品名ごとの
サブコードを発行しておくという手もあると思う。
0134NAME IS NULL垢版2020/01/06(月) 07:56:03.30ID:nckEwU7J
何のために商品コードがあると思っているんだろうね。
0135NAME IS NULL垢版2020/01/06(月) 10:31:45.02ID:???
値段の変動するものなら、その時の時価を記録してないと訳分からなくなるかも
0136NAME IS NULL垢版2020/01/06(月) 11:54:17.21ID:nckEwU7J
SQLの話になってないぞ
0137NAME IS NULL垢版2020/01/06(月) 12:38:07.69ID:???
どちらかと言うとDB設計スレの方が良いような
0138NAME IS NULL垢版2020/01/13(月) 09:59:29.35ID:???
>>130
ずいぶん遅いレスだけど販売管理ならユーザーによって使い方が変わるからそういった点でも
できるだけ細かい情報を販売実績のテーブルに管理したほうがいいぞ
0139NAME IS NULL垢版2020/01/13(月) 12:58:42.68ID:CI1X7qA2
誰もがいつも表記の揺れのない正確な商品名を打てる世界を想定しなくはいけないのか?
0141NAME IS NULL垢版2020/01/13(月) 15:51:36.18ID:Atn/JdJk
商品コードがなんのためにあるのかわかってない
0142NAME IS NULL垢版2020/01/13(月) 16:22:19.97ID:???
DB設計スレに移動して続けたらどうかな
0143NAME IS NULL垢版2020/01/13(月) 17:43:27.66ID:???
データに全ての情報を埋め込むのは汎用機システム世代
リレーションシップデータベース世代になるとマスターに
できるのはできるだけマスター化する
しかし全てマスター化すると古いマスターもずっと残さないといけなくなりマスターが肥大化してしまうのでデータに埋め込んでおくのもいい場合がある
0144NAME IS NULL垢版2020/01/13(月) 17:58:21.31ID:???
リレーションシップデーターベース?
0145NAME IS NULL垢版2020/01/13(月) 17:59:57.49ID:???
リレーショナルデーターベースとしても意末は通らんけど
0147NAME IS NULL垢版2020/01/13(月) 18:23:32.38ID:???
>>130の商品コードと商品名が関数従属しないんならべつに@も非正規形ではないんだがな
0148NAME IS NULL垢版2020/01/13(月) 18:27:20.09ID:???
ユーザーによっては商品マスタを使いまわすところもあれば商品ごとにマスタを登録するところもある
商品はセール(値引き)以外にも返品なども行う事もおおいから単純にマスタを見て単価や名称を紐づけすればOKなんて考えは
販売管理作ったことのあるやつならナンセンスじゃね
請求書や領収書なんかも変わった商品名称や単価だすとかありえんしね
0149NAME IS NULL垢版2020/01/13(月) 22:41:38.01ID:CI1X7qA2
>>148
あんた商売の素人だな。
0150NAME IS NULL垢版2020/01/15(水) 12:47:01.58ID:???
テーブル設計の話題は 「DB設計を語るスレ」 でやってください
0151NAME IS NULL垢版2020/01/30(木) 21:52:02.55ID:???
中間テーブルってプライマリキー無くてもいいの?
0152NAME IS NULL垢版2020/01/30(木) 22:56:44.09ID:???
プライマリキーが無くてもいいテーブルがあるDBは設計が間違ってる。
0153NAME IS NULL垢版2020/01/30(木) 23:01:58.60ID:???
じゃ全部プライマリキーってことか?
0154NAME IS NULL垢版2020/01/30(木) 23:24:33.59ID:???
tempテーブルのこと言ってんでしょ?
それならプライマリキーなくても別に構わないよ
0155NAME IS NULL垢版2020/01/30(木) 23:40:21.73ID:???
なんだろうtempテーブルって
0156NAME IS NULL垢版2020/01/31(金) 00:03:03.86ID:???
えっ、temporaryテーブル(一時テーブル)のことだよ
0158NAME IS NULL垢版2020/01/31(金) 16:28:38.74ID:???
とりあえず設計スレ行けや
0159NAME IS NULL垢版2020/01/31(金) 17:26:58.13ID:???
SQLスレにいるのにテンポラリテーブルも知らないのかw
0160NAME IS NULL垢版2020/01/31(金) 20:09:31.65ID:???
SQLの仕様に、テンポラリテーブルってのが有るのか・・・
0162NAME IS NULL垢版2020/01/31(金) 21:01:53.10ID:???
ついでに名前が似てるテンポラルテーブルも
0163NAME IS NULL垢版2020/01/31(金) 22:18:08.62ID:???
tempテーブルってのも調べて
0164NAME IS NULL垢版2020/01/31(金) 22:20:53.04ID:???
一時テーブルという機能を持つDBMSはあるが、一時テーブルだとプライマリキーが要らない
理由なんてないよなぁ。
0166NAME IS NULL垢版2020/01/31(金) 22:47:29.44ID:KMY4HniK
意味的なプライマリキーと
DBMSのPRIMARY KEY制約がごっちゃになって話が混乱してるな
0167NAME IS NULL垢版2020/01/31(金) 23:16:32.21ID:???
>>164
逆に一時テーブルの機能を持たないRDBMSってあるのかい?
0168NAME IS NULL垢版2020/01/31(金) 23:32:01.21ID:???
Oracleは18cまでまともに使える一時テーブルがなかったのね
いろいろと納得
0169NAME IS NULL垢版2020/01/31(金) 23:42:42.95ID:???
最初は中間テーブルって話だったのにいつの間に温度テーブルの話にすり替わったのか
0171NAME IS NULL垢版2020/02/01(土) 00:57:00.65ID:5RS/C4xX
>>168
? 
0172NAME IS NULL垢版2020/02/01(土) 03:00:50.45ID:???
>>166
それが混同されたとしても一時テーブルは関係ないわ
0173NAME IS NULL垢版2020/02/01(土) 06:05:58.75ID:???
SQLのスレなんで、DBMSの実装機能の話は無いのかと思ってたが,そう言うことか
0174NAME IS NULL垢版2020/02/01(土) 11:34:27.47ID:???
テンポラリテーブルはSQL-92で定義されてる標準だぞ
各実装が従ってるわけではないけど
0175NAME IS NULL垢版2020/02/01(土) 11:55:38.86ID:???
おおっ!
そうなんだ
Thanks
0176NAME IS NULL垢版2020/02/03(月) 22:35:32.94ID:???
inner joinの前と後のテーブル入れ替えても同じ意味になりますか?
0177NAME IS NULL垢版2020/02/03(月) 23:28:10.97ID:???
>>176
同じ意味というのが
同じ結果セットが得られるかということならイエス
同じ実行プランが得られるかということなら必ずしもそうはならない
0178NAME IS NULL垢版2020/02/03(月) 23:35:53.56ID:???
あ、inner join on x.id <> y.id のように不等号とか使ったら結果セットも変わるわ
0179NAME IS NULL垢版2020/02/04(火) 00:12:57.04ID:???
二つのテーブルの内部結合なら不等号だろうが結果セットは変わらん気がするが
もちろん列指定ちゃんとやるって前提だが
0180NAME IS NULL垢版2020/02/04(火) 01:05:42.46ID:???
順序が変わると言うことかも
0181NAME IS NULL垢版2020/02/04(火) 07:18:28.20ID:???
順序は同じSQLですら変わっても文句言えない
0182NAME IS NULL垢版2020/02/04(火) 12:37:35.35ID:???
べつに文句を言っている訳ではないよ
順序に期待するならそこまで考慮しようねって事
0183NAME IS NULL垢版2020/02/04(火) 14:41:36.84ID:???
同じSQLですら結果の順序がどうなるかわからんのにinner joinの結合順で結果の順序とか言い出す奴って…
0185NAME IS NULL垢版2020/02/04(火) 20:08:46.55ID:8UrvhxBw
>>183
そういう基本的なことからわかってないのにデタラメを言うやつは年齢関係なくいるから困るよね。
0186NAME IS NULL垢版2020/02/04(火) 21:23:41.70ID:???
このスレでの話ならスルーしてれば何も困らないだろう
職場にいるんなら、それはお前がどうにかしろ
こんなとこで愚痴るなよ、鬱陶しい
0187NAME IS NULL垢版2020/02/04(火) 23:09:26.84ID:???
いきなり何イキってるんだ?
0188NAME IS NULL垢版2020/02/06(木) 22:17:53.87ID:???
2020みたいな西暦って
integerかstr かtimeのどれ型を使うのが一般的ですか?
0189NAME IS NULL垢版2020/02/06(木) 23:00:51.88ID:???
年しかいらないならintegerとかの整数値だろ
0190NAME IS NULL垢版2020/02/07(金) 00:58:43.19ID:???
そうすか ありがとうございました
int ならorder by できますからね
0191NAME IS NULL垢版2020/02/07(金) 01:01:13.05ID:???
time型も内部表現は数値だったと思う
0192NAME IS NULL垢版2020/02/07(金) 06:35:04.69ID:???
そういうことじゃないだろw
0194NAME IS NULL垢版2020/02/07(金) 12:34:08.57ID:???
>>188
最近はDate型にして月日には1月1日入れてる
0195NAME IS NULL垢版2020/02/07(金) 12:55:00.84ID:???
日付形式にすると日付ではない値は
セットできないのでデータ整合性が
保てる

日付形式で困るのは最大値だな
データベースによって違うから
日付数字8桁なら99999999とかに
すればいいけど
0196NAME IS NULL垢版2020/02/07(金) 13:02:34.28ID:???
西暦はゼロ年、1年の扱いの違いもちょっと困ることがある
0197NAME IS NULL垢版2020/02/07(金) 14:50:07.59ID:???
年だけをどのデータ型にするのがいいのかは
利用方法、DBMSの種類、件数、(もしあれば)規約などによる

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

個人的には年だけ表現したいのに関数使わずに見ると
2020/01/01って入ってるのは嫌なのでsmallintが第一候補
過去の西暦とか入力できる範囲も違うから必要ならチェック制約使う
0198NAME IS NULL垢版2020/02/07(金) 21:28:01.97ID:X04cMmok
いまどき数バイトでどうこう言うのか?
0199NAME IS NULL垢版2020/02/07(金) 23:11:41.16ID:???
1月2日とかが入るのを完全に排除できるならいいけど、それやるのにトリガとか使うくらいならintでいいよね。
0200NAME IS NULL垢版2020/02/08(土) 01:13:40.84ID:???
>>198
数バイトが積み重なってレコード長が大きくなればパフォーマンスが徐々に悪化するからね
0201NAME IS NULL垢版2020/02/08(土) 09:42:01.14ID:FADQTNtD
あっそう。
0202NAME IS NULL垢版2020/02/08(土) 10:38:57.81ID:???
日付形式は検索するとき数字形式より遅くなる場合が多い
日付形式を検索するとき関数を使う場合が多く関数ある分遅くなる
例えばこんな感じ
Where TO_CHAR(sale_date, 'YYYY-MM-DD') = '1970-01-01'

俺は月次単位でデータを作る事が多く検索で多く使うから
年月は数字6桁でインデックス貼ってるな
年月は他のテーブルと連結する時も多く使われるので
後で変更する場合非常に面倒なのでよく考えたほうがいい
日付形式はデータ作成日時とか更新日時のではよく使う
パフォーマンス問題を引き起こす日付型
https://use-the-index-luke.com/ja/sql/where-clause/obfuscation/dates
0203NAME IS NULL垢版2020/02/08(土) 11:21:26.54ID:???
日付型って内部は数値形式でしょう
比較したり順序を決めるのに文字列にする必要は無いんじゃないかな
0204NAME IS NULL垢版2020/02/08(土) 11:46:08.00ID:???
OracleにはSQL-92 DATEが無かったからそんな感じだったな。
0205NAME IS NULL垢版2020/02/08(土) 12:44:53.21ID:???
>>201
知らなかった感じ?
SQL使うだけなら知らなくていいけど
DB設計するなら基礎の基礎だから知っておくといいよ
0206NAME IS NULL垢版2020/02/08(土) 12:53:54.84ID:???
とりあえずここはSQLのスレであってDB設計スレではない
そのことをまず知っておこう
0207NAME IS NULL垢版2020/02/08(土) 14:20:32.42ID:FADQTNtD
>>202
どの製品のことを言っているのか?
0208NAME IS NULL垢版2020/02/08(土) 14:21:24.23ID:FADQTNtD
>>205
馬鹿にされた自覚がないのか?
0209NAME IS NULL垢版2020/02/08(土) 14:23:26.63ID:FADQTNtD
物理メモリもストレージ容量も大きいのに少しのことを大袈裟に言うやつは引退した方がいい。

ハードウェアの進化に知識が追いついていない。
0210NAME IS NULL垢版2020/02/08(土) 14:32:11.63ID:???
>Where TO_CHAR(sale_date, 'YYYY-MM-DD') = '1970-01-01'

こういうダメな例を書かないためには
SQL使うだけのやつもDB設計の基礎知らないといけないんじゃないか?
0211NAME IS NULL垢版2020/02/08(土) 14:37:55.61ID:???
自分の設計能力の低さをハード性能でカバーされてることに気づかないやつも引退したほうがいいけどな
0212NAME IS NULL垢版2020/02/08(土) 14:38:49.29ID:???
>Where TO_CHAR(sale_date, 'YYYY-MM-DD') = '1970-01-01'

確にこれは初心者
0213NAME IS NULL垢版2020/02/08(土) 14:43:36.83ID:1VUqo/WP
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のリファレンスを調べてもわかりませんでした・・・
0216NAME IS NULL垢版2020/02/08(土) 16:35:32.52ID:???
>取得した数字がレコードの数字より大きければ更新

取得した数字って書き方が悪いような
0217NAME IS NULL垢版2020/02/08(土) 16:50:58.57ID:???
>>209
>物理メモリもストレージ容量も大きいのに少しのことを大袈裟に言うやつは引退した方がいい。

性能要求が低くてスケールする必要のない小規模・オンプレならそういう認識でいいかもねw
0218NAME IS NULL垢版2020/02/08(土) 20:25:42.58ID:???
>>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がよさそうではある
0219NAME IS NULL垢版2020/02/08(土) 20:48:16.27ID:???
>>218
> ただそれならA≧Bがよさそうではある
価が変わらない時は更新しないような最適化はされるんだろうか?
0220NAME IS NULL垢版2020/02/08(土) 21:39:21.29ID:???
>>219
MySQLのUPDATEは値が同じならUPDATEは実行されない
0221NAME IS NULL垢版2020/02/08(土) 21:56:14.22ID:rnVBcNFe
同じ値で更新するかどうかは製品の同時実行制御方式による。


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

同じ値と異なる値で区別する方が実装が複雑になる。
0222NAME IS NULL垢版2020/02/09(日) 16:54:17.87ID:???
primary keyが被って他のカラムが違った場合そこをupdateするのってどうやります?
ついでに旧の値も保存したいです。
0223NAME IS NULL垢版2020/02/09(日) 17:02:29.95ID:???
primary keyが被るって、唯一無二のレコードじゃないのか?
0224NAME IS NULL垢版2020/02/09(日) 17:08:43.82ID:???
「そこ」を使用する場合一意に決められるように文を定義してください
0225NAME IS NULL垢版2020/02/09(日) 17:10:59.96ID:7YUFhOwr
>>222
その主キー列は代理キーではないということか?

主キー列の値がレコードを区別するだけのものでない場合は、テーブルの設計が誤っている。
0226NAME IS NULL垢版2020/02/09(日) 17:14:17.03ID:???
>>224
そこっていうのは非主キーのカラムです
0227NAME IS NULL垢版2020/02/09(日) 17:18:13.58ID:???
primary keyを指定してアップデートする
「そこ」とは、primary keyになる
旧の値を保存したいなら、
更新の履歴をとっておくようにする
0228NAME IS NULL垢版2020/02/09(日) 17:20:27.88ID:???
>>225
簡略化すると
商品というテーブルがあって
id(主キー)、名前、価格
というカラムで価格が変化するというような場合です
価格も主キーにするのがいいのですかね
0229NAME IS NULL垢版2020/02/09(日) 17:20:52.77ID:???
元の質問の理解が難しいが複合主キーの第一キーをprimary keyと言ってるのかね
0230NAME IS NULL垢版2020/02/09(日) 17:26:41.67ID:7YUFhOwr
>>228
なんでインサートで新しいレコードを作らないのですか?
0232NAME IS NULL垢版2020/02/09(日) 17:29:28.08ID:7YUFhOwr
設計の話がなぜかSQLの話にすり替わるのは初心者の特徴なのだろうか?
0233NAME IS NULL垢版2020/02/09(日) 17:31:06.13ID:???
リレーショナルデータベースの理論的な意味をすっ飛ばしてサロゲートキーあたりまえみたいな
教え方をするとこういうことになるといういい例。
0234NAME IS NULL垢版2020/02/09(日) 17:34:34.12ID:7YUFhOwr
>>233
よく読んだ?
0235NAME IS NULL垢版2020/02/09(日) 17:36:34.74ID:???
>>230
同じidが被るのは良くないかなと思いました

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


>>231
>>232
すいませんでした移動します
0236NAME IS NULL垢版2020/02/09(日) 17:36:53.35ID:7YUFhOwr
「primary keyが被って他のカラムが違った場合そこをupdateするのってどうやります?
ついでに旧の値も保存したいです。」

こんな狂った質問はスルーでよかった。申し訳ない。
0237NAME IS NULL垢版2020/02/09(日) 17:43:20.96ID:???
>>228
価格が変化すると言っても、商売の種類によって様々
生鮮食品を扱うとなればそれこそ日々変わるし
数年に一度価格見直しで一斉に変わるという業種もあるだろう
それによって設計も変わるし仕組みも変わる

相談したいなら、SQLの書き方を聞くスレではなく
DB設計の話題を扱うスレの方が相応しいと思うんだが
0238NAME IS NULL垢版2020/02/09(日) 18:00:13.65ID:???
どうしてもkey を変えたくないなら元情報用カラムをついかして元情報をそこに残すしかし複数の変更履歴残したいならば、変更用トランザクションデータを残して置けば変更履歴は追える
0239NAME IS NULL垢版2020/02/09(日) 18:53:18.53ID:???
テンポラルさんがスタンバってるよ
0240NAME IS NULL垢版2020/02/22(土) 22:26:47.17ID:???
他システムが出力したデータをoracleのnumber(3,16)型のカラムに格納しています

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

Oracleのsqlで、このカラムからnumber(3,3)の96.300の結果を得るにはどうすれば良いでしょうか?
アドバイスよろしくお願いします
0243NAME IS NULL垢版2020/02/23(日) 21:08:24.31ID:???
number(3,3)って、全体で3桁、うち小数点以下3桁じゃなかったっけ?
0244NAME IS NULL垢版2020/02/25(火) 13:35:36.81ID:???
>>240
NUMBER(整数+小数の桁数、小数の桁数)だぞ
左側が多くはず
number(3,16)型とかおかしい
0245NAME IS NULL垢版2020/02/25(火) 14:54:57.84ID:???
ぶっちゃけ分かりにくいよね
その桁指定方法

誰が考えたのか知らんけど
0246NAME IS NULL垢版2020/02/25(火) 17:40:42.07ID:???
FortranやCの出力フォーマット指定に準じているみたい

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

C
%4.2fの4は全体の桁数、2は小数点以下の桁数
0247NAME IS NULL垢版2020/02/25(火) 19:33:17.00ID:???
文章みればなんとなくわかるよね
まあわかってないのは質問者と>>240だけどw
0248NAME IS NULL垢版2020/02/26(水) 23:55:25.73ID:QqeJ9408
COBOLなんて最悪のわかりにくさだけどな。
0249NAME IS NULL垢版2020/02/27(木) 00:18:29.64ID:???
SQLとCOBOLって、殆ど同級生みたいなものだろう
0250NAME IS NULL垢版2020/02/27(木) 06:58:17.84ID:UItByFL3
>>249
まったく異なる
0251NAME IS NULL垢版2020/02/28(金) 22:13:19.38ID:???
>>249
どこがどう「同級生みたいな」もんなんだよ。
0252NAME IS NULL垢版2020/02/29(土) 03:02:30.76ID:???
SQL-86とCOBOL-85って殆ど同級生みたいなものだろう
って話じゃろうな
0253NAME IS NULL垢版2020/02/29(土) 10:59:20.17ID:???
流れトン切り、雑談的な質問で恐縮なんだが
みんなコードを学んでいく上で周囲の人が書いたコード見たりして学ぶのかな
なんとなく盗み見るようで気がひけるんだけど
名前出てるからこの人の参考になるなという人の時々見てるけど、こそこそやってて落ち着かない
モラルの点でどう思う?
0254NAME IS NULL垢版2020/02/29(土) 11:50:20.58ID:???
見れるところに置いてあるのなら、堂々と見れば良い
0255NAME IS NULL垢版2020/02/29(土) 13:48:05.06ID:???
わかった、ありがとう
そうする
0256NAME IS NULL垢版2020/03/02(月) 20:55:36.49ID:???
親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です
0257NAME IS NULL垢版2020/03/02(月) 21:31:35.40ID:???
(
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 テーブル
)
0258NAME IS NULL垢版2020/03/02(月) 21:50:57.19ID:rd6v8tKi
>>253
他人のものをよく見て、真似るのが基本中の基本。

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

これをずっとやらないとコピペプロクラマにしかなれない。
0260NAME IS NULL垢版2020/03/03(火) 19:50:42.41ID:???
p1 pn1 c1 cn1
p1 pn1 c2 cn2
p2 pn1 c5 cn5
p2 pn1 c6 cn6
p3 pn1 c3 cn3
p3 pn1 c4 cn4
だったらどう取りたいのかが少し気になったわ
必ず親の次に子をとるなら・・・
0261NAME IS NULL垢版2020/03/03(火) 23:28:53.47ID:???
親の次とか意味が分からんけど、それより
p1 pn1 c1 cn1
c1 cn1 p1 pn1
とかあったらどうするんだろね
0262NAME IS NULL垢版2020/03/04(水) 18:33:46.19ID:56J4i3Lh
そもそも >>256 は何を言っているのかまったくわからない。

親子とはなんなんだ?
0263NAME IS NULL垢版2020/03/04(水) 18:52:49.25ID:???
>現在、クエリで上記の形で取得できているのですが

これから推測するに、元となるテーブルが一つ、二つあって
それからクエリ使って2行の例を導いたと思われる
だとすれば、元となるテーブルデータと取得したクエリを公開すれば
質問に対する適切なアドバイスを得れると思うが、本人は既に解決済と見える
0264NAME IS NULL垢版2020/03/04(水) 23:13:48.31ID:???
>>256です
たしかに前提条件も詳細な情報もなく
ほかの人から見れば分からないことだらけですね すみません
だいたい>>263の通りですが、あまり時間が取れてなくて解決していませんでした

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

>>261
循環はないようなテーブルですが、それを規制するものはないため、
クエリ側で循環の対策が必要ですね
0265NAME IS NULL垢版2020/03/04(水) 23:27:22.00ID:???
親子とは商品で例えると、セット品のようなもので
子がいない(セット品ではない)ものは子品番がNULLになっています
複数テーブルですが、一つにまとめて簡素化したものが以下になります

https://ideone.com/VRo2S0

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

今までは普通にSampleテーブルのような形で取得し、
プログラム側で処理していたのですが、SQLでデータ整形ができるなら
(作り直している)プログラム側がスッキリするなと思いまして質問しました
0266NAME IS NULL垢版2020/03/04(水) 23:54:38.20ID:???
子が親になるケースもあるなら
unionした結果をID(と名前)でgroup byしてcase式使って集約

でもSQLで処理するとプログラム側で親子関係が見えなくなるから
1つの注文に対するデータ件数が十分少ないなら
SQLじゃなくプログラム側で処理したほうが柔軟性が高くていい気がする
0267NAME IS NULL垢版2020/03/05(木) 20:28:24.74ID:???
>>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
0268NAME IS NULL垢版2020/03/06(金) 03:37:51.75ID:23zUNF8S
いつもながらエスパーがいるね
0269NAME IS NULL垢版2020/03/07(土) 04:20:01.39ID:KvRjYJ+Z
DBMS名とバージョン
MySQL 5.6

テーブルデータ

shops
id | name
------------
1 | shopA
2 | shopB
3 | shopC
0270NAME IS NULL垢版2020/03/07(土) 04:20:22.33ID:KvRjYJ+Z
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です。

よろしくお願いします。
0271NAME IS NULL垢版2020/03/07(土) 07:36:24.25ID:???
SQLはりつけられなかったわ
結局typeはordersにしか情報がないなら
select type from orders group by type
でtypeテーブルを作る
それをshopsと直積で結合してその状態から
ratesとordersを結合して集計すればいいんじゃないの
existsは結合したordersのshop_idがnullなら0それ以外なら1
0272NAME IS NULL垢版2020/03/07(土) 09:01:41.05ID:???
>>267
1番目のselectでは同じ親品番が複数出てくるためDistinctを追加し、
union allの次のselectでは子品番のnullが出てくるためis not null を追加したところ
目的のデータが取得できました
ソートキーを入れる発想が思い浮かばなかったです
ありがとうございました
0273NAME IS NULL垢版2020/03/07(土) 11:04:48.35ID:???
なんか中継クラウドでチェックが入りインジェクションと見なされるみたい
ソースアップロードサイトに上げて、リンク張ればいいかも
0274NAME IS NULL垢版2020/03/07(土) 12:22:57.31ID:???
ここ最近Oracle使ってないから覚えてないけど
今回みたいなのはSQL1回でガチャガチャやるよりも
ストアドプロシジャで結果セット返すようにして
テンポラリテーブル作る
親データINSERT
子データINSERT
ソートして結果を返すってやったほうが自分はいいとおもってるけどね

269もtype欲しさに受注データをgroupbyとかほんとはやりたくないわ
ABしかないならそれ用のテンポラリテーブル作って結果を返すストアド作ったほうがいい気がする
0275NAME IS NULL垢版2020/03/07(土) 20:27:09.43ID:AGFNapIR
SQL Serverでは安易にできるけど
MySQLってストアドで結果セット簡単に返せたっけ?
Oracleはメッチャ大変だった記憶
0277NAME IS NULL垢版2020/03/08(日) 12:55:14.35ID:56DADZoB
>>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
0278NAME IS NULL垢版2020/03/08(日) 13:04:30.24ID:???
>>277
ordersに入っていないshop名をshopsから取得すればできるんじゃないか
0279NAME IS NULL垢版2020/03/08(日) 13:08:35.25ID:???
こんな応用も考えられないやつがSQL使うんだな
業務のSQLだったら恐ろしいわ
0280NAME IS NULL垢版2020/03/08(日) 14:23:53.68ID:56DADZoB
>>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で集計する単位を決めているんですね。
勉強になりました。
0281NAME IS NULL垢版2020/03/08(日) 20:54:18.94ID:pHcaE5Qh
自作自演か
0282NAME IS NULL垢版2020/03/09(月) 21:48:51.86ID:???
>>280
>inner join (select distinct shop_id from orders) as shop_ids
>この行は動きとしては cross join なんですね。

その通り
join/inner joinにonなどで条件を付与しなければcross joinになる
意図を伝えるためにはcross joinと書いたほうがよかったかもね
0283NAME IS NULL垢版2020/03/09(月) 22:53:19.06ID:???
onかかないinner joinって標準SQLで許可されてる?
0284NAME IS NULL垢版2020/03/10(火) 00:43:11.43ID:???
結合条件の指定がないってだけだから、許されると思う
0285NAME IS NULL垢版2020/03/10(火) 02:07:58.27ID:lOpoK0/l
MySQLとOracleのマニュアル見てみたら省略可能になってるけど
ISO/IEC 9075-2:1999だと省略マークないね
結構いろんなDBMSで直積使ったけどエラーになった覚えははないな
0286NAME IS NULL垢版2020/03/10(火) 12:45:16.22ID:qD23V5J3
>>285
SQLSERVERでエラーになったような
0287NAME IS NULL垢版2020/03/10(火) 21:57:15.59ID:JFVN1pud
ネタだから付き合う必要はないよ。彼の最近のトレンドは直積。書き込みをよく見れば直積に絡む話ばかりだとわかる。
0288NAME IS NULL垢版2020/03/11(水) 11:58:29.46ID:???
onが必要な場合
on 1=1
とすれば同じ
0289NAME IS NULL垢版2020/03/11(水) 17:09:43.87ID:ce0+fihR
>>287
270だけどはじめてここに来たよ。
とても助かって感謝している。
0290NAME IS NULL垢版2020/03/11(水) 17:31:53.56ID:???
感謝はいいけど
どういう風に理解してくれたかだよな
次に生かせないでまた質問するだけならもうやめたほうがいい
0291NAME IS NULL垢版2020/03/11(水) 19:46:33.41ID:???
また聞けばいいだけだろう
0292NAME IS NULL垢版2020/03/11(水) 22:19:53.94ID:???
>>290

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

それに対してケチつけることしかできないなら
君は人間をもうやめたほうがいい
0293NAME IS NULL垢版2020/03/12(木) 01:19:57.46ID:xuvPVMNh
ここで質問してくるやつは目的を書かないからタチが悪い。
0294NAME IS NULL垢版2020/03/12(木) 06:46:46.52ID:???
読解力がないのを人のせいにされても……
0295NAME IS NULL垢版2020/03/13(金) 20:38:00.16ID:???
■EXISTSを使用して。

データベース:オラクル

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

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

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

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

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

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

宜しくお願いいたします。
0297NAME IS NULL垢版2020/03/13(金) 22:24:00.52ID:???
せめて、
こうやって見たけどうまく行かない、どうしたらいい?
みたいに、質疑出来るようにして欲しい
0298NAME IS NULL垢版2020/03/13(金) 22:33:29.25ID:???
なぜにEXISTS ??
このケースで普通使わんやろ
0299NAME IS NULL垢版2020/03/13(金) 22:51:21.65ID:???
最高点抽出するってんなら使うこともあるだろ
0300NAME IS NULL垢版2020/03/13(金) 23:25:11.92ID:???
maxの代わりか
実践で使うことはまずないな
0301NAME IS NULL垢版2020/03/14(土) 08:59:24.94ID:???
この条件でEXISTSはどうやってつかうんだ?
0302NAME IS NULL垢版2020/03/14(土) 10:03:46.52ID:???
not exists (自分より点数高い奴)

昔はmax()使うより良い実行計画吐くことも多かったんでよく使われた。
0303NAME IS NULL垢版2020/03/14(土) 11:11:26.29ID:???
氏名テーブル関係なくて笑うわ
0305NAME IS NULL垢版2020/03/14(土) 12:13:36.75ID:???
さんくす勉強になったわ
0306NAME IS NULL垢版2020/03/15(日) 18:02:27.90ID:???
>昔はmax()使うより良い実行計画吐くことも多かったんでよく使われた。
今となってはバッドノウハウ感満々だな

>>295がどこからこんなお題を持ってきたかが気になるわ
0307NAME IS NULL垢版2020/03/15(日) 19:45:32.09ID:???
今でもmaxだけで常に最適な計画が得られる保証はないわけだし、
引き出しとして持っておいて損はないと思うがな。
0308NAME IS NULL垢版2020/03/15(日) 23:07:31.36ID:???
まあ、引き出しとして持っといて損はないんだろうけど
実行計画いじりたいならまずヒントで何とかならんか検討すべきだしな
0309NAME IS NULL垢版2020/03/16(月) 08:10:34.93ID:???
ヒントって、SQLチューニングでも期待通りにならない場合に使う最後の手段って印象だが。
0310NAME IS NULL垢版2020/03/16(月) 08:18:17.45ID:???
そもそもチューニングだのなんだの、
SQLを歪めてまでパフォーマンス気にしなきゃいけないDBが欠陥商品なんだよなぁ
安いモノでもないのに
0311NAME IS NULL垢版2020/03/16(月) 10:24:24.99ID:???
誰か exists と max で検証してみて
その上で議論しないと空回りするよ
0312NAME IS NULL垢版2020/03/16(月) 10:55:53.45ID:???
昔はそういうテクも有効だった
今どきはそう言うテクを使う必要は激減してるから使わなくていい、と言うかわかりにくいから使うな
要するに今は極々稀に役に立つかもしれないバッドノウハウ
0313NAME IS NULL垢版2020/03/16(月) 22:13:24.85ID:???
not existsはもう少し改善できる余地あるかもしれないが
distinct必要になるし単純なmaxより優れたプランになる可能性は感じられない
http://sqlfiddle.com/#!4/08250/4
0314NAME IS NULL垢版2020/03/17(火) 08:18:39.15ID:???
相関サブクエリはふつうnested loop joinになるが、index張ってないと最悪。
適切なindexを張っていれば集約関数を使う場合よりもfull scanの回数を抑えられる可能性はあるが、
ful scan自体大してかからないような小さいテーブルだと効果はない。
0315NAME IS NULL垢版2020/03/17(火) 08:26:08.78ID:???
>>314
>相関サブクエリはふつうnested loop
いまどき信じられんが
0316NAME IS NULL垢版2020/03/17(火) 11:34:00.28ID:???
適切なindex張ってれば集約関数もindex使うから関係ない

余程間抜けな集約関数使ってる時代遅れのDB以外ではバッドノウハウ
0317NAME IS NULL垢版2020/03/23(月) 13:48:25.16ID:???
oracleって連結したテーブルはupdateできないとかあって
existsを使わないといけないケースが多いな
それ以外はexistsは使わないほうがいい
0320NAME IS NULL垢版2020/03/23(月) 20:35:43.42ID:???
maxの代替で使うのがバッドノウハウってだけで
exists自体は別に使いたければ使えばいい
0321NAME IS NULL垢版2020/03/24(火) 14:27:09.84ID:???
>>318
existsはレコード件数ごと参照テーブルの検索が行われるため遅い
inner joinやleft joinで置き換え可能下記URL参照
http://kkoudev.github.io/blog/2013/09/14/sql/

特に not existsは、参照テーブルを前件検索しないと 存在しない事がわからないので特に遅いと思う
0322NAME IS NULL垢版2020/03/24(火) 15:24:15.29ID:+sBxQxtb
マシンパワーで解決できる場合は良くないとされるる
EXISTSやINとかのほうが意図が分かり易いから使っちゃう
0323NAME IS NULL垢版2020/03/24(火) 19:49:59.21ID:???
>特に not existsは、参照テーブルを前件検索しないと 存在しない事がわからないので特に遅いと思う

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

まあ、すべてでうまく置き換えてくれるわけではないが
相関サブクエリを速度対策のみのJoinに置き換えるのもそろそろバッドノウハウ行きだ
0325NAME IS NULL垢版2020/03/24(火) 22:26:57.95ID:???
>>321
それはDBMSとオプティマイザ次第だから実行プラン見たほうがいいぞ
LEFT JOIN+NULLチェックよりもNOT EXISTSのほうが効率いいケースは普通にある
0327NAME IS NULL垢版2020/03/25(水) 00:39:16.81ID:Y/wLAjJV
SSMSで実行計画の視覚化めっちゃ参考になるんだけど
Oracleで似たようなことできるツールないかなあ
0328NAME IS NULL垢版2020/03/25(水) 23:00:25.80ID:xq5nC5FI
まずは視覚化の意味から勉強しろよ!
0329NAME IS NULL垢版2020/03/26(木) 08:39:49.62ID:???
可視化っ事を言いたいのかな?
0331NAME IS NULL垢版2020/03/27(金) 05:50:12.56ID:YNcJxBjY
いや、もともと見えているという指摘だ。
0332NAME IS NULL垢版2020/03/27(金) 06:44:22.83ID:???
誰か>>331に話の流れを視覚化してやってくれw
0333NAME IS NULL垢版2020/03/27(金) 12:43:21.76ID:???
SSMSの実行計画表示みたことあるのか?
あれは他のDBでも欲しいよな

SQLSERVERの実行計画ってxmlで保存してあとからSSMSで表示できるはずだから
実行計画のコンバーター作れば良い感じにならんかなぁ
0334NAME IS NULL垢版2020/03/27(金) 19:01:19.95ID:???
Oracleで実行計画を見る方法はたくさんある

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

一番凝ってるのはEnterprise Managerで見る方法
これはグラフィカルに見ることが出来る
Enterprise EditionとTuning Packが必要だが
0335NAME IS NULL垢版2020/04/02(木) 10:06:52.81ID:???
りんご 3
バナナ 1
というテーブルから
りんご
りんご
りんご
バナナ
の出力を得たいです
個数分出力することはできますか?
0337NAME IS NULL垢版2020/04/02(木) 18:05:39.19ID:???
ちょっと変なSQL作りたいならDBは何かを書いたほうがいいと思うの
ちなみに俺が使ってるDBならできる
0338NAME IS NULL垢版2020/04/02(木) 18:17:59.36ID:???
めんどくさい時はプロシージャ書いてしまう
0339NAME IS NULL垢版2020/04/02(木) 20:32:18.83ID:h5xHe3bE
日本人? 
0341NAME IS NULL垢版2020/04/19(日) 02:00:10.55ID:+bt8+lxH
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してまた制約を付け直す処理が必要になる為、
可能であればもっと簡単な方法を教えて下さい。
0342NAME IS NULL垢版2020/04/19(日) 03:07:03.13ID:???
>>341
マスタテーブルをdropして
挿入テーブルをマスタテーブルにrenameする。
0343NAME IS NULL垢版2020/04/19(日) 04:10:30.93ID:u/pc2gUb
>>341
DELETEとINSERTの二発に分ける
・DBMSによってはDELETEでJOINが使える。
・使えなくてもWHEREでサブクエリを使えば同じことができる
0344NAME IS NULL垢版2020/04/19(日) 09:11:09.25ID:???
>>341
DBMSがわからないので回答できないが
俺の使ってるDBMSなら2回になるけどDELETEとUPDATEで可能
0345NAME IS NULL垢版2020/04/19(日) 09:59:00.91ID:???
データ量が多いならなおのこと、1レコードずつ処理される方法より
サクッと入れ替えた方が簡単そうだなぁ。
0346NAME IS NULL垢版2020/04/19(日) 12:03:25.90ID:???
>>341
DBMSは?
(てか、質問ならテンプレ使え)
0347NAME IS NULL垢版2020/04/19(日) 15:43:35.69ID:???
SQL ServerならMERGE一発で可

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

でもそんなんするくらいならテーブル入れ替えるかtruncate+select intoするほうが簡単
レプリしてればどの方法でも別途考慮は必要
0348NAME IS NULL垢版2020/04/19(日) 15:45:22.10ID:???
>>341
削除したマスターのレコードを参照してるデータはどうなるの?
CASCADEでDELETE?
0349NAME IS NULL垢版2020/04/19(日) 16:01:24.69ID:???
普通データ削除したい時は物理削除ではなく
削除用カラムを追加して削除フラグをたてるだけにする
データデースにはundo とかないので元に戻せないから
どうでもいいデータなら物理削除してもいいけどさ
0350NAME IS NULL垢版2020/04/19(日) 16:28:20.09ID:???
外野で言うんだけどさ
マスターデータをこのようにさっくり消しているシステムって何か怖い
0351NAME IS NULL垢版2020/04/19(日) 16:48:29.76ID:???
削除フラグは良し悪しあるからね
思考停止状態で削除フラグ入れてるところはDB設計がすぐ腐る
0353NAME IS NULL垢版2020/04/19(日) 17:38:42.67ID:uOven4R3
>>349
そういう論理削除が普通だと思っていると常に論理削除レコードかどうかを意識するSQLを書かないといけなくなり、テーブルにレコードがたまってしまう。

だから古いレコードは別テーブルに移動させる方がよい。
0354NAME IS NULL垢版2020/04/19(日) 18:00:48.66ID:???
印字した帳票と連動してるので発番したものを戻せないとか
ユーザアカウントを一時凍結するとか
理由があれば、まあ

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

んで、容量逼迫するから、月次や年次処理で
一定期間更新がない論理削除データを物理削除する
みたいなのもあったなぁ
0355NAME IS NULL垢版2020/04/19(日) 18:05:41.63ID:???
ゆーて結局バックアップは別にとることが多いけどね
0356NAME IS NULL垢版2020/04/19(日) 18:42:24.24ID:???
あと削除してもトランザクションログから戻せるよね
0357NAME IS NULL垢版2020/04/19(日) 19:02:18.63ID:???
バックアップって、障害時の復旧には意味があるけれど
個別データの復活で使えるの?
0358NAME IS NULL垢版2020/04/19(日) 19:24:45.10ID:???
例えば社員マスタで退社した社員を物理削除して削除した社員番号で違う人を登録した場合に不都合が生じる
退社した人のデータが連結されてしまうとかがある
0359NAME IS NULL垢版2020/04/19(日) 19:34:36.96ID:???
>>342
その後の事(挿入テーブルはそのまま残す)を考えると

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

にした方がいいな。
0360NAME IS NULL垢版2020/04/19(日) 20:02:32.61ID:???
>>358
それは設計のバグだろう。
もしかして自然に発生する障害みたいに思っているのかな。
0361NAME IS NULL垢版2020/04/19(日) 20:03:56.80ID:???
このスレで言うのはなんだかそれ運用がおかしくないか?
0363NAME IS NULL垢版2020/04/19(日) 20:28:06.38ID:???
1から設計できる立場なら避けるけど
改修とかで押し付けられた既存システムキメラとかに
まれによくあるよね
0364NAME IS NULL垢版2020/04/19(日) 20:32:02.57ID:???
社員マスタは例えばの話ですが
他のマスターでも起こりうる
論理削除だと永久欠番にできデータの整合性を保てるが物理削除すると前に使われていたかもわからなくなりデータ不整合が発生するリスクがあるんだと言いたかった。
0365NAME IS NULL垢版2020/04/19(日) 20:35:23.42ID:???
自然キーじゃなくて得体のしれない「ID」を使ってるとみた。
0367NAME IS NULL垢版2020/04/19(日) 20:43:29.13ID:???
まれによくある
ジョークのつもりなんだろか
0369NAME IS NULL垢版2020/04/19(日) 21:18:23.65ID:???
下手なたとえをするとろくな事にならない
0370NAME IS NULL垢版2020/04/19(日) 21:28:08.99ID:???
社員番号の再利用なんて聞いたことがないな。
俺が世間知らずなだけか?
0371NAME IS NULL垢版2020/04/19(日) 21:52:39.72ID:???
>>370
過去に一度であったことがある
社員数が急増して、想定した桁数で足りなくなったという理由らしい

まあ、SQL関係ない
0372NAME IS NULL垢版2020/04/19(日) 22:01:51.67ID:???
SQLの質問が入る

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

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

設計談議で盛り上がる
0373NAME IS NULL垢版2020/04/19(日) 22:11:03.74ID:uOven4R3
バックアップなんて発想が出てくるのは、よほど小さいデータベースの話。
0374NAME IS NULL垢版2020/04/19(日) 22:24:49.63ID:???
>>359
>その後の事(挿入テーブルはそのまま残す)を考えると

挿入テーブルを毎回新規作成すればよくね?
わざわざコピーする価値があるケースのほうが少ない気がするんだけど
古いマスターもdropじゃなくrenameすればアーカイブとして取っておける
0375NAME IS NULL垢版2020/04/19(日) 22:42:07.55ID:u/pc2gUb
質問者不在で盛り上がってるなw

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

PK制約に明示的に名前つけてると
テーブル名リネームした時に変わらないでズレて悩むことがあるから注意な
0377NAME IS NULL垢版2020/04/20(月) 00:01:22.05ID:???
>>374
>挿入テーブルを毎回新規作成すればよくね?

そんな事を言い出したら質問の回答にならない。
質問者は処理後に挿入テーブルのデータを全てクリアするなんて
言ってないんだから。
0378NAME IS NULL垢版2020/04/20(月) 01:01:56.63ID:FyjM5Hbd
テーブルを作るんじゃなくて、レコードを移動させろよ!
0380NAME IS NULL垢版2020/04/20(月) 09:36:35.31ID:???
>>377
挿入テーブルのデータを残したいならそうすればいいだけ
コピーの有無以外にもマスターテーブルを先にdropするやり方は
挿入時にエラーが発生した場合の対処が複雑化するから一般的に悪手
0381NAME IS NULL垢版2020/04/20(月) 11:15:49.18ID:???
>>380
それならまず別名でテーブルを作成し次に挿入テーブルから別名テーブルへの
コピーをしてエラーがなければマスタテーブルをdropして
別名をマスターにrenameすればいい。

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

バックアップならDB外のエクスポートファイル(ファイル名にYYYYMMDD等をつけて)
の圧縮で残せばいいと思う。
0382NAME IS NULL垢版2020/04/20(月) 15:05:03.85ID:???
結局、毎回新規作成w
そんな事を言い出したら質問の回答にならないw
0383NAME IS NULL垢版2020/04/20(月) 16:29:38.95ID:???
そろそろ模範解答とやらを出して、次の話題にしようぜ
0384NAME IS NULL垢版2020/04/20(月) 18:20:09.97ID:???
>>381
社員マスタならむしろめちゃ件数少ないだろ
0386NAME IS NULL垢版2020/04/20(月) 18:34:24.56ID:???
>>382
>結局、毎回新規作成w
何か問題でもあるのか?

>そんな事を言い出したら質問の回答にならないw
意味不明。
質問者の要求通りの回答をしてるつもりだけど。
0387NAME IS NULL垢版2020/04/20(月) 18:46:06.48ID:???
消せるならDELETE(TRUNCATE)してカラムが全部同じならINSERTだろうが
制約があるから消せないって書いてないか?
0388NAME IS NULL垢版2020/04/20(月) 20:13:42.34ID:???
そこは制約を一旦無効化してやるだろう。
ただ、再度有効化するのにかかる時間を考えたら UPDATE & DELETE と変わらんかもしれんが。
0389NAME IS NULL垢版2020/04/20(月) 20:19:50.76ID:9OdQ3HCy
なんか勝手に処理追加しだしたぞw
0390NAME IS NULL垢版2020/04/20(月) 20:21:09.97ID:???
追加された処理ってどれ?
0391NAME IS NULL垢版2020/04/20(月) 21:06:31.32ID:???
>>381
単発処理ならいいけど定期処理ならまずやらない
バックアップが依存ジョブになるリスクや運用面への影響を全く考慮できてない
0392NAME IS NULL垢版2020/04/20(月) 21:38:53.03ID:???
>>391
バックアップは一緒に処理しないで
バックアップ専用の処理(他のテーブルと合わせて)でいいと思う。
0393NAME IS NULL垢版2020/04/21(火) 10:57:26.55ID:???
>>384
質問者(>>341)はデータ量が多いと言ってる。

しかし質問者は未だに返信なしかよw
0394NAME IS NULL垢版2020/04/21(火) 19:15:01.09ID:???
設計スレの話題になるが
>>341
のデータで年齢ってあるけど普通は生年月日を定義して必要に応じて年齢を計算なんじゃないかと思うけど
年齢なんて定義するか?
0395NAME IS NULL垢版2020/04/21(火) 19:37:15.91ID:???
>>394
>>341は項目としての例を挙げただけだと思う。
項目なんて何でもよかったんだよ。
キー項目があってキー項目でupdateしたいって事を
言いたかっただけだと思う。
0396NAME IS NULL垢版2020/04/21(火) 19:47:08.38ID:???
単なるアンケートとかで普通にあるでしょ
アンケートごときに生年月日なんて言う個人情報を登録したくない人は多いだろうし
0397NAME IS NULL垢版2020/04/21(火) 20:55:02.10ID:???
この話題、これ以上引っ張る意味あるのか?
0398NAME IS NULL垢版2020/04/21(火) 21:55:05.84ID:???
よく見るとマスタに年齢もつのおかしいな
来年になったら更新が必要じゃん
生年月日もったほうがいいよな
0401NAME IS NULL垢版2020/04/21(火) 23:56:53.06ID:???
お寺で使う法要データーベースかな
0403NAME IS NULL垢版2020/04/22(水) 08:06:50.92ID:???
飽きたなら新しい話題振ればいいんじゃない?

「ボク、このはなしつまんなーい!」
ってガキじゃないんだから
0404NAME IS NULL垢版2020/04/22(水) 09:30:49.18ID:oLnoXm0l
少ないデータしか扱ったことがないやつは参考にならない。
0405NAME IS NULL垢版2020/04/22(水) 11:56:08.23ID:???
それでは難しい質問をします
下記の複数レコードを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です
0406NAME IS NULL垢版2020/04/22(水) 12:35:12.15ID:???
失職者の仕事できますアピールみたいだ
0407NAME IS NULL垢版2020/04/22(水) 13:30:41.69ID:TJ5jZu/H
>>405
縦を横にするのは頻出の質問ではありますが標準的な方法はありません
その後の利用シーンによりますがSQL ServerならUDF書くのもありです
0408NAME IS NULL垢版2020/04/22(水) 13:48:47.09ID:???
STRING_AGGでいいんでないの?
ttps://sql55.com/query/sql-server-2017-new-functions-string-agg.php
0409NAME IS NULL垢版2020/04/22(水) 15:21:32.92ID:???
>>407
listagg()は標準(2016)に定義されている
同名の関数が定義されてなくてもgroup_concatやstring_aggのような同等の関数がある
めんどくさいからやらないけどCTEでも実現可

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

ただほとんどの場合SQLでやる必要ない
0410NAME IS NULL垢版2020/04/22(水) 15:39:47.65ID:???
>>392
それバックアップ失敗してても困らない前提だよね?
renameはtransactionalに出来ないDBMSでもエラー検知して元に戻せるけど
dropはrollbackできないDBMSだと復旧モデルによってはデータロスト
0412NAME IS NULL垢版2020/04/22(水) 16:24:54.97ID:???
>>409
いろいろやり方おしえてくれてありがとうございました

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

DECLARE @STR VARCHAR(8000);

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

SELECT @STR 
0413NAME IS NULL垢版2020/04/22(水) 18:35:33.03ID:???
3件とは限らないってことはN件なんだから8000桁って指定しちゃだめだろ
アホ
0415NAME IS NULL垢版2020/04/22(水) 19:40:26.85ID:???
SQL Serverなら(max)とか別の制限かかる実質LOBな型もあるけど

元質問がSQL Serverだったから8000なんだが
このへんDBMSによってどのくらい違うんだろうな
0416NAME IS NULL垢版2020/04/22(水) 19:45:30.09ID:???
VARCHARを問題にしてるんじゃないのか
0417NAME IS NULL垢版2020/04/22(水) 20:02:25.33ID:???
>>416
どう問題なの?
MailがメールアドレスならANKしか入らないと思うが
0418NAME IS NULL垢版2020/04/22(水) 20:32:42.51ID:???
max指定しろってことでしょ
ケースバイケースなので8000指定が駄目って事はない
0419NAME IS NULL垢版2020/04/22(水) 22:13:42.11ID:???
>>418
> max指定しろってことでしょ
maxはオーバーヘッドあるからmaxならいいかどうかもケースバイケース
0420NAME IS NULL垢版2020/04/22(水) 22:24:18.27ID:???
>>419
同じこと言い直してドヤるのやめて〜ww
0421NAME IS NULL垢版2020/04/23(木) 13:14:25.56ID:A92VRI4I
左外部結合を使う というのを文にするときはどうしたいいですか?
Aを左、Bを右、xを共通として左外部結合する
みたいな言い方を考えていたのですが、正しい日本語の文があれば教えてください。
0422NAME IS NULL垢版2020/04/23(木) 15:05:14.19ID:???
文章にすることで何を達成したいかっていう目的を書けよ

あらゆる状況に当てはまる万能な回答や
正しい回答があるという考えで通用するのは高校生まで
0423NAME IS NULL垢版2020/04/23(木) 15:18:37.03ID:???
外部テーブル、内部テーブル、結合条件あたりが一般的な用語

(例)
Aを外部テーブル、Bを内部テーブル、A.x = B.xを結合条件として外部結合をする場合、
左外部結合なら外部テーブルを左に置いて`A LEFT OUTER JOIN B ON A.x = B.x`と書く
右外部結合なら…
0424NAME IS NULL垢版2020/04/23(木) 15:21:53.73ID:???
>>423
左外部結合なら外部テーブルをJOIN句の左側に置いて…
0426NAME IS NULL垢版2020/04/23(木) 15:47:20.31ID:A92VRI4I
>>422
目的は詳細設計書です。
コードは書けるのですが、日本語文にするとわかりづらく。
0428NAME IS NULL垢版2020/04/23(木) 17:12:33.12ID:A92VRI4I
>>422 - >>427
助言ありがとうございます。
考えてみます。
0429NAME IS NULL垢版2020/04/23(木) 17:15:33.71ID:???
>>427
ER図で表現できる内容ではないと思うぞ
図にするならベン図で色分けとかだろうけど
詳細設計書なら外部結合自体を知らない読み手を想定する必要はないだろうから
文章とSQLで十分だと思う

>>421
左や右はそんな重要な情報じゃないので
>>423のようにAが外部テーブル(外部表)だってことを明記するのがいいと思う
0430NAME IS NULL垢版2020/04/23(木) 18:39:20.99ID:???
そもそも、左外部結合を使うじゃなくて
左外部結合する って書くのが普通じゃないのか
0431NAME IS NULL垢版2020/04/23(木) 18:58:23.51ID:8zqlFX72
>>423
外部テーブル、内部テーブルという言い方は聞いたことがない。

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

外部表、内部表という言葉は俗語で、Oracle Databaseでは外部表はテーブルではないがテーブルとして扱えるファイルのことを差していたりもする。
0432NAME IS NULL垢版2020/04/23(木) 19:01:17.22ID:8zqlFX72
>>426
それはSQLを直訳しようとしているからダメなんだよ。

どういうデータを取得したいのかを書こうとしていない。
0433NAME IS NULL垢版2020/04/23(木) 19:02:13.58ID:8zqlFX72
>>430
それ本来は設計書じゃないよ。
0434NAME IS NULL垢版2020/04/23(木) 22:03:44.25ID:???
>>426
詳細設計なら
別に日本語文章にしなくても
SQLそのまま書けばいいんじゃね?

何の為の詳細設計か知らんけど
0435NAME IS NULL垢版2020/04/23(木) 22:07:22.99ID:???
>>431
outer table, inner tableの訳な、external tableとは別
お前が聞いたことなくても一般的に使われてるぞ
“join outer table”でoracleのリファレンスでもググってみれば
0436NAME IS NULL垢版2020/04/24(金) 00:04:56.06ID:stdEEZWC
自然言語言語書き下し翻訳じゃなくて設計なんだから
「XXテーブルをxxコードで探索し存在するものについてはxxを取得する」
とかじゃないのか
建前としてそもそもSQL書く前の話なんだから
0437NAME IS NULL垢版2020/04/24(金) 05:05:24.57ID:???
>>435
> お前が聞いたことなくても一般的に使われてるぞ
聞いたことないしググっても出てこん
お前がググった結果のURL貼ってくれ
0439NAME IS NULL垢版2020/04/24(金) 16:41:06.35ID:???
>>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
0440NAME IS NULL垢版2020/04/25(土) 17:07:49.34ID:rcJuFzMJ
>>435
だから日本語訳の話だと言っているだろ
0441NAME IS NULL垢版2020/04/25(土) 17:10:01.86ID:rcJuFzMJ
>>439
inner、outerの意味がわかっているのか?
0442NAME IS NULL垢版2020/04/25(土) 17:12:35.57ID:rcJuFzMJ
日本オラクルの翻訳を知らないとはあきれてる。
0443NAME IS NULL垢版2020/04/26(日) 13:46:54.98ID:???
くるみぽんちおおおおおおおおおおおおおおおおおおおお
0444NAME IS NULL垢版2020/04/27(月) 20:19:07.34ID:???
python3.6.8で作業しています。

ttps://datadryad.org/stash/dataset/doi:10.5061/dryad.8q0s4
この度上のデータベースを利用することになり、
sqlite3でreadmeにあるコマンドを順次実行したところ、
33行目で
sqlite3.OperationalError: near "LOAD": syntax error
と出てそこから先に進むことができません。
指すファイルは作業フォルダにあるはずなのですが、SQLは素人なこともあり、修正すべき場所がわかりません。
ご教授いただければ幸いです。
0446NAME IS NULL垢版2020/04/27(月) 20:55:20.96ID:CJEbYb0s
わざわざhを取っているあたりからネタだと思われる
0447NAME IS NULL垢版2020/04/28(火) 09:03:13.75ID:/YfVzCiV
SQL Server 2014です。

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

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

記号「A」のような一つも状態「1」を持たない記号を知りたいのですがどのようなSQLで実現できるでしょうか?お願いします。
0448447垢版2020/04/28(火) 09:12:03.74ID:/YfVzCiV
ずれたテーブルを投稿してしまい失礼しました。

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

状態の最大値が0の記号を出せばいけるかなと思いついたのですが
状態は文字列となっており断念しました。。。
0449NAME IS NULL垢版2020/04/28(火) 11:50:05.52ID:???
普通にgroup by havingでいけない?
0453NAME IS NULL垢版2020/04/28(火) 22:39:11.85ID:???
SQL-Serverなら文字列でもMax使えるから普通にgroup byとhavingでいけるでしょ
select 記号 from テーブル group by 記号 having max(状態) = '0'
0454447垢版2020/04/28(火) 22:59:50.90ID:???
やりたい事ができました
色々アドバイスありがとうございます
同じテーブルにNOT EXISTSとか思いもよりませんでした
大変参考になります
0455NAME IS NULL垢版2020/04/29(水) 00:48:38.24ID:???
NOT EXISTSとGROUP BYどっちがパフォーマンスいいんだろ
0456NAME IS NULL垢版2020/04/29(水) 13:40:52.84ID:???
実行計画次第だから、実際のテーブル定義と件数で実行計画比較しないと意味がない

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

普通のHAVINGにはインデックスきかないよね?
これをインデックス付きビューにしとけばおそらくそれが最速
0458NAME IS NULL垢版2020/04/29(水) 16:59:15.86ID:???
いまどきEXISTSにSELECT 1とか...
0459NAME IS NULL垢版2020/04/29(水) 17:55:50.37ID:???
>>458
SQLに詳しいやつが
なんでSELECT 1使うのか調べたほうがいいよ
0460NAME IS NULL垢版2020/04/29(水) 21:59:25.64ID:???
>>456
NOT INてインデックス有効?
NOT EXISTSの方が遥かに速かった記憶が。
0461NAME IS NULL垢版2020/04/29(水) 22:20:32.50ID:???
ぐぐったら「SELECT 1の方が速い」「SELECT *の方が速い」「オラクルのバージョンによる」「評価されないのでどっちでもいい」ってマチマチだったので、試してみた
https://rextester.com/QWAU74067
0462NAME IS NULL垢版2020/04/29(水) 23:58:51.29ID:???
>>460
NOT INの対象のサブクエリには当然効くでしょ
0463NAME IS NULL垢版2020/04/30(木) 00:02:54.61ID:???
インデックスの話とは関係ないが
NOT IN使っても最近はオプティマイザがよろしくやってくれるから昔ほど避ける必要ない
0464NAME IS NULL垢版2020/04/30(木) 11:49:14.64ID:tHc+PwYH
phpmyadminをxamppで使用しています
特権タブにlocalhostがありますので、あらたにユーザーを追加しなくてもいいということでしょうか?localhost=自分ということかと思いますです
0465NAME IS NULL垢版2020/04/30(木) 20:49:53.13ID:ZnoS/PPZ
>>461
Oracle Databaseの慣習だと1ではなく、Xだけど、データを取得したいのか、データの有無を調べたいかの意志表示でこう書いている。
0466NAME IS NULL垢版2020/05/02(土) 12:39:45.35ID:???
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)です。

よろしくお願いします。
0467NAME IS NULL垢版2020/05/02(土) 14:37:30.18ID:???
くそめんどくせーから日付の部分は自分で加工しろ
select date,player,score,(select avg(score) from tbl as tbl2 where tbl2.date<tbl.date and tbl2.date>=tbl.dateの10日前) from tbl
0468NAME IS NULL垢版2020/05/02(土) 14:57:25.55ID:???
たぶんこんな感じ
日付周りは適当に直して
select
*,
(select avg(score) from scoretable
WHERE player=t.player and date < t.date and date >= (date - 10)
) AS ?
from scoretable t
0470466垢版2020/05/02(土) 15:53:15.27ID:???
>>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 …
のような感じで試みるもうまくいかず、、お願いします。
0471NAME IS NULL垢版2020/05/02(土) 16:15:06.13ID:???
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"))
0472NAME IS NULL垢版2020/05/02(土) 16:17:08.29ID:???
一応俺のくせなだけだが
別名をどちらかだけつけるなら加工する側のSQLにつけたほうがいいと思う
0473NAME IS NULL垢版2020/05/02(土) 16:25:45.50ID:???
純粋に計算で求められる値をテーブルに保存すべきかどうかはよく検討したほうがいいぞ
0474466垢版2020/05/02(土) 16:43:36.87ID:???
>>471

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

>>473
保存しないでメモリで計算すべきということでしょうか?
またあとでみたいので途中計算も保存しちゃってます。
0475466垢版2020/05/02(土) 17:11:51.32ID:???
全部質問で恥ずかしいのですが、もう1つお願いします。
移動平均の日付範囲の中に要素がなかったときに、
NOT NULL constraint failedというエラーとなります。
(当日を含まず、歯抜けの日もあるため)
avg()がNULLとなる場合をスキップしてそれ以外だけ
計算する方法がありましたら教えてください。
0477466垢版2020/05/02(土) 17:32:59.92ID:???
>>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)

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

ありがとうございました。
0479NAME IS NULL垢版2020/05/02(土) 18:02:45.73ID:???
それNULLをスキップしてるんじゃなくてNULLをゼロにしてるだけなんだが...

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

つっこみどころ満載だな
0480NAME IS NULL垢版2020/05/02(土) 18:08:36.42ID:???
プログラムに限らず、2ちゃんねるの専門系の質問スレって
どこよりもたよりになる。過去何度も助けられてる。
答えてる人々はどういうモチベーションなんだろう。
自己鍛錬的なあれだろうか。
0481NAME IS NULL垢版2020/05/02(土) 18:12:16.75ID:???
そういえば最近自分も外れ値を除外するために移動平均をデータにセットしたな。しかしバラツキが大きいと移動平均と比較しても意味ないので標準偏差も計算してセットした。
0482NAME IS NULL垢版2020/05/02(土) 18:13:38.31ID:???
まあ趣味的なデータっぽいからいいと思うが

自分もビューにしたほうがいいんじゃないかとは思う
日付のデータは当日分または前日分1日だけなら
毎回更新するのはコストがかかりすぎじゃないかという気もする
0483NAME IS NULL垢版2020/05/02(土) 18:14:47.41ID:???
>>477
COALESCEはSQL標準
IFNULLやISNULLはDBMS特有の関数
なので都合が悪いケースじゃなければCOALESCE使う

よく読んでなかったけど
NOT NULL constraint failedって
moving_avgがnullになる可能性もあるのにNOT NULL付けたらだめじゃないの?
10日間のスコア平均が0.0の場合と値が無いケースとの区別ができなくなる
0484NAME IS NULL垢版2020/05/02(土) 18:15:59.21ID:???
毎日1日分のデータを登録するという運用なら
INSERTするときにさっきのAVGのデータをSELECTでひろって
INSERT〜SELECTするという手もあるけどね
0485NAME IS NULL垢版2020/05/02(土) 18:22:08.07ID:IGZUerYJ
>>474
簡単に導出できる値を持つというのとは、二重、三重に値を持つことと同じことになる。
0486NAME IS NULL垢版2020/05/02(土) 18:27:50.16ID:IGZUerYJ
>>477
なんかどんどん変な慣習に引きずられているなw

他のひとも指摘しているけど、NULLを返すレコードがあるなら、そのレコードを初めから排除しとけよ。
0487466垢版2020/05/02(土) 18:30:08.31ID:???
皆様

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

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

色々とご助言ありがとうございます。
0488NAME IS NULL垢版2020/05/02(土) 18:33:03.06ID:IGZUerYJ
>>477
自分のなかで決まりがなさすぎだろ。

なんとかdateという名前にしておきながら、データ型がバラバラとかあからさまに初心者。
0489NAME IS NULL垢版2020/05/02(土) 18:56:10.24ID:???
ID:IGZUerYJ
なんだこいつw
0490NAME IS NULL垢版2020/05/02(土) 19:26:39.19ID:???
あきらかに初心者な質問にそんな文句いってもなぁ
自分ではなにも回答してないのにマウントだけとりたいのか

なんかsqliteの解説みてると日付型ってもってなさそうだけど
データ型がバラバラってどこ見ていってるんだろうな
0491NAME IS NULL垢版2020/05/02(土) 19:51:26.39ID:???
>>487
聞くのはいいけど
自分で試行錯誤した内容でアドバイスもらうのも
ありかと思うぜ
0492NAME IS NULL垢版2020/05/02(土) 19:57:09.55ID:IGZUerYJ
YYYYMMDDの書式が年月日だと思うのはエスパーなのかと思っただけ
0494NAME IS NULL垢版2020/05/02(土) 20:22:35.55ID:???
分析能力がないのを言い訳にしてんなよ
0496NAME IS NULL垢版2020/05/13(水) 01:53:24.85ID:???
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に移行も考えています...
0497NAME IS NULL垢版2020/05/13(水) 03:38:14.71ID:???
CTE使えばできそうだけど
そういうのはSQLじゃなくプログラム側で処理したほうが100倍簡単でメンテしやすいよ
0498NAME IS NULL垢版2020/05/13(水) 06:43:41.20ID:???
こういう設計する人って何なんだろうな
0499NAME IS NULL垢版2020/05/13(水) 07:12:28.66ID:???
こんな感じかな?
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;
0500NAME IS NULL垢版2020/05/13(水) 09:36:09.50ID:???
O(n)でできるところをO(n^2)以上に悪化させてもSQLで処理する意味あるのかな
0501NAME IS NULL垢版2020/05/13(水) 18:52:38.85ID:???
なんでもSQLでやろうとする人って保守とかはあまり考えてないよな
まあ俺が関係するわけじゃないからいいけど
0502NAME IS NULL垢版2020/05/13(水) 20:05:59.50ID:???
ウィンドウ関数使ってみた
ttps://ideone.com/Zk56p2
0504NAME IS NULL垢版2020/05/13(水) 21:12:20.81ID:kncXgfyu
>>496
また同じようなネタw
0505NAME IS NULL垢版2020/05/14(木) 12:30:36.70ID:EN6nNPUZ
独り言だけど、標準SQLが何でも取り入れてしまうから、もはや標準になってない。プロジェクトの規約にないことは人によって書き方がバラバラで疲れる。
0506NAME IS NULL垢版2020/05/14(木) 14:46:19.18ID:???
sqlは広く使われてるlinterとかないからねー
formatterでさえ使って人少ない
0507NAME IS NULL垢版2020/06/04(木) 01:17:09.63ID:???
oracleの(+)で外部結合お手軽すぎてこの書き方に慣れてしまった
0508NAME IS NULL垢版2020/06/04(木) 01:25:41.30ID:???
体に毒だから、止めた方がいい
0510NAME IS NULL垢版2020/06/04(木) 16:52:27.35ID:???
データベースSQLSERVERで教えて下さい

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

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

とか考えたのですが他にもっとスマートな記述ありますでしょうか
0511NAME IS NULL垢版2020/06/04(木) 18:12:28.53ID:???
(カラムA = @A or @A is null)はselectではよく使うパターン

条件が1つならif (@A IS NULL)のほうがいいかもしれないけど
たくさんあるならそのパターン使えば良いと思うよ
OPTION (RECOMPILE)を付けて各パターンで念の為プランを確認しておくこと
0512NAME IS NULL垢版2020/06/05(金) 14:11:18.46ID:???
>>511
やはりorで記述するのが多いのですね。
ありがとうございました。
0513NAME IS NULL垢版2020/06/05(金) 20:36:31.47ID:???
with句って今まであんまり使わなかったけどめちゃ便利じゃん
副問い合わせでごちゃごちゃネストするよりも可読性が高まる
0514NAME IS NULL垢版2020/06/06(土) 07:39:20.23ID:???
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の正しい構文規則みたいな資料って、どれを見ればいいんでしょう?
0516NAME IS NULL垢版2020/06/06(土) 09:52:32.08ID:???
>>514
NOT LIKEやNOT BETWEENのNOTとunary operatorのNOTは違うもの
INやLIKEのような一部の演算子についてだけ“NOT LIKE”が一つの演算子として働くイメージ
Postgres特有の話ではない

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

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

ひとつ賢くなれました、ありがとう
0518NAME IS NULL垢版2020/06/06(土) 16:11:51.77ID:???
>「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ならあるので成立する
0519NAME IS NULL垢版2020/06/08(月) 20:32:19.26ID:???
PL/sql(Postgres)で以下のようなテーブルの更新処理を実装したいです
fetchを入れ子するのではと思いますがいまいち実装サンプルなどが見つからずよく分かりません
例)テーブル(userID、 productID、price)があるとして
userIDごとにpriceから値引き額(別テーブルで定義)を引ききれるまで引く更新を全てのレコードに対して行いたいとしたら

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

そもそもPL/SQLの書き方自体怪しいんですが上記のイメージで実装可能なのでしょうか
0520NAME IS NULL垢版2020/06/08(月) 22:22:28.21ID:???
普通のsqlで出来るのでは?
0521NAME IS NULL垢版2020/06/09(火) 00:48:31.81ID:???
確かにSQLだけでも出来るっぽい。
ttps://rextester.com/KMHR77477
0522NAME IS NULL垢版2020/06/09(火) 11:01:46.70ID:???
SQLだけはめちゃくちゃ辛いな

そもそも注文明細的なテーブルの販売価格を直接更新して値引きする時点で設計に欠陥あるよね
0523NAME IS NULL垢版2020/06/09(火) 13:41:09.03ID:???
>>521
サンプルコードまでありがとうございます
SQLでもできるんですね
アプリ側で実装できない事情があり頭抱えてたので、この線で一度レスポンスを見てみようと思います
設計自体の欠陥もご指摘の通りで、明細一つ一つを再計算する作り自体がよろしくないですね
0524NAME IS NULL垢版2020/06/15(月) 01:08:16.40ID:???
oracleで円周率求めるpiって使えないのか
0526NAME IS NULL垢版2020/06/17(水) 20:25:14.15ID:???
sales

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

ってテーブルを
1月 1000
2月 3000
3月 4500 という累計にするSQL教えて下さい
0527NAME IS NULL垢版2020/06/17(水) 20:40:20.21ID:???
月をintegerにした数字のカラムを用意する
1-1,1-2,1-3...1-12で範囲指定してsumを12テーブル
unionして一応ソート
か?
0528NAME IS NULL垢版2020/06/17(水) 21:32:38.69ID:???
>>526
select 月, sum(金額) over (order by 月) from sales;

他のやり方もあるけどwindow関数使うのが簡単
古いDBじゃなければサポートされてる
0529NAME IS NULL垢版2020/06/18(木) 01:13:54.11ID:???
window関数ってマジで便利だよな
よくわかってない頃はアプリ側でゴリゴリやってた
0530NAME IS NULL垢版2020/06/18(木) 01:18:49.99ID:???
ちょっと脱線で悪いが、

月カラムでデータに”月”入れる?
0531NAME IS NULL垢版2020/06/18(木) 09:57:25.00ID:???
>>530
用途による
キーや条件指定で使うカラムなら入れないが
表示用の文字列を入れるカラムなら入れる場合もある
0532NAME IS NULL垢版2020/06/22(月) 13:33:00.25ID:FQCTIBUq
「◯年◯月」を日付型に変更したいのですが、どうすればよいでしょうか?
0533NAME IS NULL垢版2020/06/22(月) 14:59:39.65ID:???
"年"と"月"を"/"にリプレイス
末尾に日を表す数値を付けて日付型にキャスト
0534NAME IS NULL垢版2020/06/22(月) 18:26:31.32ID:ItHxQxII
>>533
ありがとうございます
0535NAME IS NULL垢版2020/06/22(月) 18:59:33.06ID:???
/区切りは標準ではない気がするが
0536NAME IS NULL垢版2020/06/22(月) 22:17:01.43ID:n5R9lLii
>>533
なんでわざわざ置換するのか?
0537NAME IS NULL垢版2020/06/22(月) 23:59:26.66ID:???
自分もお手軽に書くなら>>533かな
「/」「-」何を使うかはDMBSのルールに従う
0538NAME IS NULL垢版2020/06/23(火) 05:29:33.32ID:???
>>536
置換しなくてもできるならその方法を書いてよ
0539NAME IS NULL垢版2020/06/23(火) 11:33:31.81ID:???
置換せずに数字を取り出して使うってことかもしれないけど
DBによってはparseする時にフォーマット指定できるものもある
Postgreならto_date('2020年12月', 'YYYY年MM月’)で日付型の値が返される

とりあえず質問の仕方がわるい
「どうすればいいでしょうか?」という質問の仕方するやつはロクなのいない
0540NAME IS NULL垢版2020/06/23(火) 11:51:08.63ID:???
MySQLはフォーマット指定はできるが年月だけでは日付型に変換されないみたい

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

STR_TO_DATE('2020年12月1日', '%Y年%m月%d日')
=> 2020-12-01
0541NAME IS NULL垢版2020/06/23(火) 13:29:47.19ID:???
>>539
> 置換せずに数字を取り出して使うってことかもしれないけど
はっきり
> 「◯年◯月」を日付型に変更したいのです
って書いてあるのに何を言ってるんだよw
0544NAME IS NULL垢版2020/06/23(火) 18:35:48.32ID:???
もともとSQLでやるべき処理ではないけど
置換しないとできないと思う理由が理解できないな
0545NAME IS NULL垢版2020/06/23(火) 20:28:30.65ID:???
出来なくはないが、置換するほうが楽だろう
そうじゃないと思うならそのやり方書けよって話だろ
0546NAME IS NULL垢版2020/06/23(火) 21:14:11.53ID:???
難癖つける系の人がいるね
こういう人がレビュアーにいるとレビューの空気悪くなって生産的な場じゃなくなるんだよなあ
0547NAME IS NULL垢版2020/06/23(火) 22:03:04.71ID:???
>>545
もう出てますやん
楽かどうかはDBMS次第
0548NAME IS NULL垢版2020/06/24(水) 05:37:16.35ID:???
>>544
DBMS 指定してないから多くの DBMS でできそうな方法を書くのは当たり前だと思うけど?
まあテンプレ使わない>>532が悪いという指摘ならわかるけど
0549NAME IS NULL垢版2020/06/24(水) 10:12:19.72ID:???
上塗りの言い訳恥ずかしいw
0550NAME IS NULL垢版2020/06/24(水) 19:22:30.78ID:???
>>549
言い訳?
おかしいと言うならちゃんと指摘したらいいんじゃね?
0553NAME IS NULL垢版2020/06/24(水) 21:09:33.40ID:s9ILUWzT
>>538
そもそも文字列として持っているRDBは少数派だよ
0554NAME IS NULL垢版2020/06/24(水) 21:12:17.42ID:s9ILUWzT
>>545
暗黙的な変換に違和感がないのならやめた方がいい
0555NAME IS NULL垢版2020/06/24(水) 21:26:27.21ID:???
顔真っ赤の言い訳厨だけでお腹いっぱいなのに
別のアホ(いつもの人)が参戦ww
0556NAME IS NULL垢版2020/06/24(水) 21:28:41.75ID:???
>>553
そういう話は>>532に言えば?

>>554
暗黙的な変換ってどこから出てきたんだ?w
0557NAME IS NULL垢版2020/06/24(水) 21:30:34.94ID:???
>>555
指摘できないなら黙って涙吹いとけw
           ~~~~~~~~
0558NAME IS NULL垢版2020/06/26(金) 00:30:11.73ID:8xj3vrR+
>>556
日付型を決まった文字列で指定する製品もあれば、そうでない製品も存在する。
0559NAME IS NULL垢版2020/06/26(金) 01:32:53.35ID:???
ちょっとマジで>>554が何を言いたいのかわからんのだが
0560NAME IS NULL垢版2020/06/26(金) 05:23:48.53ID:???
俺は>>558も何が言いたいのかよくわからん
恥の上塗りをしてるのはわかるけどw
0562NAME IS NULL垢版2020/06/26(金) 12:19:27.18ID:8xj3vrR+
日付を文字列で指定する製品しか知らないんだろ?
0563NAME IS NULL垢版2020/06/26(金) 13:37:49.13ID:???
いつもの上塗りマンはさすがにヤベェww
置換野郎はまともだな
0564NAME IS NULL垢版2020/06/26(金) 19:17:32.93ID:???
>>562
Access知ってるボク偉いでしょ
ってか?w
0565NAME IS NULL垢版2020/06/26(金) 21:29:28.45ID:???
「日付型にキャスト」って書いてるんだからAccessでも文字列で指定できるでしょ

文字列からは日付型の値を生成できないDBMSがあるとして
どうやって特定の日付を指定するんだろうね
0567NAME IS NULL垢版2020/06/26(金) 22:22:33.71ID:???
>>566
それは値の解釈の例だって値を生成するために指定するのは数値か文字列でしょ
仮に数値でしか指定できないとしてもそれは1発ではキャストできないという制限があるだけ
0568NAME IS NULL垢版2020/06/26(金) 22:58:54.30ID:???
>>567
ただ書いている質問に答えただけだ
いつまで面倒くさいことやってんだよ
0569NAME IS NULL垢版2020/06/26(金) 23:17:27.29ID:8xj3vrR+
>>565
皮肉のつもりだろうが、文字列も数値も内部表現とは異なるよ。
0570NAME IS NULL垢版2020/06/26(金) 23:22:35.68ID:???
>>568
おまえ言い訳君だろw

>言い訳?
>おかしいと言うならちゃんと指摘したらいいんじゃね?
0571NAME IS NULL垢版2020/06/26(金) 23:28:05.02ID:???
>>570
勝手にグダグダ言っててだれがだれだか知らんけどさ
質問主が知恵の足りない質問して、荒れて終息させないでどっかいっちゃったんだろ
本当に迷惑だわ
0573NAME IS NULL垢版2020/06/27(土) 00:17:00.96ID:???
>>572
そうなんだ、すまん質問主さん
ならどうしようもないな
ホント適当に切り上げてくれ
0574NAME IS NULL垢版2020/06/27(土) 07:05:42.26ID:???
>>565
Access知らんのはいいとして知らないなら黙ってなよ
Accessは#2020/06/27#の形式で日付を指定できるって話でキャストとかは関係ない
そもそも「文字列でも指定できる」ことと「文字列以外の方法で指定できる」ことの違いもわかってないのか?
0575NAME IS NULL垢版2020/06/27(土) 07:08:51.84ID:???
>>572
DBMSを書いてなかったけど質問内容は別におかしくないでしょ
0576NAME IS NULL垢版2020/06/27(土) 08:22:12.27ID:???
質問: 「◯年◯月」を日付型に変更したいのですが
回答: 「置換して日付型にキャストする」

以下斜め上レスの人
「なんでわざわざ置換するのか?」
「そもそも文字列として持っているRDBは少数派だよ」
「暗黙的な変換に違和感がないのならやめた方がいい」
「日付型を決まった文字列で指定する製品もあれば、そうでない製品も存在する。」
「日付を文字列で指定する製品しか知らないんだろ?」
「Accessは#2020/06/27#の形式で日付を指定できるって話でキャストとかは関係ない」

斜め上レスの人は入力は文字列じゃないと思いこんでるのかコレ?
そうだとしてもいろいろおかしいww
0577NAME IS NULL垢版2020/06/27(土) 09:41:00.29ID:???
>>576
> 「Accessは#2020/06/27#の形式で日付を指定できるって話でキャストとかは関係ない」
これは俺だが、>>565に対するレスで質問者とは直接関係しないから含めないで欲しい
0578NAME IS NULL垢版2020/06/27(土) 11:28:10.58ID:???
>>577
おかしなレスしてることを自覚したほうがいい
文脈読めずに普段から人に迷惑かけてるタイプ
0579NAME IS NULL垢版2020/06/27(土) 12:03:40.62ID:???
>>578
自己紹介?
どこがおかしいのか指摘できないなら黙ってなよ
0580NAME IS NULL垢版2020/06/27(土) 12:13:36.13ID:???
質問者がアクセスについて聞いているならともかく
アクセス限定の回答するって事が間違い

これはアクセスについて知ってるよという自己紹介でしかない
あるいはアクセスの宣伝をしたいのか?
0581NAME IS NULL垢版2020/06/27(土) 12:28:16.12ID:???
>>580
バカなの?
それとも日本語が理解できないの?

> これは俺だが、>>565に対するレスで質問者とは直接関係しないから含めないで欲しい
0582NAME IS NULL垢版2020/06/27(土) 12:37:18.31ID:lQsU1yWZ
>>576
それは日付型は関係なく文字列の変換にすぎない。
0584NAME IS NULL垢版2020/06/27(土) 13:32:07.28ID:???
>>583
そういう話は>>554, 558, 562, 565に言えよw
俺は
> Access知らんのはいいとして知らないなら黙ってなよ
って書いてあるんだし
0589NAME IS NULL垢版2020/06/27(土) 16:37:46.29ID:???
いきなり犯罪者の考え方とか基地害かよw
0590NAME IS NULL垢版2020/06/27(土) 21:36:53.19ID:???
>>587
わかる
勘違いの逆恨みで放火したり
煽り運転したりするやつ
0591NAME IS NULL垢版2020/06/27(土) 21:54:54.44ID:???
Excel VBAスレでよく発狂してるおじさんと同一人物っぽいね
技術的な話しても無駄だからスルー推奨
0592NAME IS NULL垢版2020/06/27(土) 22:22:35.52ID:???
>>590
いきなり犯罪者とか言う奴の方が怖いわ
自覚なさそうだしww
0593NAME IS NULL垢版2020/06/27(土) 22:39:04.77ID:???
煽り運転やストーカーの思考と同じだから
どっちかと言えば、黙ってろと言う人の方が怖い
0594NAME IS NULL垢版2020/06/27(土) 22:42:35.23ID:???
日本語の理解力なさすぎだろ
知らないなら黙ってた方が恥をかかなくて済むぞ
って言わないと理解できないのか?ww
0595NAME IS NULL垢版2020/06/27(土) 22:52:28.46ID:???
軽率に開示請求できる時代によくやるなぁ
0596NAME IS NULL垢版2020/06/27(土) 23:05:24.77ID:???
「俺の邪魔する奴は許さない!」

ですよね
0598NAME IS NULL垢版2020/06/28(日) 08:36:06.98ID:???
SQLを素でシークルって言ってるのを初めて聞いた

新鮮だった
0599NAME IS NULL垢版2020/06/28(日) 08:36:13.00ID:???
すげぇこいつらまだやっとるw
もっとやれやれ!
0600NAME IS NULL垢版2020/06/28(日) 09:01:12.93ID:???
>>596
恥ずかしいからやめたらって言われて逆上してるだけだろw
0601NAME IS NULL垢版2020/06/28(日) 22:04:29.06ID:zI4R0AVo
>>598
英語圏ではよく言うだろうね
0602NAME IS NULL垢版2020/06/28(日) 22:38:08.43ID:???
30年くらい前、シークェルみたいな言い方してた人がいたな
0605NAME IS NULL垢版2020/06/29(月) 01:44:48.04ID:p4nhH9Iw
問題なのはいまだにストラクチャードクエリーランゲージだと説明されるところかな。
0606NAME IS NULL垢版2020/07/05(日) 14:06:56.86ID:???
SQLiteで作成したデータベースファイルをSQLServerで読み込むことはできますか?
0608NAME IS NULL垢版2020/07/05(日) 20:57:32.79ID:3IvJ5boS
何がしたいのかよくわからない質問によく答えようとするね。
ExcelファイルのXML形式のデータを直接、読み込むようなことは言っていないと思う。
0609NAME IS NULL垢版2020/07/05(日) 21:49:38.57ID:???
>>608
>ExcelファイルのXML形式のデータを直接、読み込むようなことは言っていないと思う。

別人だが>>607のURLにはそんなこと書いてないぞ
どこ見てんの?

>>606
とりあえずスレチなのでSQL ServerのスレかSQLiteのスレへどうぞ
0610NAME IS NULL垢版2020/07/05(日) 22:04:01.91ID:???
>>607
レスありがとう
形式が違うから無理っぽいですね
他アプリで作られたデータベースファイルを参照したいのですが、
ずぼらせずにDBMSそろえたほうがよさそうですね

>>609
スレチでしたか、タイ産します
0611NAME IS NULL垢版2020/07/05(日) 22:16:18.22ID:???
>>609
よくわからん人なのでスルーでお願い

>>610
中身読んだ?
何をしたいのかよくわからんけど読み込みならODBCでいけることが多いよ
厳しい性能要件があるとか設定をいじりづらいマシンとか特殊な事情があるなら別だが
まあDBMS揃えられるならそれに越したことはないけどね
0612NAME IS NULL垢版2020/07/05(日) 22:33:39.86ID:3IvJ5boS
例え話がわからなかったか。質問者の表現だとまるでバイナリーデータをそのまま自分の手段で読み込む方法を知りたいと解釈できる。

回答者はそんなのおかしいからこうだと当然、示す。

この流れが自作自演に見て仕方がない。
0613NAME IS NULL垢版2020/07/05(日) 22:35:59.54ID:3IvJ5boS
設計の概念がないアドバイスはやめた方がいい。

ちゃんとデータ移行をする手順をわからせないと途中経過がわからないものを量産して自分も他人もはまる。
0614NAME IS NULL垢版2020/07/05(日) 22:56:12.79ID:???
>>608
> ExcelファイルのXML形式のデータを直接、読み込むようなことは言っていないと思う。
&#8597;
>>612
> 質問者の表現だとまるでバイナリーデータをそのまま自分の手段で読み込む方法を知りたいと解釈できる。

クマーかな?

>>613
途中経過?
ODBCとかリンクサーバーとかでググってから出直してこいよ
0615NAME IS NULL垢版2020/07/05(日) 23:00:09.58ID:3IvJ5boS
処理を繋いで原因不明のバグで苦しむタイプだな

別のセッションでデータが更新されることを考慮していない。
0616NAME IS NULL垢版2020/07/05(日) 23:10:23.66ID:???
間違い指摘されて書いてもない要件でイチャモンつけるクズw
0617NAME IS NULL垢版2020/07/06(月) 04:17:20.32ID:obRVc8Qx
SQLiteの内部データをSQL Serverに直接、読み込ませるという話なのに、勝手に脳内変換して、ODBC接続で解決させるあたりは勝手すぎる。

これはデータが動かないことを前提としたもので、かつSQLの文法そのものの違い、RDBMSの違いを安易に無視したもので、保守性にも問題がある。

SQL Serverはマテリアルズドに批判的なので、ついこう言ってしまう。

そもそも自作自演の疑いがあるんだが。
0618NAME IS NULL垢版2020/07/06(月) 04:18:04.73ID:obRVc8Qx
SQLiteの内部データをSQL Serverに直接、読み込ませるという話なのに、勝手に脳内変換して、ODBC接続で解決させるあたりは勝手すぎる。

これはデータが動かないことを前提としたもので、かつSQLの文法そのものの違い、RDBMSの違いを安易に無視したもので、保守性にも問題がある。

SQL Serverはマテリアライズドに批判的なので、ついこう言ってしまう。

そもそも自作自演の疑いがあるんだが。
0619NAME IS NULL垢版2020/07/06(月) 09:09:47.71ID:???
いちゃもん付けるだけ付けて何も解決してない2重投稿のゴミ。
0620NAME IS NULL垢版2020/07/06(月) 09:42:16.99ID:obRVc8Qx
だから手順を踏めと言っている。エスクポート、インポートを無視して、SQLiteが保証していないODBC接続を勧める方が基地階
0621NAME IS NULL垢版2020/07/06(月) 10:08:05.05ID:???
>>611
さんくす、ODBCで読み込みとか基本的なDB操作ならできるのかな
ちょとしらべてみます

>>617
なるほどね、SQLiteが作成したファイルは独自のフォーマットだから
SQLServerでは読み込まないほうがいいってことですか、さんくす
0622NAME IS NULL垢版2020/07/06(月) 11:40:25.72ID:???
いつものことながらDB板ではID付きを相手にしたほうが負け
論理が通じる相手じゃないんだから
0623NAME IS NULL垢版2020/07/06(月) 17:20:16.40ID:???
一般論で言うと、質問者がID付きで書き込む事は推奨だと思うぞ
0625NAME IS NULL垢版2020/07/06(月) 18:18:22.55ID:???
じゃあ、質問者以外のID付きはNGで良いんではないか
0626NAME IS NULL垢版2020/07/07(火) 02:36:32.55ID:???
なるほど、理論が通じる相手じゃないので、スルーってことで
0627NAME IS NULL垢版2020/07/07(火) 02:39:07.95ID:???
データ移行の方法を知りたいと脳内補完するほうがよっぽど自然だと思うが
直接とか、バイナリーデータをそのまま自分の手段で読み込むとか
おかしな脳内補完してんだな
0628NAME IS NULL垢版2020/07/07(火) 07:50:12.59ID:???
>>627
SQLiteで作成した「データ」をSQLServerで読み込むことはできますか?
と書かれてるならそうとも取れるけど読みたいのは「データベースファイル」だしね
まあ質問者がそこら辺をあまり区別してないことも考えられけどね
まあ既に質問者それなりに納得してるのに今更悔しがりすぎでしょw
0629NAME IS NULL垢版2020/07/07(火) 11:30:55.26ID:???
VBAおじさんがあらわれた!
どうする?

- たたかう
- スルーする
- ID付きを召喚する
0630NAME IS NULL垢版2020/07/10(金) 11:29:50.12ID:ZnmsHRPS
既存の複数テーブルを連結して、
連結した仮想テーブルにテーブルとしての名前を付けておく方法があったようなきがするんだけど
どうやってやるんだっけ?
0631NAME IS NULL垢版2020/07/10(金) 12:56:45.43ID:???
>>630
view?
じゃなければ最低限DBMS名と名前をつけた後に何したいかを書いてね
0632NAME IS NULL垢版2020/07/10(金) 17:47:46.34ID:???
しかもSQLの質問じゃねーし
0633NAME IS NULL垢版2020/07/10(金) 23:28:31.98ID:???
SQLServerなんですが、Pathを格納するのにふさわしいデータ型ってなんでしょう?
nvarchar(300)?ntext?nvarchar(max)?
0634NAME IS NULL垢版2020/07/11(土) 02:31:57.06ID:???
まずお前が言うPathとは何かを正確に定義しろ
0635NAME IS NULL垢版2020/07/11(土) 08:20:19.99ID:???
>>634
さんくす、PathはWindows10のディレクトリのことです、例えば
"C:\Program Files\Microsoft SQL Server\80\COM\sqlvdi.dll"とかです
日本語が混ざることもありますUTF8です
0638NAME IS NULL垢版2020/07/11(土) 11:29:12.42ID:???
>>635
windowsはファイル操作の文字コードは標準ではshift-jisを
使っていると思う
0640NAME IS NULL垢版2020/07/11(土) 12:51:27.85ID:???
WindowsのファイルパスとかはUTF-16LEが標準

SQL Serverのnvarcharも基本的にUTF-16用(古いUCS-2も含めて)
2019からchar/varcharでUTF-8をサポートするようになったけど
素直にUTF-16でnvarchar使うほうが堅い

長さはデフォルトの260の制限ありで使ってる前提なのかどうかによる
制限ありのまま使っててもサロゲートペアも考えるとmax以外は安心できない

ファイルパスの文字列はインデックス用と割り切って長さを制限しておいて
それとは別にバイナリでシリアライズしたものを格納しておいて
実際にPathを使う場合はそれを使うというのも一つ
0641NAME IS NULL垢版2020/07/11(土) 15:04:28.93ID:???
windows日本語環境 の標準入出力はshift -jis のままのはず
もしユニコードに変わっていたら既存バッチファイルとか
文字化けで動かなくなる
ただしwindowsの内部処理は全世界共通だからユニコードだと思う
例えばコマンドプロンプトの文字コードを調べる場合は
下記url参照
https://qiita.com/user0/items/a9116acc7bd7b70ecfb0
0642NAME IS NULL垢版2020/07/11(土) 16:18:56.64ID:???
>>636
そんなスレがあるのれすね失礼しました
>>637
さんくすそれでいってみます
>>638
たしかに昔からSHIFT−JISだったのにいつからか新規テキストがUTF8?16?に
なってたからエンコードかわったのかなと

>>640
サンクスなるほど特殊文字を使いまくってたら簡単に限界突破するんですね
厳密にするならテクニックが必要ですか

>>641
ゆわれてみたらたしかに過去のファイルとかの文字エンコードとか
問題出てきそうなのに
0643NAME IS NULL垢版2020/07/12(日) 16:03:13.83ID:FwpDDjYd
UTF-8にしようとした理由がわからない。
0644NAME IS NULL垢版2020/07/12(日) 16:13:19.88ID:???
>>643
いや勘違いとゆうか、メモ帳で新規作成するとUTF8になってたから
Win10からはUTF8になったのかなと
0645NAME IS NULL垢版2020/07/12(日) 16:15:22.05ID:FwpDDjYd
SQL Serverでnvarchar型を使うときは、この文字列はUnicodeですよという指定が毎回、必要になる。

UTF-8にしておけば何もかも解決すると思ってしまったんだろうが、Windows、SQL ServerにとってはUTF-8は扱いにくい。

自分自身も常にUTF-8を意識してつかわないといけない。アスキー文字はSJISでもUTF-8でも同じ文字コードだから、日本語がない場合はミスに気づきにくい。
0646NAME IS NULL垢版2020/07/12(日) 17:23:03.00ID:???
>>641
コマンドプロンプトのデフォルトエンコーディングが日本語環境ならcp932というだけ
それは特定アプリのエンコーディング設定のデフォルト値の話で他のアプリとは関係ない

ファイル名には絵文字も扱えるがcp932環境下で実行するバッチファイルだと
そのファイル名を文字列としては正しく扱えない
0647NAME IS NULL垢版2020/07/12(日) 17:23:04.66ID:???
>>630
Oracleの場合なら
create view か
create materialized view
0648NAME IS NULL垢版2020/07/12(日) 19:35:34.99ID:???
SQL Serverで扱う言語が多国語でないなら、SJIS選択で良いかも
0649NAME IS NULL垢版2020/07/12(日) 20:53:30.30ID:???
>>645
UTF-8なんてわざわざ使うものじゃないのね
文字エンコードなんて気にもしなくなってた
0650NAME IS NULL垢版2020/07/12(日) 22:40:16.78ID:???
nvarcharはUTF-8じゃねぇっつーの
0651NAME IS NULL垢版2020/07/13(月) 00:01:02.35ID:Ogkq8wUQ
UnicodeでUTF-16を使わせるものだけど、どのRDBMSもこういう歴史をたどっていて、nvarcharはUnicode用と説明している。UTF-8とUnicodeとnvarcharの関係がわかっていれば、こんなところで質問しないはず。
0652NAME IS NULL垢版2020/07/13(月) 00:59:38.50ID:???
ググって知ったかしようとしても
バレバレなのが辛いところだね〜
0653NAME IS NULL垢版2020/07/22(水) 01:31:24.51ID:???
使用環境オラクル
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 を用いて稼働日判定したいです
0654NAME IS NULL垢版2020/07/22(水) 01:59:00.68ID:???
何日前まで計算するつもりなのだろう?
0655NAME IS NULL垢版2020/07/22(水) 03:39:09.81ID:???
>>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なら稼働日ではないと断定できるということ?
0656NAME IS NULL垢版2020/07/22(水) 06:38:20.06ID:???
説明不足で申し訳ない
結果をそのままグラフにできるツールがあってそこに結果を投げ込もうとしている
だから0.05のOKNG判定は視覚的に工場責任者が判断
0/0は非稼働の運用になっている
稼働3日まで計算し、4日目以降はRemainの明細を別で表示させる予定
0657NAME IS NULL垢版2020/07/22(水) 06:42:10.43ID:???
1年で365カラムのデータ
10年で3650カラムのデータ
0658NAME IS NULL垢版2020/07/22(水) 09:57:47.85ID:???
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 追加すると今日のデータが無い場合にも対応出来ると思う
0659NAME IS NULL垢版2020/07/22(水) 11:40:36.04ID:LdTec9jX
おまえら暇だな
0660NAME IS NULL垢版2020/07/22(水) 15:18:43.94ID:???
それを見ていた君も暇人
0661NAME IS NULL垢版2020/07/23(木) 07:01:10.08ID:???
ありがとうございます
方向性分かったのでやってみます
こんなサイトがあったとは!こういうのに書いて質問したほうが分かりやすいので、活用します
0662NAME IS NULL垢版2020/07/23(木) 10:55:38.73ID:???
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
0663NAME IS NULL垢版2020/07/23(木) 19:29:08.32ID:???
何が言いたいかさっぱりわからんw
0664662垢版2020/07/23(木) 20:54:04.53ID:???
>>663
わからんかね?
658 を一部利用させてもらい作ってみた
ttps://rextester.com/YEOZQ54266
0665662垢版2020/07/23(木) 21:01:57.03ID:???
あー、ちょっと補足
今日の日付の代わりに固定値 2020/7/27を指定している
それとd0が今日でd1が1日前、d2が2日前…という形にしている(稼働日換算で)
0666NAME IS NULL垢版2020/07/27(月) 23:20:37.13ID:???
■やりたいこと
.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と、.のみです。それ以外の文字が出てくることはありません。

よろしくお願いします。
0667666垢版2020/07/27(月) 23:35:34.17ID:???
ググりが足りませんでした。

SELECT SUBSTRING_INDEX('.1.3.6.1.2.1.10.127.1.3.9.1.324', '.', -1);

でいけました。
スレ汚しすみませんでした。
0668NAME IS NULL垢版2020/08/05(水) 10:34:16.06ID:???
行き詰ってしまったので皆さんの知恵をお貸しください
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
0669NAME IS NULL垢版2020/08/05(水) 14:20:42.29ID:???
>>668
10~20行程度のサンプルデータとクエリをhttps://rextester.com/とかのサイトに上げて
欲しい結果セットイメージを書いてくれ

LEFT JOIN以下のところは無駄じゃないの?って感じる
0670NAME IS NULL垢版2020/08/05(水) 15:12:00.09ID:???
日付でgroup byしてhavingでcountが1だけとればいいんじゃね

てか直近って書いてるけど、直近三日分とかそんな感じか
まずちゃんとした要件考えたほうがいいんじゃね
0671668垢版2020/08/05(水) 16:13:08.44ID:???
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つの期間の集計をします
0672NAME IS NULL垢版2020/08/05(水) 16:23:30.04ID:???
>>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 コード
0674NAME IS NULL垢版2020/08/05(水) 18:05:59.01ID:???
>>671
やりたいことは理解できた

ROW_NUMBER() OVER(PARTITION BY コード ORDER BY 日付 DESC) のところを
DISTINCT DENSE_RANK() OVER(PARTITION BY コード ORDER BY 日付 DESC) にすれば良いと思う
日付が同日かどうかの判定で時刻を除いた部分での比較が必要ならもうちょい追加が必要

ただ考え方としてコード、期間、価格計で一旦まとめてから
その後に縦横変換するほうがスジがいい気がする
0676NAME IS NULL垢版2020/08/05(水) 18:43:35.01ID:???
↓こんな感じで先に求めたい集計期間の開始/終了日の表を作る
https://rextester.com/PIL77023

んでそれと購入テーブルをJOINさせて出力用の形に整形するのは最後
集計ロジックと整形ロジックを分けたほうがメンテがしやすい
0677668垢版2020/08/05(水) 22:13:57.31ID:???
>>674-676
みなさんありがとうございます
今試す時間がないので取り急ぎお礼だけで失礼します
参考にさせていただきます
0678NAME IS NULL垢版2020/08/06(木) 01:53:32.50ID:RlDmGsR2
結合する必要がないのに結合
SELECT句にSELECT文

集合演算の概念がないとやらかす典型
0679NAME IS NULL垢版2020/08/06(木) 07:49:56.75ID:???
【質問テンプレ】
・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すると、前の部分で該当なしがあるとその後が結合されません。
どうしたらいいか教えてください。
0681NAME IS NULL垢版2020/08/06(木) 11:03:19.36ID:???
SQL Serverのやつも縦横変換にはPIVOT使える
CASE式で頑張るよりかは多少マシ
0682679垢版2020/08/06(木) 16:14:25.78ID:???
>>680
PIVOTって聞いたこともなかった
調べて試したらくっそ簡単にできたwww
ありがとうございました
0683NAME IS NULL垢版2020/08/06(木) 17:39:06.82ID:???
有休休暇の前年度繰越のベストな実装って何?
0686668垢版2020/08/07(金) 12:27:43.29ID:???
>>674-676
みなさんありがとうございました
みなさんのヒントをいただいてなんとか実装できそうです
今回WITHとDENSE_RANK初めて覚えました
ありがとうございます
0687NAME IS NULL垢版2020/08/11(火) 19:28:58.64ID:???
SQL文の中に同じ定数が何度も出てきていて、それを変更したいときに全部変えるのが面倒なのですが、
最初にたとえばa=7, b=2みたいに宣言しておいて、SQL文の中で(データ+a)*bみたいな計算をすることはできますか?
0688NAME IS NULL垢版2020/08/11(火) 19:39:00.40ID:???
>>687
多くのRDBMSで独自にSQLを拡張してるから、DBMS何か書け
0689NAME IS NULL垢版2020/08/11(火) 22:32:28.94ID:???
>>687
「how to declare variables in <データベース名>」でググる
0690NAME IS NULL垢版2020/08/12(水) 00:03:04.85ID:???
自分なら、SQLを呼び出す処理言語側の文字列編集機能を利用すると思う
0691NAME IS NULL垢版2020/08/12(水) 11:10:53.53ID:???
>>688
access2000です

>>689
VBAの話が引っかかってきてSQLの話が見当たりません
0692NAME IS NULL垢版2020/08/12(水) 12:18:20.38ID:???
>>691
さすがに2000とか知らんけど

フォーム作ってそこにテキストボックスなりを追加して参照
標準モジュールで関数作る
パラメータクエリにする

ぐらいじゃね
0693NAME IS NULL垢版2020/08/12(水) 12:21:07.34ID:???
>>690
ホストアプリがあるならアプリ側でパラメタ使うのが良いけどな
文字列編集はインジェクションの問題があるからお勧めしかねる
0694NAME IS NULL垢版2020/08/13(木) 12:23:47.95ID:/Y5MMyFg
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入れるのめんどうだから試しにこういう方法だとどうかなと思って.
0695NAME IS NULL垢版2020/08/13(木) 12:56:55.33ID:???
inumがユニークならsizeとmd5でgroup byしてカウントが2以上のもの
ユニークじゃないならsizeとmd5とinumでdistinctしてから上記
0696NAME IS NULL垢版2020/08/13(木) 16:22:47.09ID:/Y5MMyFg
>>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;

こんなかんじでいけました.
0697NAME IS NULL垢版2020/08/13(木) 21:47:36.96ID:???
漠然とした変な質問になるけどクエリ1000行のスクリプトってどんなん?
そんなん扱うことあります?
0698NAME IS NULL垢版2020/08/13(木) 22:02:16.28ID:???
テーブル初期作成時のinsert文で作ったことはある
0699NAME IS NULL垢版2020/08/13(木) 22:06:03.40ID:???
たしかにそれなら1000行いくこともありますね
なんかまだよくわからないんすけど1000行くらいのSQL書けるようになってくれ言われて、ハイ?みたいな
行数の問題かーいと
0700NAME IS NULL垢版2020/08/13(木) 22:18:05.90ID:???
SQLをスクリプトで生成するようにしてて生成結果が1000行超えたことはある
2500行くらいになってた
0701NAME IS NULL垢版2020/08/13(木) 22:36:24.13ID:???
>>699
>1000行くらいのSQL書けるようになってくれ

かなりヤバイ臭いがするから
1~2年以内の転職を見越して仕事をしたほうがよさそう
0702NAME IS NULL垢版2020/08/13(木) 22:59:31.09ID:???
単純にINがめちゃくそ多いだけだったら笑う
0703NAME IS NULL垢版2020/08/13(木) 23:26:15.44ID:???
データをベタで書いて行数が多いSQLを指して
1000行くらいのSQL書けるようになってくれとは言わんだろう

ビジネスロジック盛り盛りの長ったらしいストアドを書いてるんじゃないの?
0704NAME IS NULL垢版2020/08/13(木) 23:30:35.12ID:???
>>703
勢いで書いてしまうかも知れないが、
半年後訳分からなくなりそう
0705NAME IS NULL垢版2020/08/16(日) 16:25:58.32ID:0fCZGJKA
googleて個人の検索履歴をすべて保存しているらしいんですがmysqlなんかのデーベース使ってるんですかね?
0706NAME IS NULL垢版2020/08/16(日) 18:52:04.52ID:???
GoogleならBigTableとかSpannerとかだろう
0709NAME IS NULL垢版2020/08/18(火) 12:14:31.56ID:???
>>689
ありがとう。
自分が使ってるマイナーDBでも、やりかた解ったよ。
0710NAME IS NULL垢版2020/08/19(水) 02:19:19.16ID:???
HeidiSQLで同じテーブルをコピーしたら容量のとこが毎回違うんだけど、これってアバウトな数値なんかな?
データもテーブルの型も同じはずなんだけどな
0711NAME IS NULL垢版2020/08/19(水) 16:24:07.32ID:???
>>710
たいていのDBで、テーブルのレコードが格納されている領域はある程度の空きを作るようになっている
だから実データ量が同じでもテーブルの格納に使う容量は同じとは限らん

そのHeidiSQLとやらが表示しているのが何かわからんし、それ以外の要因の可能性もまあなくはないがな
0712NAME IS NULL垢版2020/08/19(水) 17:46:32.07ID:???
データを追加する順番が全く同じでなければfill factorとかを含めて容量が変わる可能性はある

同じデータを同じソースからデータの順序を含めて同じ方法で複数回コピーしたんなら
fill factorは同じだろうからそれが原因で容量が毎回変わる可能性低いので
圧縮の失敗とか他のリソース状況に左右される要因のほうが可能性が高いかも

もしInnoDBでSHOW TABLE STATUSを使ってるんなら
Data_lengthやIndex_lengthはおおよその値みたいだから
INNODB_TABLESPACESみて実際の値で確認が必要
0713NAME IS NULL垢版2020/08/22(土) 16:44:07.34ID:???
>>701
遅レスでほんとすみません
他答えてくれた方々も

とりあえずまだ全貌わからずなのですが転職見据えつつでいこうと思います
ありがとうございます
0714NAME IS NULL垢版2020/08/25(火) 02:44:52.69ID:???
旧システムとかなり違う新システムを設計することになったのですが、
旧システムからのデータの移植も必要です。

テーブル設計がほぼ別物なのですが、大まかな流れとしてはどのように進めればよいのでしょうか?
0715NAME IS NULL垢版2020/08/25(火) 07:50:43.35ID:???
一般論すぎて答えようがない
0716NAME IS NULL垢版2020/08/25(火) 09:28:09.07ID:???
>>714
> 旧システムとかなり違う新システム
> 旧システムからのデータの移植も必要
地雷臭しかしない…
0717NAME IS NULL垢版2020/08/25(火) 10:26:12.08ID:???
それ自体は別に地雷臭はせんやろ
データ移行の伴う普通のシステム移行
0718NAME IS NULL垢版2020/08/25(火) 10:57:38.42ID:???
移行プロジェクトも普通の開発プロジェクトと流れは同じ
要件定義 -> 設計 -> 実装 -> テスト -> リリース -> 監視・運用

データ移行の要件はシステム移行の要件次第なので
システム移行計画がきちんと立てられてなければそこからやる必要がある

実装レベルだと既存データの精査やデータコンバージョン方法の検討とか必要だけど
全体の移行計画からすればそういうのは些末な問題
(新システムの設計時に考慮されてなければ詰む可能性はある)

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/
0719NAME IS NULL垢版2020/08/25(火) 11:03:37.23ID:???
>全く新しい、別の何かに、生まれ変わる
0720NAME IS NULL垢版2020/08/25(火) 11:10:48.97ID:???
> かなり違う新システム
> テーブル設計がほぼ別物
これのデータ移行が普通ねぇ…
0721NAME IS NULL垢版2020/08/25(火) 13:13:11.75ID:???
システム改修じゃなくて、新システム構築なんだから普通だろ

まあSQLの問題じゃないから、これ以上はどっか設計のスレいけ
0722NAME IS NULL垢版2020/08/25(火) 13:48:39.69ID:???
>>721
はいはい、システム移行したこともないド素人の貴重な意見ありがとうございますw
0723NAME IS NULL垢版2020/08/25(火) 14:04:04.80ID:???
>>722
そんな経験不足でなんで偉そうなんだよww
0725NAME IS NULL垢版2020/08/25(火) 14:41:58.92ID:???
自分が経験したことないから地雷臭がするんですよね。
わかりますよ。

でもその地雷臭はあなたから臭ってるだけですから。
0726NAME IS NULL垢版2020/08/25(火) 15:27:12.44ID:???
経験がないからノー天気になってるだけのド素人乙w
0727NAME IS NULL垢版2020/08/25(火) 15:36:58.30ID:???
SQLと全く関係がないし
DB設計を語るスレで思いっきりやってくれ
0728NAME IS NULL垢版2020/08/25(火) 15:54:51.59ID:???
質問者や回答者を揶揄することでしか自尊心を満たせなくなってるんやろな

いつもの人だろうけど↓こいつと思考パターンがそっくりで地雷臭どころか地雷そのものなんじゃ・・・
https://president.jp/articles/-/38175

「35年以上ドライバーをやっているから、運転技術は並じゃないんです。みんな俺をナメやがるけど、わかっていないだけなんです」
「アイツはわかっていないんですよ。俺は邪魔するやつに注意をしてやってるだけ」
0729NAME IS NULL垢版2020/08/25(火) 16:05:53.15ID:???
スレタイも読めずに新システム構築とか
0730NAME IS NULL垢版2020/08/25(火) 16:09:19.48ID:???
なるほど経験豊富な>>717,721の考え方を説明してくれてるのか
まあキチはどこにでもいるからw
0731NAME IS NULL垢版2020/08/26(水) 09:57:30.17ID:???
質問です。

JavaアプリからOracleDBにアクセスしています。
selectしたSQLの結果は、
DBサーバーキャッシュされ、
ResultSetのnext()でfetch数ごとにクライアントに取得してくる
といった認識なのですが、

このときIndexなどは
最初に結果キャッシュを作るまでに影響しているだけで
next()時には参照せず関係しないのでしょうか?
それともfetchする度に条件をみて結果キャッシュを作成しているのでしょうか?
0732NAME IS NULL垢版2020/08/26(水) 11:49:02.79ID:???
>>731
>next()時には参照せず関係しないのでしょうか?

SENSITIVEかどうかによるんじゃないかな
SQLじゃなくJavaの質問なので詳しくはJavaのスレで聞いてね
0733NAME IS NULL垢版2020/08/26(水) 21:35:32.89ID:???
sqlserverとかはメモリーにキャッシュしてるけどオラクルもそうじゃねえ
メモリー容量によるんじゃねえ
javaはよくわからんけどphpならそういう時は全件配列に読み込んで配列を回す
SQLサーバのメモリーを使うかアプリケーションサーバのメモリーを使うかの違いだけどださ
0734NAME IS NULL垢版2020/08/26(水) 23:16:14.54ID:???
Javaでどういうコード書いて、それがどういうSQLで発行されてるかだけど
カーソル使ってるんじゃなかったか

ORACLEのスレ行ってカーソルの動作聞くのが良いんじゃね
0735NAME IS NULL垢版2020/08/26(水) 23:37:19.08ID:???
ResultSet.TYPE_SCROLL_SENSITIVEっつうのがあるのよ
fetchするときにDBが更新されてれば更新後のデータが取得される

気になるなら通信内容を確認したり
DB側でどういうSQLが発行されてるかを覗けば良いと思う

ただAPIで公開されている以上の動作は告知なく変更される可能性があるので
確認した動作に依存するようなコードは書かないほうが良い
0736NAME IS NULL垢版2020/08/27(木) 00:26:23.94ID:???
そんなコロコロ変わるAPIでもなさそうだけどねぇ むしろDBMSによるところが大きそうなので移植のときに影響があるだろう
0737NAME IS NULL🐙垢版2020/10/01(木) 17:43:28.97ID:???
sqlserverのsqlについて質問いいですか?
一時テーブルから、本テーブルにデータを移行するsqlを作りたいです。
両テーブルは項目は同じだけれど、必須制約が異なり、本テーブルのみに必須制約がついている項目があります。その項目にはデフォルト値が設定されています。
Insert-Select文で、nullの場合はデフォルト値を設定するような書き方ができないでしょうか?

ISNULL(項目,default)←エラーになりますが、こういう事がやりたいです。
0738NAME IS NULL垢版2020/10/01(木) 18:01:45.48ID:???
isnullで間違ってないと思うが使い方が間違ってるんだろう
0739NAME IS NULL垢版2020/10/01(木) 21:47:30.24ID:???
defaultは値や項目名じゃなくて予約語だからな
ISNULLには指定できないだろう

あらかじめ挿入元テーブルをデフォルト値で更新しとくのが楽だと思うが
それかwhereで条件分けして2種類のinsert select文書くとか
0740NAME IS NULL垢版2020/10/01(木) 23:45:23.07ID:???
デフォルト値にしたいカラムだけ除いてinsert intoすればいいじゃん。カラムを列記するのが面倒くさいのか
0741NAME IS NULL垢版2020/10/02(金) 00:17:54.42ID:???
>>737です
やっぱり出来ないですよね…
一時テーブルにデータあった場合は、それを登録しなきゃあかんので、valueから外すとかも出来ないんですよねー
面倒だけど、ISNULL(項目,項目のデフォルト値)を手動で設定します。
ありがとうございました。
0742NAME IS NULL垢版2020/10/02(金) 02:25:40.48ID:yhrmxStj
>>737
デフォルト値はNULLが指定されたときに使われるものではない
0743NAME IS NULL垢版2020/10/02(金) 02:29:10.50ID:yhrmxStj
>>741
デフォルト値を勘違いする人間ばかりだから仕方ないけど、一方でNULLはNULLという値でもあるんだよ。
0744NAME IS NULL垢版2020/10/02(金) 09:58:46.73ID:???
nullは値じゃねえよ
大概の値が書けるとこで指定出来るだけ
本来指定出来ないとこでも指定できるようになってるケースも多い
0746NAME IS NULL垢版2020/10/02(金) 15:36:52.05ID:yhrmxStj
>>744
NULL valueと言ったりもします。日本語だとNULL値と言います。
0747NAME IS NULL垢版2020/10/02(金) 15:42:12.65ID:yhrmxStj
NULLは値がないことをあらわすのですが、NULLは値がないことを示す値で、NULLというデータがデータファイルに書き込まれます。
0748NAME IS NULL垢版2020/10/02(金) 15:43:28.01ID:yhrmxStj
NULLは値がないことをあらわすのですが、NULLは値がないことを示す値で、NULLというデータをあらわすデータがデータファイルに書き込まれます。
0749NAME IS NULL垢版2020/10/02(金) 17:35:37.50ID:???
>>737
どうしてもディフォルト値を明示したくなくてかつId列みたいな列がありレコードが一意に特定できるなら
insert into テーブル (Id, 非必須制約列)
 select Id, 非必須制約列 from 一時テーブル;
update テーブル
 set 制約列 = isnull(一時テーブル.非必須制約列, テーブル.非必須制約列)
 from 一時テーブル
 left join テーブル on 一時テーブル.Id = テーブル.Id;
みたいに一旦ディフォルト値を入れて元の値がNullで無いなら更新しちゃうぐらいしか思いつかん
0750NAME IS NULL垢版2020/10/02(金) 18:11:35.90ID:???
そもそもなぜその一時テーブルを元テーブルと同じにしないのか
0752NAME IS NULL垢版2020/10/02(金) 18:46:34.77ID:???
>>751 は一体何ができたつもりになってるんだろう…
0753NAME IS NULL垢版2020/10/02(金) 18:50:43.39ID:???
>>737
MERGE文を使えば出来そうな気がしないでもない(未検証)
0754NAME IS NULL垢版2020/10/02(金) 19:02:28.98ID:???
>>752
??
>>737のやりたいことと>>751にどういう違いがあるの?

>>737のやりたいことと>>749が違うことは理解できるんだけど
0755NAME IS NULL垢版2020/10/02(金) 19:31:05.84ID:???
>>737
あ、頑張ってMERGE文を使わなくても
拘りないなら、単純に2回insertすればいいのか

必須項目ありのものと
必須項目なしのものと

後者のinsert-selectのときに
insert項目から必須項目なしの項目を除けば
勝手にdefault値が入る
0756NAME IS NULL垢版2020/10/02(金) 19:33:11.83ID:???
今更だけど
なお、一意制約違反は考えないものとする
で、いいの?
0757NAME IS NULL垢版2020/10/02(金) 20:40:33.02ID:???
>>753
merge に対して insert は最大一回しか書けないから無理じゃね?
0758NAME IS NULL垢版2020/10/02(金) 20:42:10.54ID:???
>>754
>>737のやりたいこと理解してる?
まあ具体的にどこがおかしいと書けてない時点で…
0759NAME IS NULL垢版2020/10/02(金) 20:43:14.44ID:???
>>755
それ既に>>739に書かれてる
> それかwhereで条件分けして2種類のinsert select文書くとか
0762NAME IS NULL垢版2020/10/02(金) 21:14:48.46ID:???
>>761
insert が書けるのは WHEN NOT MATCHED [ BY TARGET ] で、これは最大一個しか書けない
0763NAME IS NULL垢版2020/10/02(金) 21:15:47.03ID:???
あー、INSERT文にはデフォルト値をリテラルで指定せず
テーブル定義から持ってきたかったってことか

INFORMATION_SCHEMAとか使って
デフォルト値を取得してそれをISNULLに渡してやればできるが
その手間をかける意味があるのかな?
0765NAME IS NULL垢版2020/10/08(木) 10:21:30.44ID:???
なんじゃこの流れ
デフォルト値書けばいいだけのところを2回インサートとかインサートしてからアップデートとかw
0766NAME IS NULL垢版2020/10/10(土) 07:49:23.38ID:???
うむ、あたまとろけそうだ
0767NAME IS NULL垢版2020/10/10(土) 15:10:26.65ID:???
ほんとうに関係ないことを聞くのかもしれないですけど、データベースをチューニングするとは具体的にどのようなことを指すのでしょうか?
統計情報をいじるとか、実行計画を変更することですか?

もしそうであるとするならば現状内部に搭載されているものよりもいい設計を自分達で作るということになるのでしょうか?
0768NAME IS NULL垢版2020/10/10(土) 16:26:14.46ID:???
DBMSの設定、動作環境を変える
DB設計を変更する
SQLを変更する
アプリケーションの作りを変更する

まあ、こんな感じか
0769NAME IS NULL垢版2020/10/10(土) 17:22:35.22ID:???
分かりやすいのは
SQLの書き方を変える、インデックス構成を変える、アプリのSQL発行回数を減らす

インデックスじゃなくテーブル設計を変更したりストレージの構成を変更したりすることもある
0770NAME IS NULL垢版2020/10/10(土) 17:47:23.55ID:ohvIi5QJ
>>769
SQLの発行回数を減らすという点だけは間違い。
0771NAME IS NULL垢版2020/10/10(土) 17:50:56.29ID:ohvIi5QJ
>>767
そのチューニングは、俗にSQLチューニングと呼ばれるもの。

DBMSの設定を変えることもチューニングと呼ばれるが、設定を変えなければいけない状況はほぼ終わっていることを意味する。
0772NAME IS NULL垢版2020/10/10(土) 18:52:40.96ID:fmeIQc78
昔はハードウェアのスペックが低く、ネットワークも遅かったから、チューニングなるものが必要だった。

いまのチューニングは性能無視の設計のせいで問題になっていることへの対応ばかり。
0773NAME IS NULL垢版2020/10/10(土) 19:09:02.00ID:???
続けたいならDB設計へ移動して
0774NAME IS NULL垢版2020/10/11(日) 00:05:12.53ID:???
「アプリのDB性能をチューニング」であればSQL(DML)の改善も含まれるだろうけど
>>767の書きっぷりだとDB単体のチューニングを意図してるのかな
キャッシュ設定とか同時接続数とかパフォーマンスに関わるパラメータ設定はいっぱいあるわけで
その手のパラメータ設定もDDLの一種だからSQLの範疇・・・・と強弁しようと思ったけど
設定ファイル直書きしないといじれないようなパラメータのほうが多いか

メモリやストレージ自体を増設して物理で殴るのもチューニングだし
テーブルの結合回数が少なくなるようにあえて正規化を崩して1テーブルにまとめるとか
過去データを別テーブルに切り出してテーブルを分ける&データ量を減らすのもチューニング
古いDBMSだとSQL文中で使うインデックスを指定できたりもしてそういうので性能改善するのもチューニング
少量であるマスタデータについてアプリ側でstaticに保持して都度DBから取得しないようにするのもチューニング
どこまでがDBのチューニングに該当するかは、>>767が意図してるチューニング対象次第
0775NAME IS NULL垢版2020/10/11(日) 00:50:11.01ID:htFnFZMI
20年くらい前の書き込みみたいだなw
0776NAME IS NULL垢版2020/10/11(日) 09:23:19.11ID:???
皆さんかなりわかりやすかったです!
ありがとうございます。

じゃあ自分も既存のSQLを効率化するために変更したことがあるのでチューニング経験があるって言えば嘘にはならないわけですね
0777NAME IS NULL垢版2020/10/11(日) 18:54:37.44ID:htFnFZMI
>>776
具体的に何をどうしたのかと必ず聞かれるから、結構、面倒な話になるよ。
0778NAME IS NULL垢版2020/10/13(火) 09:55:42.86ID:HZoI7/m3
集計の書き方がわからず、どなたか教えてください。

■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

■説明
来店者の人数の集計で
場所と日付・時間の集計表を作成したいです。
場所の数は少ないので各社ごとに問い合わせてもよいと思います。
よろしくお願いいたします。
0779NAME IS NULL垢版2020/10/13(火) 10:26:10.89ID:???
>>778
そもそもそれ集計ですらないだろw
表に組みたいならアプリ側でやった方がいい
支社単位ならまだ無理やりやれなくはないけど「東京支社」とか「大阪支社」とかどうやって出力する気なんだ?
0781778垢版2020/10/13(火) 12:03:54.61ID:HZoI7/m3
>>779.780
確かに集計ではないですね。
質問として適当ではなかったと反省しています。
実際は、関東地区(管轄する本社支店)の来店者数とか
全社での来店者数とかが必要になってくるわけでして。
支店ごと、地区ごとで、問い合わせるのはよいのですが、
アプリ側で加工するのではなく、
SQLの結果を回して表示できたらいいなと思っての質問です。
よろしくお願いいたします。
0782NAME IS NULL垢版2020/10/13(火) 12:09:18.72ID:???
case式やcrosstabでできるけど
メリットないからアプリでやるべき

それと対象の日付数が固定でないなら
日付を縦に時刻を横にしたほうがいい
0783NAME IS NULL垢版2020/10/13(火) 13:39:10.72ID:???
使ったことないけどrollupでなんとかなるんじゃね
0784NAME IS NULL垢版2020/10/13(火) 13:39:42.83ID:???
>>781
SQLの結果をどうやって表示するんだ?
何らかのアプリが必要だと思うが…
まさかpsqlで表示させるとかか?
0785NAME IS NULL垢版2020/10/13(火) 13:59:32.76ID:???
>>778
ムリにでもSQLで
表整形したいってのなら
それはそれで頭の体操っぽいお題か
0786778垢版2020/10/13(火) 16:26:31.51ID:HZoI7/m3
返信ありがとうございます。
SQLの結果をPHPで取得してforeachで回して表示するつもりです。
>782
そうですね。時間が横軸ですね。
時間固定で、日付が変動すると、私の拙い文章でよくわかっていただけました。
びっくりです。

SQLで元データを取得して、PHPで加工組直しして表示するよりも
SQLでデータをずばりを取得して、PHPで行表示の方がシンプルでないですか。

全社、あるいは東京と大阪の合計の日付・時間のクロス(?)集計は
どのようなSQLを投げますか?
みなさんは、データを丸っと抜いてアプリで集計しますか?
0787NAME IS NULL垢版2020/10/13(火) 17:48:14.42ID:???
>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
0788NAME IS NULL垢版2020/10/13(火) 20:56:51.40ID:???
PHPって縦横変換が簡単にできないの?
transposeとかそういう名前の関数でだいたい一発なんだけど
0789NAME IS NULL垢版2020/10/13(火) 22:02:47.85ID:???
phpなら表示はwebページだと思うけど横長のテーブルは
横へのスクロールが面倒で見にくいから縦長にしたほうが
いい。人間の目は横方向にスライドして見ていくのが苦手だから比較は縦方向に並べたほうがいい。
0790NAME IS NULL垢版2020/10/13(火) 22:52:59.85ID:???
SQLの場合はピボットする時も含めて
基本的に横のカラム数が固定で縦の行数が可変なんだよ
逆もできなくもないけど面倒になるだけ
0792NAME IS NULL垢版2020/10/14(水) 00:50:51.70ID:???
>>791
null渡すのがなんか微妙だけどそのくらいでできるならアプリでやったほうが簡単そうに思える
0793778垢版2020/10/15(木) 15:15:31.24ID:3rqzyp6L
出張があって返信できませんでした。
みなさん、ありがとうございます。
>787 SQLありがとうございました。その線でいきます。助かりました。
>788 縦横といいますか、CでもJava(多分)でもPHPでも多元配列に入れて添え字の
入れ換えだと思います・・・。>791さんはarray_map使って格好いいです。
私はたぶんfor文を入れ子にするとかの泥臭いやり方です。
0794NAME IS NULL垢版2020/11/12(木) 10:23:22.89ID:???
すみません、
SQL Server Developerエディションについて教えて下さい。
このエディションは開発用となっていますが、機能的にはスタンダードと同レベルで使えるのでしょうか?
また実稼働では使用不可とはおもいますが、ライセンス的にはどこでみわけてるのでしょうか?
使用していると定期的に確認メッセージが出たりするのでしょうか?
0796NAME IS NULL垢版2020/11/12(木) 19:43:36.05ID:???
>>794
>>1 を読め
> このスレは
> 「こういうことをやりたいんだけどSQLでどう書くの?」
> 「こういうSQLを書いたんだけどうまく動きません><」
> などの質問を受け付けるスレです。

なのでこっちへ行け
Microsoft SQL Server 総合スレ 12
https://mevius.5ch.net/test/read.cgi/db/1534679537/
0797NAME IS NULL垢版2020/11/29(日) 22:11:58.15ID:???
質問させてください。
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
0798797垢版2020/11/29(日) 22:19:41.74ID:IfXrDILF
書き忘れましたが、テーブルは弄れないです。出力方法だけでどうにかしたい。
説明にある現在の出力結果は↓みたいな状態

ID TEAM   DRIVER      CAR_Num
------------------------------------
1 Ferrari   Leclerc,Vettel  16,5
3 Mercedes Hamilton,Bottas 44,77

TABで区切ってたので表示が見づらくすみません
0799NAME IS NULL垢版2020/11/29(日) 22:37:38.58ID:???
team_id、team_id + 1 で
二人分のdriver_idを求めても良いのかな
0800797垢版2020/11/29(日) 22:51:38.61ID:IfXrDILF
>>799
引退などでdriverテーブルからドライバーが削除される場合、driver_idにが必ずしもdriver_id+1じゃなくなる場合があります。
たとえば上記例でBottasが引退してnewbieという新人がMercedesのドライバーになった場合、newbieのdriver_idは5になるので…できないことになるかと
0801NAME IS NULL垢版2020/11/29(日) 22:55:29.76ID:???
team_idとdriver_idを紐付ける情報が無いと無理でしょう
その情報をもたせた新しいテーブルを作ると言うのは?
0802797垢版2020/11/29(日) 23:48:20.51ID:IfXrDILF
>>801
自分はSELECTするだけで作れない立場なんです…
string_agg(driver.name, ',' ORDER BY driver_id)でHamilton,Bottasって配列みたいになっているはずなので
そこからSPLIT(string_agg(driver.name, ',' ORDER BY driver_id)',', 1)みたいにしてn番目の要素を取り出すことができればいいんですが
0803NAME IS NULL垢版2020/11/29(日) 23:59:23.14ID:???
>>802
どのチームのドライバが引退して新人が来るか分からないんでしょ?
そうするとテーブル途中のドライバが引退し、最後に新人が追加されることもあると思うよ
0804797垢版2020/11/30(月) 00:16:03.97ID:mk7AKPzA
>>803
確かにそうなのですが、ドライバーが引退した場合、そのレコードは削除(使用不可)されるので、
例えばdriver_idが3のBottasが引退して削除、その後DRIVERテーブルにdriver_idが5のnewbieがteam_id 3として新規追加された場合、
string_agg(driver.name, ',' ORDER BY driver_id)の結果はHamilton,newbieのように出力されるからいける気がしたんです
0805797垢版2020/11/30(月) 00:16:46.80ID:mk7AKPzA
Bottasのdriver_idは2でした。失礼しました
0806797垢版2020/11/30(月) 01:13:20.43ID:mk7AKPzA
普通に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
0807NAME IS NULL垢版2020/11/30(月) 23:26:02.52ID:???
>>797
もう解決したみたいだけどwindow関数使うやり方を書いておく
https://rextester.com/FYRWPG99446

こういうのはアプリ側でやったほうが簡単だしテストや変更管理も楽でいいと思う
0808NAME IS NULL垢版2020/12/15(火) 12:01:32.79ID:zQSBdFCX
select date(time),count(*) from a group by date(time);
これで日付毎のカウントは出せるんですけど、やりたいのは、その日付までのcountなんです。
それを出来ればワンライナーでやりたい
出来るでしょうか?
0810NAME IS NULL垢版2020/12/20(日) 12:06:59.88ID:???
100m走の記録で、
名前、日時、記録、付随情報
というデータがたくさんあります
全記録の最高はMaxで簡単に求まりますが、歴代最高の変遷を一覧にして、そのレコードの全項目を表示させたいです
JOINを何度か使えばできないことはないのですが、ものすごく重くなってしまいました
できるだけ軽く一覧を出力するにはどうしたらいいか教えてください
0811810垢版2020/12/20(日) 13:24:33.28ID:???
すみません、自己解決しました
WHERE句に、SELECTでその日時以前の記録の最高を取得してそれがレコードの記録と一致しているものというふうに指定したらあっさり出ました
お騒がせしました
0812NAME IS NULL垢版2020/12/20(日) 13:27:02.81ID:???
select T1.*
from  TableName T1
where  not exists (
        select *
        from  TableName T2
        where  T1.日時 > T2.日時
        and   T1.記録 > T2.記録
    )
;
0813NAME IS NULL垢版2020/12/25(金) 14:49:01.43ID:???
CREATE USERはCREATE文とUSER句によって構成されているの?
それとも、CREATE USER文?
0815NAME IS NULL垢版2021/02/09(火) 22:58:24.78ID:9NjCCljT
専ブラBB2Cでワッチョイを正規表現でNGしたいんだけどうまくいかない
第2オクテット(仮にXXとして)だけ固定でこれじゃダメだろうか
.*XX.*
0816NAME IS NULL垢版2021/02/11(木) 08:07:42.02ID:???
ちょっとみなさん
SQLでCASE WHEN...って書くとSQLがわけわかんなくなるから
なるべくコードでやるようにしてたんですが

逆なのか!?
じつはSQLだけで独立してテストできるから
コード上で分岐がいらないから
SQLのほうにCASE WHEN書いたほうがいいんですか!???
0817NAME IS NULL垢版2021/02/11(木) 10:45:27.88ID:???
まさか抽出条件までをコード実装してるのか?
ありえんだろ
0818NAME IS NULL垢版2021/02/11(木) 10:48:38.21ID:???
さすがにそんなことしない
カラムの値の切り替え
0819NAME IS NULL垢版2021/02/11(木) 10:56:09.76ID:???
caseを全否定するならなら最初からちゃんと書けよ
1つの抽出項目を複数カラムで共有する程度でわかんなくなるなら
コードでやっておけば良い
0820NAME IS NULL垢版2021/02/11(木) 11:10:50.23ID:???
わからんだけで
テストはしやすい

テストしやすいんだ
0821NAME IS NULL垢版2021/02/11(木) 11:15:03.37ID:???
開発とメンテ要員で持ってる手駒と相談しな
SQLじゃない
0822NAME IS NULL垢版2021/02/11(木) 11:38:32.91ID:???
ケースバイケース
常にどちらかがいいわけじゃない
0823NAME IS NULL垢版2021/02/11(木) 12:01:31.63ID:???
パフォーマンスと変更しやすさのトレードオフ
0824NAME IS NULL垢版2021/02/11(木) 14:42:10.54ID:???
DBのほうが速いし変更しやすいじゃねーか
0825NAME IS NULL垢版2021/02/11(木) 14:55:37.55ID:???
>>824
そう感じる人はSQLで書くほうがいい選択
0826NAME IS NULL垢版2021/02/11(木) 23:25:36.43ID:PiRh1S8f
>>816
SQLにするとテストはいらないという不思議な日本人はかなりいるのでそうなることがある。
0827NAME IS NULL垢版2021/02/11(木) 23:29:33.85ID:PiRh1S8f
SQLはストラクチャードクエリーランゲージの略ではないよ。
0828NAME IS NULL垢版2021/02/15(月) 23:12:03.28ID:???
CASEをSQL内に移動しまくったが
変更がSQL内で完結しなくなって一瞬で破綻した
結局どっちも手入れなきゃいけなくなるなら
最初から融通が利くプログラムに書いたほうがいいじゃねーか
0830NAME IS NULL垢版2021/02/16(火) 00:00:00.67ID:???
移動しまくるほどCASE式使うのは使い方がおかしいか設計がおかしい可能性大
0831NAME IS NULL垢版2021/02/16(火) 09:20:56.80ID:???
おかしい世界に合わせなきゃ生きていけないんだよおおおお
0832NAME IS NULL垢版2021/02/16(火) 12:17:29.11ID:???
修正先のSQLってプログラムとべつに存在してるのか?
0833NAME IS NULL垢版2021/02/16(火) 13:51:22.49ID:???
ストアド使うパターンと埋め込み使うパターンとあるからな
0834NAME IS NULL垢版2021/02/17(水) 03:26:45.75ID:???
その状態で>>828みたいなことになるなら俺も設計がおかしいと思うぞ
0835NAME IS NULL垢版2021/02/17(水) 12:47:26.40ID:???
Excel脳だとひとつ上の行の列〇〇が△△ならこの行の列□□を■■するなんて平気で言うからw
0836NAME IS NULL垢版2021/02/17(水) 14:40:12.81ID:???
それはCASE式だけじゃ解決できないしSQLでやるべき処理でもないな
0837NAME IS NULL垢版2021/02/22(月) 16:26:52.56ID:???
ネットの掲示板みたいなデータって、以下みたいに連番で管理するのが普通だと勝手に思ってるのですが、
何千億件にもなるかもしれないレコードから数個のレスを抽出する場合、全レコード走査みたいになってパフォーマンスが落ちたりしないんでしょうか?
----------------------------------------------------
| スレッド番号 | 自身のレス番号 | 内容 |
|--------------------------------------------------|
|   12345   |     1     | 内容 |
|--------------------------------------------------|
|   〜数千万の 他スレのデータレコード〜   |
|--------------------------------------------------|
|   12345   |     2     | 内容 |
|--------------------------------------------------|


双方連結リストにして、再帰クエリで[次のレス番号]が _ になるまで辿るのと、どっちがパフォーマンスいいのでしょうか?
-----------------------------------------------------------------------
| スレッド番号 | 自身のレス番号 | 次のレス番号 | 内容 |
|---------------------------------------------------------------------|
|   12345   |     1     |     2   | 内容 |
|---------------------------------------------------------------------|
|   12345   |     2     |     _   | 内容 |
|---------------------------------------------------------------------|
0838NAME IS NULL垢版2021/02/22(月) 17:08:25.66ID:???
>>837
スレッド番号+レス番号で常にデータが並ぶようにインデックス貼るから
後者が前者よりパフォーマンスがよくなることはない

レス番1の次はレス番2なのはわかりきってるのに
それをわざわざデータで管理するのは無駄

現実的なことを言えばすべての板のすべてのスレを1つのテーブルで管理しないし
キャッシュするので毎回DBのテーブルを読みに行ったりもしない
0839NAME IS NULL垢版2021/02/22(月) 23:03:50.07ID:???
連結リストはないにしてもクラスタ化インデックスのないDBだとパフォーマンスの問題出てくる
パーティショニングで軽減できるけど件数が多いと困りそう
クラスタ化インデックスがあるDBでもインサート量によっては
ページスプリットが頻発して問題が出てくる可能性がある

てことで今ならRedis使うかな
0840NAME IS NULL垢版2021/02/23(火) 20:34:10.74ID:VuNQtHeV
>>837 はただ単にインデックススキャンの概念がわかっていないだけじゃないのか
0841NAME IS NULL垢版2021/02/23(火) 22:29:40.26ID:???
SQL Serverで統計情報を一気に百個作れるクエリって書けますか…?
一個一個作るの大変なんです…
0842NAME IS NULL垢版2021/02/23(火) 22:49:55.67ID:hKEGBDE+
>>841
何のためのT-SQLなのか
0843NAME IS NULL垢版2021/02/24(水) 00:19:13.89ID:???
SQL Serverで統計情報を手動で作る必要があったことはないな

必要ならクエリを生成する簡単なプログラム書けばいいんじゃないの?
条件の種類が多ければ簡単じゃないかもしれないけど
0845NAME IS NULL垢版2021/02/24(水) 03:56:16.62ID:???
検証を行いたくて取り敢えず検証環境に統計情報を100個ほど作成する必要があるんです…
出来ればそのクエリを教えていただけるとありがたいです…
0846NAME IS NULL垢版2021/02/24(水) 10:31:54.27ID:???
検証でいきなり100個も手動で作る意味がわからん
リンクのページに説明してあるAUTO_CREATE_STATISTICS オプションやAUTO_UPDATE_STATISTICS オプションは理解してる?
0847NAME IS NULL垢版2021/03/04(木) 19:29:19.31ID:???
MS SQL Server 2000でConcat関数を使いたいのですが
ストアドで作れますか?
0848NAME IS NULL垢版2021/03/04(木) 21:15:31.42ID:???
ISNULLと+で基本同じことはできる
が20年前のバージョンを使う意味がわからん
0849NAME IS NULL垢版2021/03/06(土) 01:35:40.78ID:???
どの製品も
ドキュメントが都合の悪いことかいてなすぎ
データベース界隈闇が深すぎる
0850NAME IS NULL垢版2021/03/06(土) 01:37:19.00ID:???
SQLがエラーになったとき
なんでエラー番号がついてないんでしょうか。
調べにくすぎます
0851NAME IS NULL垢版2021/03/06(土) 01:58:28.48ID:???
エラーメッセージが親切なRDBを選びましょう
0852NAME IS NULL垢版2021/03/06(土) 20:58:48.48ID:NVAocQUJ
安かろう悪かろうだからな
0853NAME IS NULL垢版2021/03/06(土) 22:48:52.40ID:???
エラーメッセージはOracleが一番不親切だけどなw
0854NAME IS NULL垢版2021/03/06(土) 23:32:12.24ID:IktepjBV
>>853
あえて変えてないだけだよ。他のRDBMSは原因がたくさんあっても、すべて同じだったりとこっちの方が困る。SQL Serverなんてどうすりゃいいのかわからないエラーコードをはく。
0855NAME IS NULL垢版2021/03/06(土) 23:33:28.02ID:IktepjBV
MySQL系はなんか間違ってますというエラーメッセージばかり。
0856NAME IS NULL垢版2021/03/06(土) 23:36:12.11ID:???
Oracleが最も不親切
次にMySQLが不親切
どっちもボラクル
0857NAME IS NULL垢版2021/03/07(日) 00:00:28.08ID:5tx0Ca07
マニュアル無視タイプだな
0858NAME IS NULL垢版2021/03/07(日) 08:36:13.65ID:???
「ORA-XXXXX?なにこれわけわかんない。もっと親切なメッセージ表示して!」
0859NAME IS NULL垢版2021/03/07(日) 16:03:11.69ID:???
あえてエラーメッセージを不親切にすることで
DBコンサルティングwな仕事を作ってんだよ
リテラシーの低い時代遅れの企業でしか使われないRDB業界のCOBOL
0860NAME IS NULL垢版2021/03/07(日) 21:57:04.27ID:???
マニュアル読めない顧客のかわりに仕事するのはごく普通のことだが
0861NAME IS NULL垢版2021/03/08(月) 08:57:49.82ID:cCLh9unq
>>859
製品マニュアルを無視するタイプでしょ?
0862NAME IS NULL垢版2021/03/08(月) 09:34:18.52ID:???
ORA-12550
詳細: 構文エラーが発生しました
0863NAME IS NULL垢版2021/03/08(月) 11:04:43.11ID:???
>>841
メンテナンスプランで統計情報の自動更新できるけど
0865NAME IS NULL垢版2021/03/08(月) 14:34:13.37ID:cCLh9unq
初心者か
0866NAME IS NULL垢版2021/03/10(水) 03:02:29.24ID:???
SQLって独学でスキル伸ばすの難しいですね
独学でやろうにもテストデータやテスト用テーブルを用意するのが手間
そもそも大量のテーブルJOINしたりwindow関数で優先度付けたりと複雑なSQLは業務用件をなんとか実現するうえで出来上がるものだし独学だとそういうのを書く動機や発想がないというか

独学で時間かけてダラダラやるより実戦で2週間ほど揉まれたほうが圧倒的に伸びる
0867NAME IS NULL垢版2021/03/10(水) 11:43:32.19ID:???
テストデータやテーブルを用意するのが面倒だと感じるならDBMSが用意してるSample Database使えばいい
SQL ServerのAdventureWorksやWideWorldImportersのようなやつ

データ量が足りなければインサート文を生成するスクリプトか直接インサートするスクリプトを書いてデータを足せばいい
100万件くらいならそれで十分

簡単なスクリプトを書く技術力を持ち合わせてないならSELECT INSERTとかSQLの範囲でできることをやればいい
それもまた勉強になる
0868NAME IS NULL垢版2021/03/10(水) 11:50:21.69ID:kfO0BfR8
的外れ
0869NAME IS NULL垢版2021/03/11(木) 20:59:42.35ID:???
Oracleがややこしすぎるからそういう印象になるのかもしれない
インストール簡単なフリーの使えよ
0870NAME IS NULL垢版2021/03/11(木) 21:34:35.29ID:???
Oracleはインストールだけで400万とってた時期あったなww
そりゃ売れなくなるよ
0871NAME IS NULL垢版2021/03/11(木) 22:26:53.82ID:???
どのランキングみてもいまだにOracleがトップシェアだが、売れなくなったってのはどこの話?
0873NAME IS NULL垢版2021/03/11(木) 22:54:25.25ID:???
大阪市のシステムでOracleにバグがあると分かってたのに何も通告しなかった
シェア以前の信義の問題だな
0874NAME IS NULL垢版2021/03/11(木) 23:06:28.02ID:???
MySQL込みでベンダーとしてはOracleがトップシェアですってオチでしょ

オラクル信奉者は世情に疎くて技術力が低いやつが多くて嫌だよねー
0876NAME IS NULL垢版2021/03/11(木) 23:47:44.84ID:???
ほらね、リテラシーが驚くほど低い

db-engines.comのランキングはpopularityであってマーケットシェアではない
販売数量や金額などの情報は全く加味されてないデータ
2番目のstatista.comは1番目のdb-engines.comが元ネタなので同じ
3番目のt4はMySQL+OracleでベンダーとしてはOracleがトップですよって書いてる
0877NAME IS NULL垢版2021/03/11(木) 23:55:54.99ID:???
そういうダメ出しじゃなくてデータは出せないの?
0878NAME IS NULL垢版2021/03/12(金) 00:16:09.99ID:???
商用DBMSでOracleがトップシェアじゃないというならトップはMS SQL Serverか?
Expressを数に含めるのかどうかとか難しいな。
0879NAME IS NULL垢版2021/03/12(金) 00:28:12.08ID:???
適当にググってもだいたいORACLEっぽいけどなぁ
まぁぺーぺーSEにはどうでもいいけど
0880NAME IS NULL垢版2021/03/12(金) 00:36:23.84ID:???
アマゾンやGoogleは何使ってたっけ
0881NAME IS NULL垢版2021/03/12(金) 00:37:48.17ID:???
>>877
信頼できる調査会社のレポートはタダじゃないんだよ
個人で買えるような価格じゃないから必要なら会社で買ってもらってくれ
0882NAME IS NULL垢版2021/03/12(金) 00:44:13.53ID:???
問:シェアはどの位?
答:企業秘密です
0883NAME IS NULL垢版2021/03/12(金) 12:07:28.89ID:???
オラクルのAnnual Report見れば
新規のライセンスが右肩下がりなのはすぐわかるよ

Javaの有料化はDBの落ち込みをカバーするため
0884NAME IS NULL垢版2021/03/12(金) 13:07:36.92ID:???
さっそくサイト見にいったらいまだにWeb Forms使っててビックリ
前々から思ってたがオラクルってWeb周りの技術力ないよな
0885NAME IS NULL垢版2021/03/12(金) 13:53:07.85ID:???
Cobol使い続けるのと同じ匂い
0888NAME IS NULL垢版2021/03/12(金) 21:39:30.86ID:???
Web+DBが流行り始めた当時、まだcgiのサイトも多かったけどmod_plsql使ったOWSは爆速だったな。
0889NAME IS NULL垢版2021/03/12(金) 21:42:37.74ID:4vmjrkQr
>>884
自分の仕事が減る恐怖から批判しても意味はない。オラクル社はビジネスとしてやっているんだから、サポートに費用がかかることを勧めるはずがない。
0890NAME IS NULL垢版2021/03/12(金) 21:43:41.33ID:4vmjrkQr
>>888
その中途半端に古い知識で語るのはやめろよw
0891NAME IS NULL垢版2021/03/12(金) 21:48:18.03ID:4vmjrkQr
Webサイトを見てどうとか周回遅れにもほどがある。
0892NAME IS NULL垢版2021/03/12(金) 22:03:32.44ID:???
Web周りの技術力ってISSとWebSphereとOASのどれが優れているかとかいう議論ならわかるが、
「あそこはまだWebForm使ってるんだって。ププw」って優越感感じてるなら逆に恥ずかしい。
0893NAME IS NULL垢版2021/03/12(金) 22:09:19.34ID:4vmjrkQr
Google Formの利用拡大をどう非難できるのか、彼に尋ねてみたいわ。
0894NAME IS NULL垢版2021/03/12(金) 22:11:49.65ID:4vmjrkQr
だいたいWebLogicを擁するオラクル社に対してWeb技術が低いとか頭がおかしいのかね。
0895NAME IS NULL垢版2021/03/12(金) 22:15:07.96ID:???
Webでのシェアってどの位?
0896NAME IS NULL垢版2021/03/12(金) 22:19:39.47ID:4vmjrkQr
シェアじゃなくてどれだけビジネスとして成功しているかだろw
0897NAME IS NULL垢版2021/03/12(金) 22:26:26.38ID:???
>>892
論点分かってない上に加齢臭がやばいな
0898NAME IS NULL垢版2021/03/12(金) 22:28:54.59ID:???
なんというか>>874の言う通りだな
一人だけならいいんだけど
0899NAME IS NULL垢版2021/03/12(金) 22:31:30.53ID:???
いまだにWeb Forms使っててビックリ→Web周りの技術力ないよな

ここにどんな論点が?
0900NAME IS NULL垢版2021/03/12(金) 22:43:10.92ID:???
>>898
それは「Oracleをdisる俺に反論する奴は全員Oracle信奉者」ってやつだな
0901NAME IS NULL垢版2021/03/12(金) 22:48:00.47ID:4vmjrkQr
Web画面屋さんの仕事が減ってカリカリしてんのかな?
0902NAME IS NULL垢版2021/03/12(金) 22:58:22.68ID:4vmjrkQr
Oracle APEXを使っていれば、オラクル社のサポートがあるんだから何が気に入らないのかさっぱりわからない。
0903NAME IS NULL垢版2021/03/12(金) 23:56:40.33ID:???
GoogleやアマゾンもOracle使ってるの?
それならシェアは大きいだろうなw
0904NAME IS NULL垢版2021/03/13(土) 00:07:40.20ID:rDR1FBCT
シェアにこだわる理由がわからない。数はどの製品も右肩上がりなんだし。
0905NAME IS NULL垢版2021/03/13(土) 00:11:30.11ID:???
シェアについては自慢できないわけですか?
0906NAME IS NULL垢版2021/03/13(土) 00:22:14.43ID:rDR1FBCT
無償版を含めるとOracle DatabaseとSQL Serverで現実は9割だろうな。
0908NAME IS NULL垢版2021/03/13(土) 00:45:23.63ID:rDR1FBCT
MySQLはいまだにポンコツだしな
0909NAME IS NULL垢版2021/03/13(土) 00:48:23.84ID:???
MySQLの性能を上げるわけには行かないんだろうな
0910NAME IS NULL垢版2021/03/13(土) 01:03:09.94ID:rDR1FBCT
よく勘違いされるけど、MySQLはサン・マイクロシステムズを買収したら、くっついてきたもので、オラクル社が買収したわけではない。
0911NAME IS NULL垢版2021/03/13(土) 01:06:48.57ID:???
余計なものなら手放せば良いのに
0912NAME IS NULL垢版2021/03/13(土) 11:35:51.33ID:???
>>892
>Web周りの技術力ってISSとWebSphereとOASのどれが優れているかとかいう議論ならわかるが

わかんねーよwww
わかるのはお前だけやぞ
ISSてw
0913NAME IS NULL垢版2021/03/13(土) 12:31:35.35ID:rDR1FBCT
とりあえずWebと言っておけば、時代に取り残されていないと思っているんだろうな。
0914NAME IS NULL垢版2021/03/13(土) 12:42:01.44ID:???
Oracleもクラウド事業ってやってたんだっけ?
シェアはどれくらい?
0915NAME IS NULL垢版2021/03/13(土) 12:56:56.33ID:???
だから単なる誤字をあげつらっても恥ずかしいだけだってw
0916NAME IS NULL垢版2021/03/13(土) 13:22:20.05ID:rDR1FBCT
>>914
AWS上で動いているOracle Databaseの多さを知ったらびっくりするタイプ?
0917NAME IS NULL垢版2021/03/13(土) 14:35:20.20ID:???
>>915
単なる誤字をあげつらってると捉えるほうが恥ずかしいぞ

DB板だから基本的なWebの技術を知らない事は別に恥ずかしいことじゃない
恥ずかしいのは自分がどのくらい無知なのかを自覚せず斜め上のレスを繰り返してる事
0918NAME IS NULL垢版2021/03/13(土) 14:43:28.95ID:???
お釈迦様の手のひらに乗って得意そうにしている孫悟空の図
0919NAME IS NULL垢版2021/03/13(土) 14:47:30.70ID:???
ISSってもしかしてIISのことだったの?
Web周りの技術力と言われてWebSphereやOASを出してくるのもどうかと思うが比較対象にIISを入れるのはもっとどうかと思う
0920NAME IS NULL垢版2021/03/13(土) 15:06:31.27ID:SZN15G0F
OASが昔のものだと指摘しない、IISがたいしたものではないと思っている等、知識がおかしいな。
0921NAME IS NULL垢版2021/03/13(土) 15:45:28.46ID:???
OASってまだ息してるの?
10年以上前に終わった製品だと思ってたんだが
0922NAME IS NULL垢版2021/03/13(土) 17:55:28.69ID:U+US2J/5
Oracle Application Server 10gを知っている人間が少ない。
0923NAME IS NULL垢版2021/03/13(土) 18:03:52.91ID:???
>>921
そいつの時計の針は20年前で止まってる
0924NAME IS NULL垢版2021/03/13(土) 18:25:30.89ID:???
逆に言えばその昔からアプリケーションサーバーやWebフレームワーク作る技術は持っていたってことじゃん。
0926NAME IS NULL垢版2021/03/13(土) 19:26:15.80ID:???
>>925
10年前に使ったと言うかあるシステムの前提ソフトだったからセットアップしたことはある
0927NAME IS NULL垢版2021/03/13(土) 21:07:55.41ID:???
>>924
20年前ならアプリケーションサーバー製品の優劣が
ITベンダーのWeb周りの技術力を測る指標の一つにはなったかもしれんな

20年前ならね
0928NAME IS NULL垢版2021/03/13(土) 21:20:47.52ID:???
>オラクル信奉者は世情に疎くて技術力が低いやつが多くて嫌だよねー
これってさオラクル使い続けてるような会社はベンダー依存度が高く保守的なカルチャーのところが多いから
技術者が育ちにくかったり技術トレンドを把握してなかったりする傾向が強いんじゃないかな
そう考えると汎用機やCOBOLと同じ匂いがする理由もよく分かる
0929NAME IS NULL垢版2021/03/13(土) 21:41:46.38ID:???
>>928
COBOLerと違って自分たちがレガシー化してることに自覚がないから余計に質が悪い
0930NAME IS NULL垢版2021/03/13(土) 21:52:44.31ID:???
SQLのテストむずかしくないですか
分離できないし
0931NAME IS NULL垢版2021/03/13(土) 22:03:44.64ID:rDR1FBCT
>>930
ちゃんとテストするのは本当に難しい。

SQLのテストをしない文化があるところだと、なんでもかんでもSQLに処理を押し付けて隠蔽して、手抜きをする。
0932NAME IS NULL垢版2021/03/13(土) 23:43:42.92ID:???
>>928
OracleはNULLと空文字列の同一視をいい加減どうかしてほしいってのとやたら金がかかるところを別にすれば
そう悪いところはないと思うがな。
Oracleがレガシーだと言っている人たちはいったい何を使っているんだろう。もはやRDBMSじゃないのかな。
0933NAME IS NULL垢版2021/03/13(土) 23:55:03.25ID:???
SELECTがFROMの前にくるのってくそめんどくさいよ
microsoftががまんできなくなってオレオレSQL作っちゃうだけあるよ
0934NAME IS NULL垢版2021/03/14(日) 00:08:43.32ID:???
>>932
日頃SQL-Server使ってるせいもあるけど例えばTO_CHAR()の書式修飾子とかなかなか慣れんわ
なんでまたトグル動作なんてわけわからん仕様にしたんだろ…
0935NAME IS NULL垢版2021/03/14(日) 00:23:57.15ID:???
Oracleは動きが遅すぎるからなあ
0936NAME IS NULL垢版2021/03/14(日) 00:24:46.37ID:???
新しいフレームワークに対応させるのにどれだけ時間かけてるのかって…
0937NAME IS NULL垢版2021/03/14(日) 00:28:11.51ID:r8cV92Rv
しつこく同じことばかり書くおっさんばかり
0938NAME IS NULL垢版2021/03/14(日) 00:31:22.35ID:r8cV92Rv
エドガー・F・コッドは後出しでNULLと空文字を分けた。数値型まで空を定義するように言ってしまったが、数値型の空数値については意味不明で、どの製品も無視している。
0939NAME IS NULL垢版2021/03/14(日) 01:07:16.31ID:???
オラクルはnullと空文字区別しないんだっけ?
0940NAME IS NULL垢版2021/03/14(日) 02:52:22.47ID:r8cV92Rv
>>939
文字型は空文字列という値がない。空文字列のつもりでシングルクォーテーションでくくられた見た目が空文字列のものを、自動的にNULLとみなす仕様がある。
0941NAME IS NULL垢版2021/03/14(日) 10:28:03.50ID:???
>>933
べつにOracleに限らず、SQLをどうにかしてほしいってのは確かに思う。
COBOLと同じで「英文に近ければ誰でも使えるんじゃね?」って発想していた時代の産物だしな。
0942NAME IS NULL垢版2021/03/14(日) 10:31:54.48ID:r8cV92Rv
>>941
俺もSQLの構文は好きじゃないけど、デファクトスタンダードになってしまうと、もう変えられないからなあ。
0943NAME IS NULL垢版2021/03/14(日) 11:11:51.88ID:???
select句にcase式で数十個の分岐を書きたいのですが、
ルーチンのように先頭か末尾に書くことはできないのでしょうか。
0944NAME IS NULL垢版2021/03/14(日) 12:04:55.84ID:???
>>943
ユーザー定義の関数にすれば?
SQLiteとかじゃなければSQLで関数定義できると思うけど
0945NAME IS NULL垢版2021/03/14(日) 12:07:00.78ID:r8cV92Rv
>>943
見た目をすっきりさせたいという意図なら、WITH句を使う。

下記のようなサイトを参考にして
https://itsakura.com/sql-with
0946NAME IS NULL垢版2021/03/14(日) 12:15:50.94ID:???
それじゃすっきりしねーよ
0947NAME IS NULL垢版2021/03/14(日) 13:20:30.16ID:r8cV92Rv
本人がどう質問しているのかよく読みましょう。
0948NAME IS NULL垢版2021/03/14(日) 15:07:40.16ID:???
関数の意味でルーチンって言ってるのかもね
0949NAME IS NULL垢版2021/03/14(日) 15:40:44.22ID:???
Oracleは独自拡張でWITH句で関数定義できるからそのこと言ってるんじゃないの?
じゃなければ間違ったWITH句の使い方
0950NAME IS NULL垢版2021/03/14(日) 15:58:09.44ID:???
これだからオラクルユーザーはw
0951NAME IS NULL垢版2021/03/14(日) 16:39:09.16ID:???
その手のは言ったもん勝ちだな。

これだからOracleユーザーはw
これだからSQLServerユーザーはw
これだからMySQLユーザーはw

言われにくいのはPostgresくらいかな。
0952NAME IS NULL垢版2021/03/14(日) 17:22:39.59ID:???
>>951
まーた文脈読めないレスしやがって
これだからAccessユーザーはww
0953NAME IS NULL垢版2021/03/14(日) 17:50:46.58ID:???
これだから他DBMSユーザーを貶すことしかできない奴はw
0954NAME IS NULL垢版2021/03/14(日) 17:54:36.87ID:???
>>932
RDBMS製品としてのOracleがレガシー化してるという話ではなく
Oracleを使い続けてるような組織や技術者がレガシー化してる(もしくはレガシー化しやすい)という話でしょ

当てはまらない会社がないわけではないけど傾向としては思い当たる節がかなりある
0955NAME IS NULL垢版2021/03/14(日) 17:59:49.51ID:???
OracleでSQL覚えたため、そのあと外部結合の書き方で苦労した
0956NAME IS NULL垢版2021/03/14(日) 18:13:58.58ID:???
わかる
(+)の書き方に慣れちゃった 結合条件は全てWHEREにないと落ち着かない
0957NAME IS NULL垢版2021/03/14(日) 18:59:49.73ID:???
組織や技術者のレガシー化ってまた意味がよくわからん雰囲気ワードだな。
具体的にはどういう状態のことを言っているんだろう。
0958NAME IS NULL垢版2021/03/14(日) 19:06:53.31ID:GjReX37m
>>956
それOracleだけじゃなくて、他のRDBMSでもその構文は使える。

標準SQLの方がよい構文はそちらがスタンダードになっているだけ。

ここは本当に中高年しかいないなw
0959NAME IS NULL垢版2021/03/14(日) 19:19:55.84ID:???
>>955
MySQLで覚えてたらもっと酷いことになってた
0960NAME IS NULL垢版2021/03/14(日) 19:29:53.11ID:???
(+)構文がオラクル以外でも使えるって初耳だが
ググってもそれらしい情報出てこんし
0961NAME IS NULL垢版2021/03/14(日) 20:10:07.13ID:???
少なくともSQL-Serverではdocsには載ってないから使えないと思う
秘密のコマンドでOracle互換モードとかあるのかも知れんがw
0962NAME IS NULL垢版2021/03/14(日) 20:22:16.65ID:r8cV92Rv
>>960
PostgreSQL、Db2など。

そもそもどの製品も独特な外部結合構文を持っていて、Oracle Databaseだけが独特なのではない。
0963NAME IS NULL垢版2021/03/14(日) 20:47:53.70ID:???
そういう話じゃないと思うが・・・
0964NAME IS NULL垢版2021/03/14(日) 21:12:24.04ID:???
>>957
>Web周りの技術力ってISSとWebSphereとOASのどれが優れているかとかいう議論ならわかるが、

↑これがレガシー化
自覚がない本人かもしれんが
0965NAME IS NULL垢版2021/03/14(日) 21:31:09.20ID:???
相当なルサンチマンを抱えてるんだろうなw
0966NAME IS NULL垢版2021/03/14(日) 22:53:26.21ID:???
レガシー化というのは時代の変化や環境の変化に対応できなくなってること

旧式化して時代遅れになってると言ってもいいが
簡単にはリプレースできないしがらみや機能や考え方が硬直的というニュアンスも含む
逆に硬直性の無いものはレガシーとは言わない

人に対して使う場合は時代遅れと老害を足して2で割ったものと思っておけばいい
0967NAME IS NULL垢版2021/03/14(日) 23:12:19.06ID:???
普段言われている奴が使いたがる用語
0968NAME IS NULL垢版2021/03/15(月) 00:56:53.79ID:???
943です、皆さん回答ありがとうございます
やりたかったのは、食品の販売だとすると、
イチゴや大根の商品コードを対して、果物や野菜、といった分類をCASE式でつけたいのですが、20行程度のSQLの冒頭に数十行のselect句があると頭でっかちに感じた次第です。
0969NAME IS NULL垢版2021/03/15(月) 01:03:00.08ID:???
>>968
例えばイチゴの場合に果物か野菜かの判定をSQL文の中で行わせたいって事か?
0970NAME IS NULL垢版2021/03/15(月) 01:19:12.21ID:???
>>968
それは商品コードを管理するマスタに分類を持たすとか、判断用のビュー作とかするのが普通じゃないかと思うんだが
まあ、設計はスレ違いではあるが、設計見直すべきだと
0972NAME IS NULL垢版2021/03/15(月) 08:22:46.90ID:???
>>970
>>管理用のビュー
943です。ビューならいじりやすいですね。20年前にソフト屋さんに作って貰った販売管理で、データ取得用のビューがあります。ただ上のコード分類とて30か50個の商品コードのことです。規模が小さいのにオラクルなので他のソフト屋さんに驚かれます。
0973NAME IS NULL垢版2021/03/15(月) 10:11:02.70ID:8bMPGxFo
>>972
20年前ならOracleかSQL Serverの二択ですからね。
0974NAME IS NULL垢版2021/03/15(月) 11:41:58.64ID:???
普通にPostgreSQLやMySQLも使われてただろ
0975NAME IS NULL垢版2021/03/15(月) 11:42:41.74ID:8bMPGxFo
普通w
0976NAME IS NULL垢版2021/03/15(月) 12:09:48.61ID:???
SQL SERVERですが decimalの最大桁数(Permission)とバイト数について
1 - 9桁 5バイト
10 - 19桁 9バイト
20 - 28桁 13バイト
29 - 38桁 17バイト
となってると思いますがデータの桁数が多少変動し不明確な場合、
極論各バイト数の最大(9桁、19桁、28桁、38桁)をとっておけば、
実際の桁数少なくてもバイト数も変わらないし無駄はないかなと思っているのですが、この考え合っていますでしょうか?
皆さんどうされていますか?
0977NAME IS NULL垢版2021/03/15(月) 15:35:38.96ID:???
>>968
それはCASE式じゃなく分類コードを管理するテーブルを作るべきケース
行と列の縦横変換はPIVOTとかの関数を使う

分類が変化しそうにもないなら既存の商品テーブルに分類コードのカラムを追加するのが望ましいが
なんらかの事情でそれが難しいようなら商品コードと分類コードの紐付きを管理するだけの別テーブルを作るのでも構わない
0978NAME IS NULL垢版2021/03/15(月) 15:49:14.81ID:???
>>976
バイト数以外で最大有効桁数を制限しておきたい理由がなければその方針でいいんじゃない
とりあえず9桁にしておくってみたいなケースはよくあるよ

PermissionじゃなくPrecisionね
0979NAME IS NULL垢版2021/03/15(月) 20:32:28.15ID:8bMPGxFo
>>976
桁数は大きくしておいて、どうしても小さくしたいのなら、あとから変えればいいだけ。
0980NAME IS NULL垢版2021/03/15(月) 20:35:28.41ID:8bMPGxFo
日本円の金額項目なら、9桁は小さいから、よく考えた方がいい。
0981NAME IS NULL垢版2021/03/16(火) 23:50:58.51ID:???
MAXが1億って、比較的小さい規模の企業ではないかな
個人商店でも溢れそうな気がする
0982NAME IS NULL垢版2021/03/17(水) 00:24:46.52ID:???
仮に金額入れるとしても9桁で十分なユースケースはいくらでもあるだろう
smallmoneyとか何のためにあると思ってるんだ?

それに9桁ならMAXは約10億だぞ
大丈夫か?
0983NAME IS NULL垢版2021/03/17(水) 11:07:02.06ID:5VYW3mpQ
間違ってますよ
0984NAME IS NULL垢版2021/03/17(水) 11:08:02.26ID:5VYW3mpQ
約10億という言い方が馬鹿っぽい
0986NAME IS NULL垢版2021/03/17(水) 12:02:24.73ID:5VYW3mpQ
おちんちんが小さくて恥ずかしいです。
0987NAME IS NULL垢版2021/03/17(水) 18:23:25.88ID:???
馬鹿っぽいと言っておけば
自分の馬鹿さを隠せるとでも思ったのか
0988NAME IS NULL垢版2021/03/17(水) 18:56:12.21ID:5VYW3mpQ
仕事の会話だったら、普通は9億いくつという言い方をする。約10億だと10億以上もあるということになり、認識がずれてしまう。
0989NAME IS NULL垢版2021/03/17(水) 19:44:25.72ID:???
スレが活発になって嬉しいw
0990NAME IS NULL垢版2021/03/17(水) 21:23:38.42ID:???
桁数の話してるんだから普通の人は約10億で最大九億九千九百九十九万九千九百九十九ってわかると思うんだが…
0991NAME IS NULL垢版2021/03/17(水) 21:49:39.92ID:5VYW3mpQ
0992NAME IS NULL垢版2021/03/17(水) 21:50:17.62ID:5VYW3mpQ
中学校からやり直しですね。
0993NAME IS NULL垢版2021/03/17(水) 21:51:05.93ID:5VYW3mpQ
正確には小学校からだった。
0994NAME IS NULL垢版2021/03/17(水) 21:58:14.11ID:???
毎度赤っ恥かく原因はクソみたいなマウンティング精神にあることを気付こうな
いい年してそれじゃヤバいで
0995NAME IS NULL垢版2021/03/17(水) 22:39:56.28ID:5VYW3mpQ
やばいですね。
0996NAME IS NULL垢版2021/03/22(月) 23:31:39.87ID:???
with句とfromのサブクエリ、皆さんどのように使い分けていますか?
0997NAME IS NULL垢版2021/03/23(火) 14:44:47.25ID:/NGqi0As
>>996
基本的には前者にしておく。
0998NAME IS NULL垢版2021/03/23(火) 20:51:04.53ID:???
ほかが戸惑わないようにサブクエリ
1000NAME IS NULL垢版2021/03/23(火) 21:44:51.12ID:/NGqi0As
WITH句は徐々に浸透しているから、WITH句を使わない決まりがないなら、WITH句はどんどん使うべき。
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 670日 1時間 19分 11秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況