SQL質疑応答スレ 16問目 [転載禁止]©5ch.io
レス数が1000を超えています。これ以上書き込みはできません。
0001NAME IS NULL
2015/11/10(火) 22:07:38.40ID:???「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。
SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。
質問するときはDBMS名を必ず付記してください。
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
前スレ:
SQL質疑応答スレ 15問目
http://peace.2ch.net/test/read.cgi/db/1402919549/
0002NAME IS NULL
2015/11/10(火) 22:09:00.55ID:???Oracle Database
http://docs.oracle.com/cd/E57425_01/121/SQLRF/toc.htm
Microsoft SQL Server
http://msdn.microsoft.com/ja-jp/library/bb510741
IBM DB2 Database
http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/c0004100.html
PostgreSQL
http://www.postgresql.jp/document/current/html/sql.html
MySQL
http://dev.mysql.com/doc/refman/5.7/en/sql-syntax.html
http://dev.mysql.com/doc/refman/5.6/ja/sql-syntax.html
参考リンク
http://sql.main.jp/cont/sql/map.html
http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
http://www.geocities.jp/oraclesqlpuzzle/
http://www.techscore.com/tech/sql/
0003NAME IS NULL
2015/11/10(火) 22:10:13.52ID:???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
2015/11/10(火) 22:11:19.91ID:???(問)
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
2015/11/10(火) 22:12:29.80ID:???(問)
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
2015/11/10(火) 22:13:39.32ID:???(問)
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
2015/11/10(火) 22:14:51.52ID:???(問)
列の数が可変な問合せはどう書きますか?
(答)
標準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
2015/11/10(火) 22:16:01.06ID:???(問)
年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい
例:201006を指定したら、以下の結果を得たい
20100601
20100602
・
・
・
20100630
(答)
SQLでは存在しないデータを生成することはできません。
この問いの場合は素直にカレンダーテーブルを用意しましょう。
どうしてもやりたければ以下のような方法もなくはないですが、
再帰問合せの本来の使い方ではありません。
やめておくことを強くお奨めします。
(PostgreSQLのgenerate_series()関数なら辛うじてセーフかもしれませんが
賛否の分かれるところでしょう。)
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ならこれを適当に改変すれば動きますが
どのみちお奨めしません。
0009NAME IS NULL
2015/11/10(火) 22:25:16.15ID:???0010NAME IS NULL
2015/11/11(水) 00:11:34.95ID:???これをうまく並べ替えれないですかね?
3.12.1
3.8.1
こういう二つのバージョンがあった場合、文字列ソートだから後者の方が大きいと判定されてしまうんですよね。
やっぱりバージョンのドット毎に区切った数字をカラムに保存して、ソートするしかないでしょうか?
0011NAME IS NULL
2015/11/11(水) 18:51:31.29ID:???ピリオドの数固定なら
PostgreSQLだと split_part() と lpad() 組み合わせてなんとかなったけど
0012NAME IS NULL
2015/11/11(水) 19:18:28.66ID:???ver_raw = '1.23.4'
ver_mj = 1
ver_mi = 23
ver_se = 4
てな感じに。これだと "2.11.5_revB" みたいな変なものがきても、格納はできる。
0013NAME IS NULL
2015/11/11(水) 20:17:19.69ID:???0014NAME IS NULL
2015/11/13(金) 17:41:51.54ID:???・DBMS名とバージョン
MariaDB 10.0.21
・テーブル
ID,DATA,col1,col2,col3
・説明
SELECT ID, DATA AS DATA_A FROM table WHERE col1 = 100 AND col2 = 2 AND col3 = 0;
SELECT ID, DATA AS DATA_B FROM table WHERE col1 = 100 AND col2 = 3 AND col3 = 0;
SELECT ID, DATA AS DATA_C FROM table WHERE col1 = 100 AND col2 = 4 AND col3 = 0;
col1,col2.col3の内容によって、DATAカラム内の意味が変わってくるテーブルです。
上記3つのSQLの結果を以下の用に一行でまとめたいです。
ID,DATA_A,DATA_B,DATA_C
このような事は可能でしょうか?
UNIONやgroup byでは厳しそうなので相談させてください。
宜しくお願いします。
0015NAME IS NULL
2015/11/13(金) 17:50:20.53ID:???0016NAME IS NULL
2015/11/13(金) 17:57:57.53ID:???ID | DATA | col1 | col2 | col3
--+-----+-----+---+-----------
1 | aaa | 100 | 2 | 0
1 | bbb | 100 | 3 | 0
3 | ccc | 100 | 3 | 0
2 | ddd | 100 | 2 | 0
2 | eee | 100 | 4 | 0
3 | fff | 100 | 2 | 0
↓
ID | DATA_A | DATA_B | DATA_C
---+--------+--------+------
1 | aaa | bbb | 0
2 | ddd | 0 | eee
:
:
0017NAME IS NULL
2015/11/13(金) 18:09:42.07ID:???0018NAME IS NULL
2015/11/13(金) 19:26:16.88ID:???>>5のsum()のかわりにgroup_concat()を使う
0019NAME IS NULL
2015/11/13(金) 23:13:15.96ID:???> col1,col2.col3の内容によって、DATAカラム内の意味が変わってくるテーブルです。
あんさんが書いた内容だと、col1 は 100、col3 は 0 固定なんだが
とりあえず col2 で変わると言うことか?
そもそも >>16 見ると ID でまとめてる様に見えるし
データがないところに NULL じゃなくて 0 を入れればいいのか?
ID と col2 が同じレコードは複数ないのが前提なのか?
0020NAME IS NULL
2015/11/14(土) 17:56:40.28ID:???・DBMS名とバージョン
Oracle 11gR2
・テーブルデータ
table_a
id parent_id
---- ---------
1 null
11 1
111 11
1111 111
1112 111
2 null
22 2
222 22
23 2
223 23
224 23
table_b
id cost
---- ---------
1111 100
1112 200
222 300
223 400
224 500
・欲しい結果
id SUM(cost)
---- ---------
1 300
11 300
111 300
1111 100
1112 200
2 1200
22 300
222 300
23 900
223 400
224 500
・説明
table_aはid - parent_idで階層になっている。
table_aの階層毎にtable_bのcostの集計値を表示させたい。
階層の深さは一定ではない。
0021NAME IS NULL
2015/11/14(土) 21:10:35.03ID:???with cum (id, parent_id, cum_cost) as (
select t1.id,
t1.parent_id,
coalesce(t2.cost, 0)
from table_a t1
left outer join
table_b t2
on t1.id = t2.id
where not exists (
select *
from table_a t3
where t1.id = t3.parent_id
)
union all
select t4.id,
t4.parent_id,
coalesce(t6.cost, 0) + t5.cum_cost
from table_a t4
inner join
cum t5
on t4.id = t5.parent_id
left outer join
table_b t6
on t4.id = t6.id
)
select id,
sum(cum_cost)
from cum
group by id
order by to_char(id)
;
0022NAME IS NULL
2015/11/15(日) 00:46:14.76ID:???今現在環境がないので、月曜日に試してみます。
0023NAME IS NULL
2015/12/01(火) 19:58:51.94ID:???■PostgreSQL 9.4
■テーブルデータ
id|price|created_at
------------------
1|500|2015-11-01 00:00:00.00000+09
2|500|2015-11-31 00:00:00.00000+09
3|300|2015-12-01 10:00:00.00000+09
4|500|2015-12-01 20:00:00.00000+09
5|400|2015-12-02 15:00:00.00000+09
■欲しい内容
2015年12月のレコードからpriceのみがほしい。
同じ日付のpriceを全て足した状態でほしい。
800←1日の300+500
400←2日の400
0024NAME IS NULL
2015/12/02(水) 00:26:39.36ID:???where created_at between '2015-12-01 00:00:00' and '2015-12-31 23:59:59'
group by day order by day ;
日付はいらないのかな・・
0025NAME IS NULL
2015/12/02(水) 01:18:28.41ID:???ご指摘されてから日付も必要だと気づきました
試してみてうまくいきました
ありがとうございます
0026NAME IS NULL
2015/12/02(水) 06:56:53.70ID:???'2015-12-31 23:59:59.00001' ~ '2015-12-31 23:59:59.99999' のデータを取りこぼしちゃう…
0027NAME IS NULL
2015/12/02(水) 13:00:04.86ID:???0028NAME IS NULL
2015/12/21(月) 18:32:01.84ID:???・DBMS名とバージョン
Oracle 12c
・テーブルデータ
employees表には名前(employee_name)、給与(salary)が入っています。
grade表には、grade列、low列、high列があり
各gradeの範囲が格納されています。
・質問
下記、最高給与の従業員名と給与、給与等級を表示するSQL文です。
「salary = (SELECT MAX(salary) FROM employees)」、「salary BETWEEN low AND high 」
のどちらが検索条件で、どちらが結合条件でしょうか
SELECT employee_name, salary, grade FROM employees, grade
WHERE salary = (SELECT MAX(salary) FROM employees)
AND salary BETWEEN low AND high
0029NAME IS NULL
2015/12/21(月) 20:03:59.26ID:6czbpcbH後者。
何この質問?
宿題?
0030NAME IS NULL
2015/12/21(月) 20:04:56.43ID:6czbpcbH0031NAME IS NULL
2015/12/21(月) 20:11:18.81ID:???0032NAME IS NULL
2015/12/21(月) 21:10:08.83ID:ozDeyBqIこんな用語知らなくても実務じゃ問題なかろう
0033NAME IS NULL
2015/12/22(火) 03:57:36.25ID:???そして少なくとも今回の場合、用語がどちらに当てはまるものかはきわめて容易に分かるよね。
その上で>>32のレスを書いたということ?
0034NAME IS NULL
2015/12/22(火) 07:03:32.73ID:???普通にここの検索条件見直せとか言うだろ
くそ忙しい時に検索条件ってどれですかぁ?
なんて間抜けなこと聞かれたらブチ切れられて当然だと思う
0035NAME IS NULL
2015/12/22(火) 10:50:38.89ID:???0036NAME IS NULL
2015/12/22(火) 11:41:35.78ID:???ただの捨て台詞だよね?
0037NAME IS NULL
2015/12/22(火) 11:45:56.45ID:???そういうシチュエーションはいらないと思います。
0038NAME IS NULL
2015/12/22(火) 12:53:03.62ID:???003938
2015/12/22(火) 12:54:41.62ID:???テーブル構造の質問です
0040NAME IS NULL
2015/12/22(火) 13:33:42.07ID:???http://peace.2ch.net/test/read.cgi/db/1444733172/
とかどう?
0041NAME IS NULL
2015/12/22(火) 19:49:10.84ID:???>>32 > こんな用語知らなくても実務じゃ問題なかろう
 ̄ ̄ ̄ ̄
まあ、DB回りは俺一人で開発してる
とかなら知らんが
0042NAME IS NULL
2015/12/22(火) 19:53:13.39ID:???実務で使うかどうかすら聞いてないんでしょ?
0043NAME IS NULL
2015/12/22(火) 20:46:53.76ID:???何か書き込みあったかと思って見てみれば…
0044NAME IS NULL
2015/12/22(火) 20:57:56.09ID:???その人がどの人か知らんけど、俺は >>32 にレスしてるだけ
0045NAME IS NULL
2015/12/22(火) 21:03:24.88ID:???実務でそんな話が出たらWHERE句全体のことかと思いそうだが。
>>28の検索条件と結合条件って実際呼び分けてる?
0046NAME IS NULL
2015/12/22(火) 21:06:02.81ID:???0047NAME IS NULL
2015/12/22(火) 21:24:17.70ID:???呼び分けてない
0048NAME IS NULL
2015/12/22(火) 22:26:22.87ID:+RAFY3WQ結合条件と絞込条件
俺は検索条件というあいまいな言葉は使わないな。
0049NAME IS NULL
2015/12/22(火) 22:59:18.71ID:???区別したことないわ。
0050NAME IS NULL
2015/12/22(火) 23:44:03.90ID:+RAFY3WQFROM句で結合条件を書く方法だとそれでいい。
WHERE句で書く場合は、結合条件と絞込条件が混在するので、先に結合条件を書いたり、コメントを入れる。
0051NAME IS NULL
2015/12/23(水) 00:07:47.91ID:???で、直積に対しては結合条件と絞込条件などと区別する必要もない。
0052NAME IS NULL
2015/12/23(水) 00:18:40.85ID:???あのさあ
0053NAME IS NULL
2015/12/23(水) 00:35:24.51ID:???なになに?
0054NAME IS NULL
2015/12/23(水) 00:38:52.62ID:???☓FROM句で結合条件を書く方法だとそれでいい
○FROM句に結合条件書かないならそれでいい
だよな?書き間違い?
0055NAME IS NULL
2015/12/23(水) 00:56:59.80ID:???上を見て納得しました
絡んですいません
0056NAME IS NULL
2015/12/23(水) 01:27:59.83ID:???このページのうぃんどさんが偉そうに説明してる全結合ってどこの用語?
StackOverFlow 見ると explain させて where も inner join もどっち使っても一緒って切り捨てられてるみたいだけど
0057NAME IS NULL
2015/12/23(水) 09:55:42.49ID:???たぶん>>50は直積を知らなくて、>>49がJOINのことを言っていると脳内変換したと思われ
0059NAME IS NULL
2015/12/27(日) 12:35:10.49ID:???やりたいこと
・元のデータ(生データ)を格納する table A がある
・生データを週単位で集計した table B がある
・新たな生データを投入した table A' を集計して集計済みの table B のデータに加えたい
単純に A' のデータを集計して B に新規追加するだけなら簡単なのですが、
A' のデータと同じ集計単位のデータが B にあった場合にどう処理するのが効率的なのかが分かりません。
A' のデータを一端一時テーブル等に集計した後に、B に存在する集計単位と存在しない集計単位ごとに
UPDATE と INSERT を行う方法が思いつくのですが、一般的でしょうか。
アドバイスを頂ければ、と思います。
0060NAME IS NULL
2015/12/27(日) 13:08:20.26ID:yu7sfdbc質問が分かりません。
0061NAME IS NULL
2015/12/27(日) 13:42:43.76ID:9lnqXFiU0062NAME IS NULL
2015/12/27(日) 14:00:57.58ID:???table Aの定義を明らかにしなさい。
>生データを週単位で集計した table B がある
何をキーに集計するのかを明らかにしなさい。
>新たな生データを投入した table A'
「新たなデータ」なら同じ集計単位は発生しないんじゃないの?
0063NAME IS NULL
2015/12/27(日) 14:15:05.30ID:???■テーブルデータ
id|price|created_at
------------------
1|100|2015-11-17 00:00:00.00000+09
2|200|2015-11-24 00:00:00.00000+09
3|300|2015-12-01 10:00:00.00000+09
4|350|2015-12-01 13:00:00.00000+09
5|400|2015-12-08 20:00:00.00000+09
6|500|2015-12-15 15:00:00.00000+09
今日は12/15とします。
今日の曜日を含めて過去4週分の平均を求めるSQLを教えてください。
上のテーブルだとidが2〜6までの200+(300+350)+400+500を足して4で割った値が欲しいです
006459
2015/12/27(日) 14:45:24.34ID:???ここは SQL 文そのものの質問をするところだったのね。スレチだし答えられなければ無視しといてください。
>「新たなデータ」なら同じ集計単位は発生しないんじゃないの?
例えば過去に 2015/11/01 のデータを投入するとそのデータが table B に保存される。
その後で 2015/11/02 のデータを投入すれば「同じ週」なので同じ集計単位のデータが発生します。
0065NAME IS NULL
2015/12/27(日) 14:53:32.86ID:???同一日付のデータはテーブルAから弾いていいの?それとも別データ扱い?
テーブルBでは弾いていいの?それとも後から来たデータで更新したいの?
DBMS名も言った方がいいよ。やりたいことさえはっきりすれば方法はあると思う。
006659
2015/12/27(日) 15:21:14.83ID:???仮定の話になるので不要と思っていましたが、データの具体例を挙げます。
table A
id int
custom_id int
date datetime
parts_id varchar(10)
parts_count int
table B
date datetime
parts_id varchar(10)
parts_count int
////
table A'
11,1,2015/11/03,'partA'.1
12,1,2015/11/04,'partB'.1
13,2,2015/11/05,'partA'.2
+
table B
2015/01,'partA',1
↓
table B
2015/01',partA',4
2015/01,'partB',1
※
この例では parts_id ごとの parts_count の合計値を週ごとに取得する。
table B の date はその週の始めの日付(日曜日)の日付を設定。
「↓」の下の B の parts_count の値は、「↓」の上の A' と B の part_id ごとの合計値。
partA では A' の合計 3 と B の 1 との合計の 4 となる。
>同一日付のデータはテーブルAから弾いていいの?それとも別データ扱い?
同一日付というか、同じ週のデータは合計します。
DBMS は特定のものを想定していませんでしたが、SQLServer2014 で試します。
006759
2015/12/27(日) 15:24:48.58ID:???table A'
11,1,2015/11/03,'partA'.1
12,1,2015/11/04,'partB'.1
13,2,2015/11/05,'partA'.2
+
table B
2015/11/01,'partA',1
↓
table B
2015/11/01,'partA',4
2015/11/01,'partB',1
0068NAME IS NULL
2015/12/27(日) 15:45:31.96ID:???0069NAME IS NULL
2015/12/27(日) 20:38:14.45ID:???知りたいのはMERGE文じゃない?
大体のDBMSで似た様なものがあるけど
0070NAME IS NULL
2015/12/27(日) 20:41:07.29ID:???SQL Serverの場合、mergeというステートメントが使用できる。
これ使うと、対象テーブルに対して、特定条件でinsertとupdateの何れかを実行できるそうだ。
申し訳ないが、こちらには実行環境がないので実際に試しての検証はできない。
0071NAME IS NULL
2015/12/27(日) 21:26:06.33ID:???欲しかったのはこれです。
ありがとうございます。
こんな感じでしょうか。(書いただけです。全く確認してません。)
MERGE INTO tableB t1
USING
(
SELECT DATEADD( day, ( DATEPART( date ) - 1 ) * -1, date ) AS week, parts_id, sum( parts_count ) AS parts_count
FROM tableA'
GROUP BY week, parts_id
) t2 ON t1.date = t2.week AND t1.parts_id = t2.parts_id
WHEN MATCHED THEN
UPDATE SET t1.parts_count = t1.parts_count + t2.parts_count
WHEN NOT MATCHED THEN
INSERT VALUES ( t2.week, t2.parts_id, t2.parts_count )
思いつきで書いただけなのでもっと効率のいい書き方がいくらでもありそう。考えます。
0072NAME IS NULL
2015/12/28(月) 12:48:32.72ID:jyNPkj4+ロジック書いた方がいい。
メンテナンスが難しくなる。
0073NAME IS NULL
2015/12/28(月) 14:17:09.48ID:???SELECT avg(price_total)
FROM
(SELECT
SUM(price) AS price_total
FROM
table
WHERE created_at::DATE BETWEEN '2015-12-15'::DATE + '-4 weeks'::INTERVAL + '1 day'::INTERVAL AND '2015-12-15'::DATE
GROUP BY
TO_CHAR(DATE_TRUNC('day', created_at),'YYYY-MM-DD')) foo
とかどうかなあ、4週だと11/17が入ってしまうようなので1足した
この辺は調整してみて
2015-12-15はCURRENT_TIMESTAMP とかで
0074NAME IS NULL
2015/12/28(月) 14:20:06.57ID:???TO_CHAR(created_at,'YYYY-MM/w')
か、でもこれ起点が1日だからな
0075NAME IS NULL
2015/12/28(月) 15:21:10.21ID:???0076NAME IS NULL
2015/12/28(月) 15:48:22.89ID:???> ロジック書いた方がいい。
ロジックって何?
クライアントループしろとかそういう話?
0077NAME IS NULL
2015/12/28(月) 16:05:32.61ID:???0078NAME IS NULL
2015/12/28(月) 17:11:36.25ID:???0079NAME IS NULL
2015/12/28(月) 20:45:47.24ID:???0080NAME IS NULL
2015/12/28(月) 20:53:03.73ID:FOWa2ASA0081NAME IS NULL
2015/12/28(月) 22:02:22.65ID:???できました
ありがとうございます
0082NAME IS NULL
2015/12/29(火) 03:44:58.15ID:???スレチですよ
0083NAME IS NULL
2015/12/29(火) 12:38:55.09ID:PogCLmH3まさかStructureなんたらとか思ってるんじゃないだろうなw
0084NAME IS NULL
2016/01/09(土) 11:31:38.67ID:???ご回答よろしくお願いします。
単一の表から複数の異なる集約結果を求めたいのですが、以下のような方法しか思いつきませんでした。
なにかもっとスマートな方法はありませんか?
select
(select count(番号) from 在庫) as 合計,
(select count(番号) from 在庫 where 分類='メンズ') as メンズ計,
(select count(番号) from 在庫 where 分類='レディース') as レディース計,
(select count(番号) from 在庫 where 分類='ジュニア') as ジュニア計
0085NAME IS NULL
2016/01/09(土) 12:34:33.27ID:???>>5
0086NAME IS NULL
2016/01/09(土) 14:04:40.10ID:P8kdYMvvそれの方が分かりやすい。
ただなんのために横列で取得したいの?
union allで複数行で取得してもいいと思うけど?
0087NAME IS NULL
2016/01/09(土) 14:24:07.10ID:???ありがとうございます。
これでも変なSQLではないのですね?
union all とかも考えたんですが、上の例で言うと、
アイテム数(行数)が数百万で分類が数十万とかになるので、かえって遅くなるかと思いました。
0088NAME IS NULL
2016/01/09(土) 14:29:38.09ID:???0089NAME IS NULL
2016/01/09(土) 14:52:19.58ID:???分類でGROUP BYして、必要ならアプリで縦横変換ってパターンじゃないのかねぇ
0090NAME IS NULL
2016/01/09(土) 22:50:39.07ID:4FHVsotA分類が数十万もあるなら、数十万カラムもあるSELECT文を発行するつもりだったのか?
どんな言語で処理したいのか、どんな方法で見たいのか分からないが、プログラムだとしても恐ろしいことになるぞ。
0091NAME IS NULL
2016/01/09(土) 22:56:36.82ID:4FHVsotAデータベース内の処理はほぼ同じなので性能差を体感できないだろうよ。
0092NAME IS NULL
2016/01/09(土) 23:25:13.64ID:???ありがとうございます。
本件(に限って)の場合、数十万に及ぶ全ての分類の集計が必要なのではなく、
数十万のうち常に3つの分類(の組み合わせ)の集計だけが必要だったのです。
0093NAME IS NULL
2016/01/09(土) 23:26:25.39ID:???実務で分類が数十万になるケースってあるのかな。
仮にあったとして、そのレベルで集計した物を
どういう風に利用するんだろうか。
0094NAME IS NULL
2016/01/09(土) 23:32:21.31ID:???その時々で集計したい分類が決まるというなら、
union all の方が柔軟性があるんじゃないかな。
0095NAME IS NULL
2016/01/10(日) 00:20:26.29ID:4AZcq86j検索結果が必ず一貫性の取れた
0096NAME IS NULL
2016/01/10(日) 00:23:36.54ID:4AZcq86jあとそれってある時点の一貫性の取れた検索結果じゃないといけないの?
検索中にデータが増減しないなら、無理に一つのSQLにする必要もない。
0097NAME IS NULL
2016/01/10(日) 01:18:03.30ID:???ありがとうございます、質問者です。
すいません、「一貫性の取れた検索結果」というのはどう言う意味でしょうか?
データベース用語でしょうか?
あと、在庫とかメンズ、レディースというのは便宜上使っただけで、
実際のsubjectはある集団の「人間」です。
0098NAME IS NULL
2016/01/10(日) 03:17:44.84ID:4AZcq86jSELECT文を実行するときに、他のセッションが在庫テーブルにレコードを登録、削除するかどうかということ。
1つのSELECT文で検索すると読み取り一貫性が担保される。
複数のSELECT文で検索すると合計が合わないかもしれない。
0099NAME IS NULL
2016/01/10(日) 07:13:17.63ID:???整合性うんぬんなら、しかるべき分離レベルの1トランザクションにすれば良いだけ
0100NAME IS NULL
2016/01/10(日) 07:49:32.48ID:???あとそういう人が行くべきスレはどこですか?
0101NAME IS NULL
2016/01/10(日) 09:16:16.90ID:???Amazon 辺りで 分類 = 商品コード で管理してたらあるんじゃね?
まあカテゴリ毎に分散してるのかも知らんけど
0102NAME IS NULL
2016/01/10(日) 09:18:48.75ID:???3回発行するぐらいなら、>>89 の言うように group by でいいと思うが
0103NAME IS NULL
2016/01/10(日) 09:30:10.71ID:???いやだからそれはアイテム数が数百万のケースだろ
それを分類とは呼ばん
0104NAME IS NULL
2016/01/10(日) 09:43:33.31ID:???select 3回、なければgroup byだろうね。
0105NAME IS NULL
2016/01/10(日) 09:53:20.10ID:???> それを分類とは呼ばん
自分の考えが全てとか、笑える
0106NAME IS NULL
2016/01/10(日) 12:08:06.85ID:???アマゾンクラスの仕事の依頼がここに来たら感激だな
0107NAME IS NULL
2016/01/10(日) 19:30:04.74ID:???そのへんはホストアプリとの兼ね合いだな
GROUP BYするにしても、分類を三つに絞るのにorなりinのリストなり
動的にSQL組み立てる必要があるかもしれん
その場合三つってのが確定的なら動的に組み立てて1SQLでも良いかもしれんが
ループまわして複数回発行する方が楽かもしれん
>>104
分類にインデックスが無い状態で3回selectすると、スキャンが3回発生するわけだが
それなら1回ですむGROUP BYの方が良いと思うが
そもそもアイテム数が10そこそことか、どこからそう判断したんだ
0108NAME IS NULL
2016/01/10(日) 19:33:46.64ID:???お前はまず日本語の勉強しろ
0109NAME IS NULL
2016/01/10(日) 20:01:12.41ID:???恥ずかしい奴 w
0110NAME IS NULL
2016/01/10(日) 20:21:22.14ID:???インデックスがあるならselect 3回って書いてあるが。
0111NAME IS NULL
2016/01/10(日) 23:11:43.96ID:???ああ、そう書いてあるな。読み違えてるか
それで、アイテム数10ってのはどういう判断だ]
インデックスないならGROUP BYってのはわかるが
select3回の根拠は?インデックスあってもGROUP BYでも良いわけだが
0112NAME IS NULL
2016/01/11(月) 01:57:27.73ID:MkJd1wQzそのグループ化するカラムがフルテーブルスキャンならダメだろ。
0113NAME IS NULL
2016/01/11(月) 04:03:36.24ID:???0114NAME IS NULL
2016/01/11(月) 05:36:49.44ID:???実行計画見たことない奴に聞いても無駄
0115NAME IS NULL
2016/01/12(火) 11:55:31.85ID:???横だけど、分類あたりの平均アイテム数は10くらいであってると思うんだけど
0116NAME IS NULL
2016/01/13(水) 00:37:10.16ID:ztbfyYEK?
0117NAME IS NULL
2016/01/17(日) 10:07:32.95ID:???!
0118NAME IS NULL
2016/01/21(木) 20:12:45.94ID:???NULL禁止なフィールドのあるテーブルをFROMとして
作業表へ SELECT INTO しようとしてます。
作業表では全てのフィールドNULL許可にしたいのですが、WITH〜 なんかを指定することで簡単にできないですか。
作業表を create table するのは避けたいです。
SELECT * FROM [NULL禁止項目のあるテーブル] INTO #TMP;
普通にやると、もとの制限が INTO 先にも適用されてしまいますが
#TPM の中は全てNULL許可にしたいのです。
0119NAME IS NULL
2016/01/21(木) 20:13:29.41ID:???SELECT * INTO #TMP FROM [NULL禁止項目のあるテーブル];
0120NAME IS NULL
2016/01/22(金) 07:51:52.73ID:???0121NAME IS NULL
2016/01/22(金) 23:44:55.55ID:???中の人のことを考えると、結合したりテーブル丸ごとじゃなくて一部の列だけだったりすると
追いかけるの大変そうな気がするし、select 1と結合してみたらどうなるんだろ。
0122NAME IS NULL
2016/02/16(火) 13:57:33.49ID:sAeuyZvTinsertする文字列って$pdo->quote()しなくても良いのでしょうか?
これをすると、全てのカラムにクォートが入ってしまいました
例)「あいう'えお」をクォートしてinsertしたい場合
「'あいう''えお'」としてinsertされている
0123NAME IS NULL
2016/02/16(火) 15:40:39.33ID:???> sqliteにpdoを使って接続しているのですが、
> insertする文字列って$pdo->quote()しなくても良いのでしょうか?
まず、"sqlite SQLインジェクション"でググる
その次に"sqlite pdo プリペアドステートメント"でググる
そうすれば、しなくても良いかどうかがわかる
0124NAME IS NULL
2016/02/16(火) 17:32:15.88ID:???どうやってるのか実際にコード書いたほうが伝わりやすい
quoteするのはデータだけよ、SQL文そのものは一部でも入れちゃダメ
それがわかった上で、>>123 の言うようにプリペアドステートメントを使うようにしたほうがいい
0125NAME IS NULL
2016/02/16(火) 18:11:20.21ID:???PHPスレでやるべきだと思うけども、一応。
executeに渡すパラメータはquoteしなくていいよ。
quoteは自分でクエリを文字列として組み立てるときに使う。
0126122
2016/02/17(水) 12:24:07.77ID:???お恥ずかしながらググってもよく分からなくて質問したのですが、
125さんの解説で理解できました。ありがとうございました。
0127NAME IS NULL
2016/02/17(水) 14:37:03.18ID:???ちょっと心配だな。
プリペアードクエリは使ってる?
使ってなくてINSERTするデータがユーザ由来のものなら、クォートしないとSQLインジェクションが発生する可能性があるよ。
0128NAME IS NULL
2016/02/18(木) 20:17:47.51ID:4K+rE1O7あるのですが、
SELECT時、マスターテーブルの情報を連結させた上でメインテーブルを呼ぼうとおもったら
JOINを大量に書いていくしかないでしょうか?
0129NAME IS NULL
2016/02/18(木) 21:40:44.54ID:???サブクエリでできないこともないけど、JOINが一番シンプルにかけるんじゃないかなあ
0130NAME IS NULL
2016/02/19(金) 08:05:36.44ID:???JOINしなくてもできる
プログラムで制御すればいい
メインテーブルからマスタを参照すればいいなら、マスタ情報を抜く関数を作る
0131NAME IS NULL
2016/02/19(金) 13:40:11.52ID:???たいていの場合、JOINした方が速いよ。
0132NAME IS NULL
2016/02/19(金) 16:09:05.98ID:E2UQE3yA固定文字列の場合
コード番号でいれるか
もしくは直接文字としていれるか どちらのほうがいいでしょうか?
例
ID サイズ
01 Sサイズ
02 Lサイズ
03 Lサイズ
04 Mサイズ
↓
ID サイズ
01 0004
02 0002
03 0002
04 0003
特に固定文字が、可、不可 男、女 とか2つしかない場合どうしようか迷います。
0133NAME IS NULL
2016/02/19(金) 16:57:37.22ID:???正規化について調べた方がいいよ
0134NAME IS NULL
2016/02/20(土) 00:07:27.71ID:???だよね
0135NAME IS NULL
2016/02/20(土) 00:13:01.68ID:???0136NAME IS NULL
2016/02/20(土) 01:31:48.15ID:???id サイズ
01 S
02 L
03 L
04 M
だな、、、
名称に意味をもたせたいなら、サイズは数字にして
別に名称を含めたサイズテーブル追加する
0137NAME IS NULL
2016/02/20(土) 01:35:30.47ID:???0138NAME IS NULL
2016/02/20(土) 01:51:06.80ID:???コード化されているならコード
コード化できないなら文字入れないとしょうがない
コード化できるけどコード化されてないって話なら、コード化するかどうか決めろって話
SQL関係ないし設計関係のスレ行け
0139NAME IS NULL
2016/02/21(日) 21:36:28.33ID:???最後に入れたデータを消したいです
DELETE FROM tbl WHERE Id = MAX(Id)
ではエラーになりました
どう書くのがいいですか
0140NAME IS NULL
2016/02/21(日) 23:58:26.39ID:???0141NAME IS NULL
2016/02/22(月) 05:45:34.92ID:???ありがとうございます!
tblって2回書かないとダメだったのか
0142NAME IS NULL
2016/02/22(月) 07:56:30.75ID:???この場合全レコードを参照して最大値を求める以上、サブクエリーを使うしかない。
0143NAME IS NULL
2016/02/22(月) 15:46:45.15ID:???これでいけるかも知れないな
0144NAME IS NULL
2016/02/22(月) 20:56:47.07ID:???ありがとうございます
そう言う風に言っていただけると、なぜそうなるのかが理解できて助かります
>>143
ありがとうございます
やってみましたが、エラーにはならないものの、データも削除されませんでした
0145NAME IS NULL
2016/02/23(火) 03:37:49.14ID:???まさかとおもいながらぐぐってみたら、
mysql> delete from tbl order by Id desc limit 1
安定のmysqlと思わせてからの、sqliteにもそれをするための条件付コンパイル定数があったという。
http://stackoverflow.com/questions/1824490/how-do-you-enable-limit-for-delete-in-sqlite
0146NAME IS NULL
2016/02/23(火) 11:19:56.69ID:???last_insert_rowid() はほんとに最後にinsertした行だからね
1度でもこの方法か別の手段で消しててたらもう消えないよ
新たにinsertして試してみて
0147NAME IS NULL
2016/02/23(火) 12:24:22.46ID:mHP3GVeD0148NAME IS NULL
2016/02/23(火) 15:34:15.46ID:???それ以前に、別テーブルにinsertしてたら、違うテーブルの最終ID返すんじゃないのか?
つまり>144は意図しない行が消されてる可能性があるぞ
0149NAME IS NULL
2016/02/23(火) 15:44:24.12ID:???確かにテーブル単位で考えて行かないと正確じゃないな
0150NAME IS NULL
2016/02/23(火) 21:11:40.38ID:???私には難しすぎます・・・
>>146
INSERTしてみましたが、結果は同じでした
>>148
まだテスト段階なので1テーブルしかありません
なので大丈夫です
0151NAME IS NULL
2016/02/23(火) 21:16:09.87ID:???SELECT ROWID, * FROM tbl WHERE ROWID = last_insert_rowid()
これで何が表示されますか?
0152NAME IS NULL
2016/02/23(火) 22:39:57.18ID:???SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
sqlite> create table tbl (n int, v varchar(10) );
sqlite> . tables
tbl
sqlite> select * from tbl;
sqlite> insert into tbl (n,v) values (1, 'AAA');
sqlite> select ROWID,* from tbl;
1|1|AAA
sqlite> select ROWID,* from tbl where ROWID=last_insert_rowid();
1|1|AAA
sqlite> delete from tbl where ROWID=last_insert_rowid();
sqlite> select ROWID,* from tbl;
sqlite> insert into tbl (n,v) values (2, 'BBB');
sqlite> select ROWID,* from tbl;
1|2|BBB
sqlite> delete from tbl where ROWID=last_insert_rowid();
sqlite> select ROWID,* from tbl;
sqlite>
0153NAME IS NULL
2016/02/24(水) 01:07:08.41ID:???正直やりたいことに沿っているかどうかも不明な点が多いわけで。
0154NAME IS NULL
2016/02/24(水) 09:34:48.51ID:???もしかするとトランザクションでRollbackしたらいいんでないか
0155NAME IS NULL
2016/02/24(水) 11:08:05.77ID:???こっちで試して書き込んでるのに、それと違う結果なんてなにかおかしいね
0156NAME IS NULL
2016/02/24(水) 15:55:36.17ID:???0157NAME IS NULL
2016/02/24(水) 20:17:24.10ID:???トランザクション知らんは流石にアホすぎるだろ。
0158sage
2016/02/24(水) 22:27:01.48ID:ap7CA/JNなくdllの方です。c#から操作しています。
以下のプログラムで「データの追加」を3回して、「データの表示」をすると安倍
さんが3人います。
ここで「最後の一件削除」をして「データの表示」をしたとき、
cmd.CommandText =
0159NAME IS NULL
2016/02/24(水) 22:35:19.22ID:???すみません、2chもあまり使いこなせてないもんで。
もう一度書きます。
私の一番最初の書き方が悪かったのですが、SQLite3ではあるのですが、exeでは
なくdllの方です。c#から操作しています。
以下のプログラムで「データの追加」を3回して、「データの表示」をすると安倍
さんが3人います。
ここで「最後の一件削除」をして「データの表示」をしたとき、
cmd.CommandText = "DELETE FROM tbl WHERE Id = (SELECT MAX(Id) FROM tbl)"; // OK
だと2人に減りますが、
cmd.CommandText = "DELETE FROM tbl WHERE ROWID = last_insert_rowid()"; // NG
だと3人のままです。
最後に入れたデータを消したい理由はそんなに深いものではなく、Idを指定
しての削除は簡単にできたので、最後を消すと言うのもそのうち使うように
なるだろうなと言う程度です。
自分の用途で考えると、Id指定より最後を消す回数の方が多いと思います。
回答としては >>140 で解決していますが、せっかく色々教えて頂いている
ので、落ち着くところまで行きたいと思いますが、ここはc#スレではないので
「はい、終了〜」でもOKです。
0160NAME IS NULL
2016/02/24(水) 22:37:12.66ID:???string db_file = "sample.db";
using (var cn = new SQLiteConnection("Data Source=" + db_file)) {
cn.Open();
using (SQLiteCommand command = cn.CreateCommand()) {
command.CommandText = "create table tbl (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Age INTEGER)";
command.ExecuteNonQuery();
}
cn.Close();
}
}
// データの追加
private void btn追加_Click(object sender, EventArgs e) {
string dbConnectionString = "Data Source=sample.db";
using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) {
cn.Open();
using (SQLiteTransaction trans = cn.BeginTransaction()) {
SQLiteCommand cmd = cn.CreateCommand();
cmd.CommandText = "INSERT INTO tbl (Name, Age) VALUES (@Name, @Age)";
cmd.Parameters.Add("Name", System.Data.DbType.String);
cmd.Parameters.Add("Age", System.Data.DbType.Int64);
cmd.Parameters["Name"].Value = "安倍";
cmd.Parameters["Age"].Value = 61;
cmd.ExecuteNonQuery();
trans.Commit();
}
cn.Close();
}
}
0161NAME IS NULL
2016/02/24(水) 22:37:39.49ID:???private void btn表示_Click(object sender, EventArgs e) {
string dbConnectionString = "Data Source=sample.db";
tbxOutput.Clear();
using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) {
cn.Open();
SQLiteCommand cmd = cn.CreateCommand();
cmd.CommandText = "SELECT * FROM tbl";
using (SQLiteDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
tbxOutput.AppendText("ID:" + reader["Id"].ToString());
tbxOutput.AppendText("\t名前:" + reader["Name"].ToString());
tbxOutput.AppendText("\t年齢:" + reader["Age"].ToString());
tbxOutput.AppendText("\n");
}
}
cn.Close();
}
}
// 最後の一件削除
private void btn最後の一件削除_Click(object sender, EventArgs e) {
string dbConnectionString = "Data Source=sample.db";
using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) {
cn.Open();
using (SQLiteTransaction trans = cn.BeginTransaction()) {
SQLiteCommand cmd = cn.CreateCommand();
cmd.CommandText = "DELETE FROM tbl WHERE Id = (SELECT MAX(Id) FROM tbl)"; // OK
//cmd.CommandText = "DELETE FROM tbl WHERE ROWID = last_insert_rowid()"; // NG
cmd.ExecuteNonQuery();
trans.Commit();
}
cn.Close();
}
}
0162NAME IS NULL
2016/02/24(水) 22:59:02.44ID:???sqlite は、一旦 quit で閉じると
last_insert_rowid()が初期化されてしまうみたい。
sqlite> select ROWID,* from tbl;
1|1|a
2|2|b
sqlite> insert into tbl (n,v)values(3,'c');
sqlite> select ROWID,* from tbl;
1|1|a
2|2|b
3|3|c
sqlite> delete from tbl where ROWID=last_insert_rowid();
sqlite> select ROWID,* from tbl;
1|1|a
2|2|b
sqlite> insert into tbl (n,v)values(4,'d');
sqlite> select ROWID,* from tbl;
1|1|a
2|2|b
3|4|d
sqlite> .quit
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select ROWID,* from tbl;
1|1|a
2|2|b
3|4|d
sqlite> delete from tbl where ROWID=last_insert_rowid();
sqlite> select ROWID,* from tbl;
1|1|a
2|2|b
3|4|d
sqlite>
0163NAME IS NULL
2016/02/25(木) 00:54:03.30ID:???0164NAME IS NULL
2016/02/25(木) 01:05:58.20ID:???> last_insert_rowid()が初期化されてしまうみたい。
sqlite「は」なの?
0165NAME IS NULL
2016/02/25(木) 05:43:23.43ID:???これが原因かーと思い、btn最後の一件削除_Clickの中で(Closeする前に)データ
表示の機能を付けてみても結果は同じでした。
private void btn最後の一件削除_Click(object sender, EventArgs e) {
string dbConnectionString = "Data Source=sample.db";
using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) {
cn.Open();
SQLiteCommand cmd = cn.CreateCommand();
// データの削除
using (SQLiteTransaction trans = cn.BeginTransaction()) {
cmd.CommandText = "DELETE FROM tbl WHERE Id = (SELECT MAX(Id) FROM tbl)"; // OK
//cmd.CommandText = "DELETE FROM tbl WHERE ROWID = last_insert_rowid()"; // NG
cmd.ExecuteNonQuery();
trans.Commit();
}
// データの表示
cmd.CommandText = "SELECT * FROM tbl";
using (SQLiteDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
tbxOutput.AppendText("ID:" + reader["Id"].ToString());
tbxOutput.AppendText("\t名前:" + reader["Name"].ToString());
tbxOutput.AppendText("\t年齢:" + reader["Age"].ToString());
tbxOutput.AppendText("\n");
}
}
cn.Close();
}
}
0166NAME IS NULL
2016/02/25(木) 10:38:40.17ID:???0167NAME IS NULL
2016/02/25(木) 10:43:47.76ID:???0168NAME IS NULL
2016/02/25(木) 16:02:07.79ID:???last_insert_rowid()で最後のレコードが取得できないんじゃないの?
btn最後の一件削除_Click()メソッドでlast_insert_rowid()の値が
何になっているか、確認してみたら?
0169NAME IS NULL
2016/02/25(木) 16:10:25.34ID:???とかで
0170NAME IS NULL
2016/02/25(木) 16:42:23.32ID:???コマンドラインかSQL直接入力できるツールも使えるようになったほうがいいかと
0171NAME IS NULL
2016/02/25(木) 17:13:29.60ID:???簡単なコードだし、1回書けばコンパイルも実行も一瞬で終わるだろ
0172NAME IS NULL
2016/02/25(木) 17:58:29.34ID:???そのたびにデバッガ動かすのかよ
0173NAME IS NULL
2016/02/25(木) 18:09:41.22ID:???ん?
どこに問題があるかわからんから、ちょこちょこコードを変えながら実行するだけだろ?
結果はtbxOutputに出力してるじゃん
デバッガなんか必要ないだろ
0174NAME IS NULL
2016/02/25(木) 18:15:43.77ID:???いちいち「コマンドラインかSQL直接入力できるツール」で検証する必要ない。
0175NAME IS NULL
2016/02/25(木) 18:39:22.76ID:???VSのことか?
0176NAME IS NULL
2016/02/25(木) 20:02:35.16ID:???ここまで仕様が明確になってなお last_insert_rowid を使わせようとしてるの?
0177NAME IS NULL
2016/02/25(木) 20:10:30.09ID:???今は興味本位で sqlite の挙動見てるだけ。
0178NAME IS NULL
2016/02/25(木) 20:16:16.70ID:???このスレ的には>>140で終わってる話だから
アホに頼ってないでドキュメントを読もう
https://www.sqlite.org/c3ref/last_insert_rowid.html
https://msdn.microsoft.com/ja-jp/library/yh598w02.aspx
0179NAME IS NULL
2016/02/25(木) 21:48:51.65ID:???最初に私が思ってたより話が長くなってしまいましたが、>>140 の処理が
一番いいようです。
作りたいのはWindowsフォームソフトなので、このスタイルのまま続け
たいと思います。
皆様、色々とありがとうございました。
また分からないことがあった時に教えてください。
0180NAME IS NULL
2016/02/25(木) 22:47:55.71ID:???挙動もわからず last_insert_rowid を持ち出した人だとすると相当…
0181NAME IS NULL
2016/02/26(金) 00:12:23.36ID:???元質問者のことだが。
0182NAME IS NULL
2016/02/26(金) 00:24:37.07ID:???どのような想定をするかは、人によるでしょう
1トランザクション内の障害時ロールバックを想定したり、
あるいは単純に「いらなくなったので消したい」を想定したり
私は last_insert_rowid がどう使えるものなのか興味があったので。
0183NAME IS NULL
2016/02/26(金) 01:07:10.54ID:???0184NAME IS NULL
2016/02/26(金) 13:26:41.03ID:???ちょうど良い暇つぶしにはなってる」
0185NAME IS NULL
2016/02/26(金) 18:33:12.87ID:HEn2/SFy■テーブルデータ(テーブル名「a」)
id|data1|data2|data3
------------------
1 |100 |100 |100
2 |null |null |null
3 |300 |300 |300
期待する結果
id
1
3
data1〜data3 が全てnull以外のidを
取得したいのですが、どのようなSQLで
いけるでしょうか?
よろしくお願いします
0186NAME IS NULL
2016/02/26(金) 19:17:14.32ID:???data2 is not null and
data3 is not null;
0187NAME IS NULL
2016/02/26(金) 20:12:41.15ID:???0188NAME IS NULL
2016/02/26(金) 20:26:25.75ID:???0189NAME IS NULL
2016/02/26(金) 20:28:44.90ID:???C#?か
0190185
2016/02/26(金) 20:47:35.03ID:???is not null で繋げれば書けますよね
自分がやった時には、思った結果が出なかったので、
根本的に間違っているのかと思ったのですが、
もう少し確認してみます
ありがとうございます
0191NAME IS NULL
2016/02/26(金) 20:56:19.31ID:???たとえばdata1〜data3がすべて数値型なら、data1 + data2 + data3 is not null ということもできるけれど。
0192NAME IS NULL
2016/02/26(金) 21:02:01.25ID:???プログラムにやらせればいいんでないかい
0193NAME IS NULL
2016/02/27(土) 02:05:15.81ID:???そもそもdata1,2,3と横並びでデータ持ってる事が妥当かあやしいな
0194NAME IS NULL
2016/02/27(土) 06:35:49.14ID:???もう解決したみたいだけど、ちょっと質問が曖昧かな
a) data1〜data3 が「全てnull」「以外のid」
b) data1〜data3 が「全てnull以外」「のid」
の2通りに解釈できる
0195NAME IS NULL
2016/02/28(日) 06:15:44.39ID:???なんだこの馬鹿
0196NAME IS NULL
2016/02/28(日) 07:22:44.18ID:???0197NAME IS NULL
2016/02/28(日) 08:09:38.87ID:???0198NAME IS NULL
2016/02/28(日) 08:11:33.67ID:???>>195
0199NAME IS NULL
2016/02/28(日) 08:14:25.92ID:???0200NAME IS NULL
2016/02/28(日) 08:21:14.12ID:???0201NAME IS NULL
2016/02/28(日) 09:59:47.95ID:???あえて誰とは言わないけど ()
0202NAME IS NULL
2016/02/28(日) 13:20:38.82ID:???例を見る限りでは全てがNULLの行を除外っぽく見えるけど。
一部NULLのケースは明示されてないしな。
0203NAME IS NULL
2016/02/28(日) 13:43:46.12ID:+D81EDqYNULLは値がないという意味しかないのに、NULLとときはこういうデータだとか決めてしまうからSQLが意味不明になる。
0204NAME IS NULL
2016/02/28(日) 13:44:50.90ID:???補完できるように示して貰えるといいよね
0205NAME IS NULL
2016/02/28(日) 15:59:17.66ID:PzeYPH0U■テーブルデータ(テーブル名「a」)
id|data1|data2|data3
------------------
1 |100 |100 |100
2 |null |null |null
3 |300 |300 |300
期待する結果
id
1
3
data1〜data3 が全てnull以外のidを
取得したいのですが、どのようなSQLで
いけるでしょうか?
よろしくお願いします
0206NAME IS NULL
2016/02/28(日) 16:10:26.98ID:PzeYPH0U失礼しました
185の質問をした者ですが
以下のように、data1〜data3が全てnullのものは
抽出しないというSQLが解りませんでした
data1からdata3を AND の IS NOT NULL で繋ぐと
1つも抽出されません
■PostgreSQL 8.4
■テーブルデータ(テーブル名「a」)
id|data1|data2|data3
------------------
1 |100 |null |100
2 |null |null |null
3 |null |null |300
期待する結果
id
1
3
自分が詰まってるところを
正確に説明できず、すみませんでした
よろしくお願いします
0207NAME IS NULL
2016/02/28(日) 16:27:53.47ID:???0208NAME IS NULL
2016/02/28(日) 17:02:30.85ID:???すべてがnot NULLのレコードを抽出するという意味になっている。
0209NAME IS NULL
2016/02/28(日) 17:23:24.00ID:???> 以下のように、data1〜data3が全てnullのものは
> 抽出しない
要するに >>194 の
>> a) data1〜data3 が「全てnull」「以外のid」
ってことね
>>186 は
> b) data1〜data3 が「全てnull以外」「のid」
の方だからこれではヒットしない
素直に書けば
where not (
data1 is null
and data2 is null
and data3 is null)
やったことないけど
where coalesce(data1, data2, data3) is not null
でもいけるかもしれない
0210NAME IS NULL
2016/02/28(日) 21:32:47.05ID:PzeYPH0U( )に対してnotが書けることを知りませんでした
参考にさせて頂きます
ありがとうございます
0211NAME IS NULL
2016/02/28(日) 21:46:49.08ID:???完全に >>194 の勘違いされてたぞ
0212NAME IS NULL
2016/02/28(日) 23:01:33.29ID:???andじゃなくてorにしないと。
いずれかがnot NULLであればいいんだから。
0213NAME IS NULL
2016/02/29(月) 12:11:27.73ID:???data1 is null
and data2 is null
and data3 is null)
なんでこんな書き方するんだよw 普通に OR でいいだろ…
0214NAME IS NULL
2016/02/29(月) 12:53:35.55ID:???0215NAME IS NULL
2016/02/29(月) 14:50:50.31ID:WeDl2jvv[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
ドメイン別にメールアドレスが何件あるか調べたいのですが、どのようなSQL文が必要でしょうか?
上記のデータの場合は次のような結果になるようにしたいです。
2.example.com 2
[email protected] 3
[email protected] 1
DBのバージョンはPSQL9.0.4です。
0216NAME IS NULL
2016/02/29(月) 15:34:15.77ID:???こんなんでは?
0217NAME IS NULL
2016/02/29(月) 20:22:18.85ID:???ドモルガン則な
大学のとき習った懐かしい
0218NAME IS NULL
2016/02/29(月) 20:55:12.66ID:???data1, data2, data3 のいずれかが null でない id と書いてあれば or で書くけど?
0219NAME IS NULL
2016/02/29(月) 21:00:57.12ID:???> 上記のデータの場合は次のような結果になるようにしたいです。
> 2.example.com 2
> [email protected] 3
> [email protected] 1
それ、@ の前も要るんか?
要るなら、
> [email protected] 3
でなくて
> [email protected] 3
となる理由を書いてくれ
0220NAME IS NULL
2016/03/03(木) 23:59:24.93ID:???「ドメイン別にメールアドレスが何件あるか調べたい」
とあるんだから、結果は書き間違いだと思う。
0221NAME IS NULL
2016/03/08(火) 00:13:14.55ID:???SELECT * FROM role_role_privs;でオッケー?
0222NAME IS NULL
2016/03/08(火) 00:14:29.45ID:???0223NAME IS NULL
2016/03/10(木) 19:58:49.20ID:???SQLServerにユーザー定義定数ってありませんでしたっけ?
#define ZERO 0 または const int ZERO = 0;
をSQLServerのデータベースの中で定義して、T-SQLから使えるようにするみたいなやつ
0224NAME IS NULL
2016/03/10(木) 20:17:59.54ID:???0225NAME IS NULL
2016/03/17(木) 20:47:37.60ID:daAJuKPv・DBMS名とバージョン
SQL Server 2012
・テーブルデータ
+-ID-+-NAME-+
| 1 | TARO |
+----+------+
| 1 + HIRO +
+----+------+
・欲しい結果
+-ID-+-NAME-------+
| 1 | TARO, HIRO |
+----+------------+
・説明
上記のようなことは可能なのでしょうか?
0226NAME IS NULL
2016/03/17(木) 21:03:46.26ID:???0227NAME IS NULL
2016/03/18(金) 01:42:36.51ID:9IE7sIpBT-SQLなんだから素直にロジックで処理すれば?
0228NAME IS NULL
2016/03/21(月) 12:49:37.79ID:???できる。SQLでできる。
idで結合するだけでできる。
0229NAME IS NULL
2016/03/21(月) 15:45:51.66ID:eTEBxCqySELECT文いっぱつでどうにかしようとするのは保守がたいへんだから止めてほしいわ。
0230NAME IS NULL
2016/03/21(月) 16:13:52.32ID:YsgcliQ9まあ、この場合は処理的に無駄だからやめた方がいいけど
0231NAME IS NULL
2016/03/21(月) 16:47:35.77ID:???0232NAME IS NULL
2016/03/21(月) 17:18:09.54ID:???>同じテーブルを結合すればできるけど、なんでそんなことしなきゃいけないの?
>
>SELECT文いっぱつでどうにかしようとするのは保守がたいへんだから止めてほしいわ。
あくまで1案だよ。
ロジックでどうにかする案しか出ていないから、SQLでも結果が出るという案を出しただけ。
お前が保守できようができまいがどうでもいい。
0233NAME IS NULL
2016/03/21(月) 17:25:49.26ID:eTEBxCqy保守だけでなく単体テストも面倒だろ。
仕様変更のたびにSQLを変える必要があるプログラムは愚作。
0234NAME IS NULL
2016/03/21(月) 17:58:10.36ID:YsgcliQ9SQLのテストをすれば良い
SQLだけ変えれば良い
どう転んでも開発保守にかかる工数は
SQL < 自前ロジック
なんだが
0235NAME IS NULL
2016/03/21(月) 17:59:00.69ID:???0236NAME IS NULL
2016/03/21(月) 18:42:44.26ID:???何でも漢字で書いてたり、全部ひらがなで、とか、それらを混ぜる割合とか。読み手にもよるだろ。
夜露死苦レベルなら笑うしかないが。
0237NAME IS NULL
2016/03/21(月) 18:47:25.61ID:???>【質問テンプレ】
>・DBMS名とバージョン
>SQL Server 2012
>
>・テーブルデータ
>+-ID-+-NAME-+
>| 1 | TARO |
>+----+------+
>| 1 + HIRO +
>+----+------+
>
>・欲しい結果
>+-ID-+-NAME-------+
>| 1 | TARO, HIRO |
>+----+------------+
>
>・説明
>上記のようなことは可能なのでしょうか?
上の問に、保守性云々が出てくる理由が分からない。
結果がとれるかどうか聞いてるだけの日本語にしか見えない。
保守性がどうとかと言ってるのは、一回限りのデータ参照でも、毎回毎回今後を考えたプログラム組むのかな?
0238NAME IS NULL
2016/03/21(月) 19:03:29.95ID:mvoD5ONwふだんSQLのテストをまともにしてないのが丸わかりだな。
0239NAME IS NULL
2016/03/21(月) 19:06:59.38ID:mvoD5ONw分かりにくいSELECT文を考えるより、SQL ServerならSQLバッチを書いた方が早いし、間違いがない。
0240NAME IS NULL
2016/03/21(月) 19:26:45.08ID:YsgcliQ9俺もお前がSQLが苦手でコンプレックスを持ってる事が丸わかっちゃった
SQLが分かってれば、そもそも無駄だからやるべきでないこのケースで
「保守がたいへんだから」なんてセリフ絶対出てこないもんね
0241NAME IS NULL
2016/03/21(月) 19:33:54.34ID:???この問に対して、君の答えはSQLバッチでもできるよってことを言いたいんだね。
あと君の意見あんま参考になんない。理由はSQLが分かり辛いとかって、各人が判断することだからね。ぼくはSQLが分かり易いって人がいたら、君の論理は破綻するよ。
ぼくはこの程度のSQLであれば、分かり辛いと思う要素がないから、SQLでやっちゃうかなぁ笑
プログラムの実行権限とかもあるしね。笑
0242NAME IS NULL
2016/03/21(月) 19:50:04.75ID:mvoD5ONwSQLだけでどうにかしようとするやつは、SQLがDBMSでどう処理されるか考えていない傾向がある。
一つのSQLでやろうとする考え方がクセになるとDB設計もおかしくなるし、常に負荷の高いSQLを書いて、対処不能の性能問題を発生させる可能性が高い人間になる。
複雑な問い合わせはアプリケーション仕様、作った人間の意図も分かりにくい。
他のセッションが更新中の可能性があるなら、SQL一発で取得しないといけないが、そうでないなら複雑な問い合わせを書くのは、SQL自体に間違いを埋め込みやすくなり、間違いにも気づかない。
本人に自信があっても他人は信用しない。
0243NAME IS NULL
2016/03/21(月) 19:52:01.13ID:mvoD5ONwそもそもあの質問に対して結合でやれという回答は危険なんだよ。
0244NAME IS NULL
2016/03/21(月) 19:54:50.17ID:mvoD5ONwキミは自分中心だから、どんなSQLを書こうがかまわないということだろうけど、では他人がひどいSQLを書いたとき、どう反応するのかな?
0245NAME IS NULL
2016/03/21(月) 20:01:08.96ID:???0246NAME IS NULL
2016/03/21(月) 20:02:21.66ID:YsgcliQ9> 考えていない傾向がある。
> 性能問題を発生させる可能性が高い人間になる。
煮えきらんやつだなあ
ハッキリ断言出来ないならそんな長文書くなよw
0247NAME IS NULL
2016/03/21(月) 20:06:41.02ID:mvoD5ONw自分がどう思うかだけしか考えてないと自分で言っているわけか。
0248NAME IS NULL
2016/03/21(月) 20:08:34.46ID:mvoD5ONw俺は自己結合とT-SQLのカーソルを使用したバッチを想定して言っている。
0249NAME IS NULL
2016/03/21(月) 20:12:44.06ID:mvoD5ONw検索条件に引っかからないデータパターンがどれほどできるか想定できないのだから。
0250NAME IS NULL
2016/03/21(月) 20:13:27.60ID:YsgcliQ9お前何も分かってないのな
自分の意見を言いたい時は自分の立ち位置をハッキリさせて誤解されないように断言しろ
後々の保険を考えてそんな語尾を濁した言い方してても誰にも伝わらんぞ
0251NAME IS NULL
2016/03/21(月) 20:15:01.07ID:YsgcliQ9むしろプログラミングスキルが貧弱だからその程度の条件の組合せで苦労するんだよ
0252NAME IS NULL
2016/03/21(月) 20:15:31.10ID:mvoD5ONw批判しかできないのか?
0253NAME IS NULL
2016/03/21(月) 20:16:02.69ID:mvoD5ONwテストの話だが?
0254NAME IS NULL
2016/03/21(月) 20:16:27.00ID:YsgcliQ9何言ってんの急にw
0255NAME IS NULL
2016/03/21(月) 20:18:03.80ID:mvoD5ONwおまえは常に自分がやることを前提にものを言っている。
誰もおまえにやれとは言ってない。
0256NAME IS NULL
2016/03/21(月) 20:22:32.95ID:YsgcliQ9またまた何言ってんの?
誰がやろうとプログラムで書こうとテストの条件は変わらんのだぞ
0257NAME IS NULL
2016/03/21(月) 20:22:53.56ID:mvoD5ONwおまえさ、勝手に質問に対して前提条件を付けたり、説明もない脳内想定で話をしてるけど、大丈夫か?
0258NAME IS NULL
2016/03/21(月) 20:25:42.11ID:YsgcliQ9いやいや俺の方がちんぷんかんぷんなんですが?
何言ってんの急に?
0259NAME IS NULL
2016/03/21(月) 20:26:36.22ID:mvoD5ONwおいおい、テスト仕様を考えたことないのかよw
誰が考えても、誰がやっても同じにはならないし、そもそもテストしないやつだっているんだよ。
おまえはおまえがやることしか答えてない。
俺にはおまえがどんな立場で仕事をしているかよく分かるよ。
0260NAME IS NULL
2016/03/21(月) 20:29:55.63ID:YsgcliQ9プログラムでロジック書いたらテストしないやつがいてもいいって言いたいのか?
何言ってんのお前?
0261NAME IS NULL
2016/03/21(月) 20:39:10.84ID:???>>229と何が違うの?
>そもそもあの質問に対して結合でやれという回答は危険なんだよ。
0262NAME IS NULL
2016/03/21(月) 20:47:26.68ID:???ぼくが言いたいのは、あくまで結果をとるための方法が2通りあるってこと。君がオススメするSQLバッチとSQLで結合したやり方ね。
で、君はSQLでの方法はNGって言いたいのかな。結合だと危険、酷いSQLになるってことを懸念しているようだし。君の懸念事項は、今後システム運用することを前提にしているように見えるけど、そんな前提はどこにも書いていないよ。
何度もで申し訳ないけど、方法として何があるか問われているだけ。
0263NAME IS NULL
2016/03/21(月) 20:51:04.36ID:???まずそのSQL晒せや
そのSQL文がどんなものかも出てないのにどうこう言ってもしょうがない
そのSQLみてから、SQLでやるべきかどうかとか、そのSQLの保守性とか、言いたければ言えば良いんじゃね
本来のこのスレの守備範囲ではないとは思うが
ちなみにカンマ区切りの文字列へ連結するの、昔再帰SQLで書いてみた事あるけど
元の質問だけだと、要件が不明すぎて俺には回答できないがな
0264NAME IS NULL
2016/03/21(月) 21:52:32.30ID:???具体的にはどんなのなのかなーと。
「今回の案件?」で、一体どんな「メンテに困る」ようなコードが書けるのか見てみたいな、と。
できれば SQL 単体、ロジック単体、混合のそれぞれのケースを。
0265NAME IS NULL
2016/03/21(月) 22:52:43.33ID:mvoD5ONw・DBMS名とバージョン
SQL Server 2012
・テーブルデータ
+-ID-+-NAME-+
| 1 | TARO |
+----+------+
| 1 + HIRO +
+----+------+
・欲しい結果
+-ID-+-NAME-------+
| 1 | TARO, HIRO |
+----+------------+
・説明
上記のようなことは可能なのでしょうか?
0266NAME IS NULL
2016/03/21(月) 22:55:21.24ID:mvoD5ONwSELECT '1', 'TARO, HIRO';
0267NAME IS NULL
2016/03/22(火) 00:05:04.40ID:???それを無視して保守のために分割すべきというのは暴論にすぎないね。
0268NAME IS NULL
2016/03/22(火) 00:07:16.38ID:???> 他のセッションが更新中の可能性があるなら、SQL一発で取得しないといけないが、そうでないなら複雑な問い合わせを書くのは、SQL自体に間違いを埋め込みやすくなり、間違いにも気づかない。
…こりゃだめだ。
0269NAME IS NULL
2016/03/22(火) 00:12:54.31ID:???でもメンテ以前にレビューを通らないだろ。
0270NAME IS NULL
2016/03/22(火) 00:16:05.20ID:???0271NAME IS NULL
2016/03/22(火) 00:33:13.38ID:???それはSQLだろうがロジックだろうが変わらないということを理解できていないのかもしれない。
0272269
2016/03/22(火) 00:36:10.72ID:???269 は 266 宛てな。
0273NAME IS NULL
2016/03/22(火) 09:15:43.02ID:XCbF2Frf必要になる時点で設計がおかしい。
0274NAME IS NULL
2016/03/22(火) 09:18:47.85ID:XCbF2Frfあのね、DBの使い方がおかしいんだよ。
ここにはDB設計に意見が言える人間はいないの?
0275NAME IS NULL
2016/03/22(火) 09:31:07.82ID:XCbF2Frf0276NAME IS NULL
2016/03/22(火) 12:54:44.56ID:???って言うのが普通だと思っていたが...
0277NAME IS NULL
2016/03/22(火) 12:54:50.45ID:???ここDB設計スレじゃないよ
0278NAME IS NULL
2016/03/22(火) 13:15:29.25ID:???文句は代案とセットじゃないとただの犬の遠吠えだから
0279NAME IS NULL
2016/03/22(火) 13:29:41.70ID:7yveUErx代案とセットじゃないとただの犬の遠吠えらしいからな
0280NAME IS NULL
2016/03/22(火) 14:30:48.25ID:???そんな大げさな話じゃないんだけどなぁ。大丈夫かい?
設計はこっちで。
DB設計を語るスレ 9
http://echo.2ch.net/test/read.cgi/db/1444733172/
0281NAME IS NULL
2016/03/23(水) 20:29:52.59ID:Y1xGecwA安倍首相がスタンフォード大前で「嘘つき安倍は帰れ!」と抗議を受ける
https://www.youtube.com/watch?v=HkMjwggu3ko
安倍総理、麻生副総理も経歴詐称? 海外留学の経歴が削除されていた! 「学歴詐称」は公職選挙法違反
【日本の金正恩】 安倍寛信 【安倍晋三の兄】
復活した電力会社の原発広告に文化人や芸能人がまたぞろ登場して原発をPR! 500万円の高額ギャラも 勝間和代 三橋貴明 佐藤優
三菱商事の核ミサイル担当重役は安倍晋三の実兄、安倍寛信 三菱重工の重役でもあるらしい
これがフクイチで核弾頭ミサイルを製造していた疑惑がある 書けばツイッターで速攻削除されている
ネットにおける言論統制は、非公然で陰湿に進んでいるようです
https://twitter.com/toka iamada/status/664017453324726272
山本太郎
先ず真のテロリズムと戦うべき!
汚染物質をバラ撒き、国民を無理心中へと巻き込む政治家、経済団体等をテロ指定、資産凍結するのが筋ではないか!
【だってお金欲しいもん〜】
今朝、辺野古で新基地建設に反対するママの会メンバーに対して、
機動隊員が「お前たちには汚い血が流れている」などと暴言を吐いたそうです。
自分のやっていることを「だってお金欲しいもん〜」「俺の写真を待ち受けにしろ」とも (顔写真)
https://twitter.com/MothersNoWar/status/690357793702940672
0282NAME IS NULL
2016/03/24(木) 16:43:09.85ID:vxfdo0VQこういうSQLを書かないといけないとDBAに相談すれば、設計も検討するし、アドバイスもする。
プロジェクトとして一番困るのはプログラマとして入って、凄まじいSQLを書いてすぐ去っていく人間。
0283NAME IS NULL
2016/03/24(木) 21:34:58.48ID:???基本ブログラマのSQLチェックとかDBAの仕事じゃない
プログラムのレビューでやっとけよ
0284NAME IS NULL
2016/03/24(木) 23:00:07.21ID:/tnpx12kだからダメなんだろうが。
DBAは発行されるSQLを把握していなければ、性能問題であとで苦しむ。
インフラ側みたいなDBAしかいないか、アプリ開発側の自称DB、SQL得意が勝手にDB設計、SQLを書くからおかしくなる。
0285NAME IS NULL
2016/03/24(木) 23:07:11.31ID:/tnpx12k自分たちが分からないからと言って開発から逃げるような領域しか教えないんだから。
実際、開発経験がないから適切なDB利用マニュアルも書けないし、知識がないからデータモデリングのアドレスもない。
0286NAME IS NULL
2016/03/25(金) 00:24:53.08ID:???チューニングできるDBAがいるべきなのは異論の余地はないけど。
0287NAME IS NULL
2016/03/25(金) 01:05:12.55ID:D147JQzi数値と文字が混合したデータ(例えばA001)を扱いたい場合はデータ型を何に設定すればいいのでしょうか。
0288NAME IS NULL
2016/03/25(金) 01:17:24.15ID:7sLwcV7e文字型
0289NAME IS NULL
2016/03/25(金) 11:04:47.08ID:???> DBAは発行されるSQLを把握していなければ、性能問題であとで苦しむ。
その発行されるSQLというのは、開発プロセスのどの段階でFixするんだ?
詳細設計工程とかいうのが区切られてて、その終了時か?
実装工程とかいうのが区切られてて、その終了時か?
DBAひとりあたり、何人のプログラマの面倒を見るんだ?
0290NAME IS NULL
2016/03/25(金) 11:16:44.37ID:???こいつの頭ん中どうなってんだ?と関心したけどメンテつらすぎる
0291NAME IS NULL
2016/03/25(金) 11:21:00.74ID:WvUm2VO+複雑な問い合わせを書いて着た段階で説明を求めるだけでいいだろ。
0292NAME IS NULL
2016/03/25(金) 11:25:14.24ID:WvUm2VO+おまえインフラしかやらないようなDBAだろ?
DBAは最初から最後までプログラマと協力してやるのが理想的。
発行されるSQLを見ずにDBMSを調整しても無駄。
0293NAME IS NULL
2016/03/25(金) 11:30:28.62ID:???インターフェースを定義したうえでストアド化し、ストアドの中はPGに触らせるな
0294NAME IS NULL
2016/03/25(金) 12:56:41.81ID:VBVskd/y何したらSQLだけでそんなに長くなるん?
0295NAME IS NULL
2016/03/25(金) 13:09:47.34ID:???0296NAME IS NULL
2016/03/25(金) 14:46:42.33ID:???>>291
> 複雑な問い合わせを書いて着た
というのは、開発プロセスのどの段階の話なんだと聞いてる。
>>292
> おまえインフラしかやらないようなDBAだろ?
いや、俺はプログラマだが。
> DBAは最初から最後までプログラマと協力
「最初」というのは開発プロセスのどの段階で、
「最後」というのは開発プロセス(+運用プロセス)のどの段階なんだ?
> 発行されるSQLを見ずにDBMSを調整しても無駄。
問題があるクエリの内容を見るのは、別にプログラマと協力せずともよいが。
0297NAME IS NULL
2016/03/25(金) 14:53:17.92ID:???複雑だから問題が発生するとは限らないし、
複雑でないから問題は発生しないとも限らない。
問題があるかどうかは、
* スロークエリ発生
* スローレスポンス(Webアプリの場合)
* 低キャッシュヒット率
* 不要なseq scan発生
* ロック、待ち
* 使用されないindex
などを監視する必要がある。
あとは、RDBMSに応じて、HOT使用率(PostgreSQL)とかそのての情報を統計情報から調べる必要がある。
それらを、Muninとかでグラフ化したり、Logwatchでレポートしたり。
0298NAME IS NULL
2016/03/25(金) 16:57:41.30ID:???0299NAME IS NULL
2016/03/25(金) 19:09:42.11ID:MSYuOkWn0300NAME IS NULL
2016/03/25(金) 19:34:20.42ID:pxjOVYaIそれをできてから確認するのか?
遅すぎる。
0301NAME IS NULL
2016/03/25(金) 19:42:37.11ID:???自分が知ってる単語並べてるだけでいっぱいいっぱいなんだからいちいち突っ込んでやるなよ
0302NAME IS NULL
2016/03/25(金) 22:47:10.83ID:???理解できない人か
>>301
ワオ。おつかれさまです!
0303NAME IS NULL
2016/03/25(金) 23:15:00.85ID:WvUm2VO+複雑な問い合わせで問題がない場合はない。
とりあえずいまはよくても将来、問題になる無駄に処理コストの高いSQLは排除しておく必要がある。
一時的なものならかまわないが、そうでないなら、設計がおかしいのだから、設計を見直すべき。
0304NAME IS NULL
2016/03/25(金) 23:32:24.60ID:???テーブル名tbl
カラムはid(primary key auto increment integer),name(text),age(integer)の3つがあります
テーブルから全データを取得したいんですが条件があります
id=1のときだけid,name,ageのデータを取得して
id!=1のときはid,nameのみ取得する方法ありませんか?
select id,name,age from tbl where id=1;
select id,name from tbl where id>1;
って2回sqlを実行してもいいんですが1回で終わらせたいのです
0305NAME IS NULL
2016/03/25(金) 23:41:59.32ID:WvUm2VO+union all
足りないカラムはNULLか'未取得'とでもSELECT句に指定しておけ。
ただし、こういうのはあまりお勧めしない。
0306NAME IS NULL
2016/03/25(金) 23:44:09.08ID:WvUm2VO+0307NAME IS NULL
2016/03/25(金) 23:45:44.31ID:WvUm2VO+0308NAME IS NULL
2016/03/26(土) 02:04:12.26ID:7VvpbPCa初歩的な質問にも関わらず、ありがとうございます
0309NAME IS NULL
2016/03/26(土) 03:08:17.44ID:???違う項目数じゃないとダメだって言うなら、2個の結果セットが必要だから
SQL文としては2回やるしかないんじゃね
環境によっては複数のSQLを1回で渡して複数の結果セットを1回で受け取れるかもしれんけど
まあ何がしたくてそんな事をしたいのかわからんと何とも言えんな
0310NAME IS NULL
2016/03/26(土) 03:18:34.86ID:???馬鹿ブログラマほど、設計が悪いとか言い出すんだよな
お前のとこではプログラマへのSQL指導までDBAの仕事なんだな
まあがんばれや
0311NAME IS NULL
2016/03/26(土) 06:42:46.95ID:???0312NAME IS NULL
2016/03/26(土) 07:15:32.67ID:???いきなりunionだとかageと型が異なる'未取得'を指定するって、DBAならではの何か理由があってのことなのかな。
よければ理由を教えて欲しい。
>>309
> ageがNULLになってればいいんなら、UNIONしないでもCASE式でも使えば良いだけじゃないのか
まったくもってそのとおりだと思うけど、DBA様の回答が気になるところ。
0313NAME IS NULL
2016/03/26(土) 07:20:02.26ID:???datetime2 ってことはSQLServerなのかな。
update テーブル set 列 = dateadd(hour, 3, 列);
参考:https://msdn.microsoft.com/ja-jp/library/ms186819(v=sql.120).aspx
0314NAME IS NULL
2016/03/26(土) 07:27:00.53ID:hsf+0Rn0俺が言った回答を別人が同じことを言ってるな。
正確にはunion allにしとけよ。
実際には重複しないが、重複排除処理が走る可能性があるから。
俺がおまえが馬鹿にしてる人間だよ。
0315NAME IS NULL
2016/03/26(土) 07:28:41.46ID:hsf+0Rn0そんなの質問することか?
0316NAME IS NULL
2016/03/26(土) 07:36:45.81ID:eI6+AUug0317NAME IS NULL
2016/03/26(土) 07:38:57.20ID:???>>305ですでにunion allと書かれてるわけで、それをunionに変えろという意図は全然ないよ。
unionを使うという発想がおかしいといっている。
0318NAME IS NULL
2016/03/26(土) 07:43:01.96ID:hsf+0Rn0SELECT句のCASEはあまり勧めない。
SQL文そのものに条件分岐を書くべきではない。
とあるフレームワーク使って、動的に変更できないと思い込んでこうする人がいるんだよね。
まあこういうフレームは個人的にあまり好きではない。
実際に発行されるSQLがぱっと見わからないから、可読性に問題がある。
0319NAME IS NULL
2016/03/26(土) 07:45:27.19ID:hsf+0Rn0union allの回答を最初にしたのは、おまえがいうdba様の俺だぞw
0320NAME IS NULL
2016/03/26(土) 07:51:58.99ID:hsf+0Rn00321NAME IS NULL
2016/03/26(土) 08:51:22.96ID:???ゴタクはいらねーから、わかんねーならすっこんでろ
0322NAME IS NULL
2016/03/26(土) 08:53:36.69ID:???ありがとうございます!
0323NAME IS NULL
2016/03/26(土) 09:51:42.64ID:???LibreOffice Base 4.2.6.2
・欲しい結果
ごはん 魚介類 野菜類
--------------------------
A氏 ○ ○
B氏 ○ ○ ○
C氏 ○
・テーブルデータ
人マスタ
id name
-------
1 A氏
2 B氏
3 C氏
食材マスタ
id name
-------
1 ごはん
2 魚介類
3 野菜類
受け付けるものテーブル
人id 食材id
-----------
A 1
A 2
B 1
B 2
B 3
C 3
・説明
問い合わせの初歩的な例を訊いてる気がするのですがすみません・・・
結果の「○」は例で、他の値でもかまいません
受け付けテーブルにレコードがあれば1、なければ空白ではなくて0の表示とかでも可
出来ない場合に代替として考えてるのは
1. 各テーブルをなんらかの形式のテキストファイルにエクスポートして、他のプログラミング言語で処理
2. 人マスタに全ての食材を1カラム1食材として乗っける形で人マスタを拡張
のどちらかです
ただし、食材マスタ以外の2テーブルが週次程度で外部からの変更がかかること(変更の有無は別途連絡がきます)と、
受け付けテーブルの件数が1万件ほどということがあって、前者の理由から代替案1が、後者の理由から
代替案2がとりづらく思っています(プラス、仕事を増やせばバグや不具合のタネに、という基本的なコトもありますが・・・)
DBMSによる、というコトであればは別のものに変えるコトも可かも、という条件もあります
SQLだけで「欲しい結果」で示したような表が取れるならそれに越したことはないという次第で質問しました
0324304
2016/03/26(土) 10:57:48.94ID:???クリックするとajaxでサーバからデータを取得する。
具体的に書きます。
ページを開いた時に
・全てのid,nameの一覧を表示したい
・クリックした時に年齢(age)を取得して表示したい(クリックした箇所のみ年齢を表示したい)
レコードの量が多くなるのと必要なidとnameの該当する人のageだけを表示させたいので
ageだけはページを開いた時に取得せず、
名前(name)をクリックした時にその都度取得して表示するようにしたいんです。一度idとnameだけを全部取得してから
なのでページを開いた時にデフォルトでid=1のageが表示がしたいというわけです。
0325304
2016/03/26(土) 10:59:16.63ID:???ミス。
ここ文章書いている時の消し忘れなので削除して読んでください
0326NAME IS NULL
2016/03/26(土) 11:21:09.02ID:???>ageだけはページを開いた時に取得せず、
1回で取得したいって最初に言っていたのと違うし。
0327NAME IS NULL
2016/03/26(土) 12:47:55.89ID:n84GU1et0328NAME IS NULL
2016/03/26(土) 14:11:27.72ID:wrqpigF3俺はPM、PL、SE、PGでかつDBAというよりDBエンジニアだ。
0329NAME IS NULL
2016/03/26(土) 14:19:03.96ID:???union all のほうが速いよ
重複判定をすっとばせるから
0330NAME IS NULL
2016/03/26(土) 16:55:00.46ID:???>>5 といいたいところだけど、
予想するに、Calcのピボットテーブル使うのが一番近そう。技術的にも環境的にも。
0331NAME IS NULL
2016/03/26(土) 16:57:34.73ID:???id=1のageをデフォルトで表示させたいという要求を、
クリックハンドラで使うことになるであろう関数をロード時に呼び出すことで満たせばよいわけで。
0332NAME IS NULL
2016/03/26(土) 21:08:56.51ID:eI6+AUugいや自己紹介はいいんだよw質問に答えてやれw
0333NAME IS NULL
2016/03/26(土) 22:41:44.77ID:mwQ0NV9b宿題か個人作品に付き合う必要はない。
自分で考えろよ。
俺は気まぐれに応える程度で、やばそうなやつは指摘しているだけ。
変なクセがついて、あちこちで変なSQLを書かれたら迷惑だからな。
0334NAME IS NULL
2016/03/26(土) 22:53:49.63ID:???0335NAME IS NULL
2016/03/27(日) 00:38:58.82ID:ZAl/m3zR0336NAME IS NULL
2016/03/27(日) 04:26:51.36ID:???0337NAME IS NULL
2016/03/27(日) 09:40:23.69ID:???0338NAME IS NULL
2016/03/27(日) 14:33:58.18ID:???0339NAME IS NULL
2016/03/27(日) 19:38:53.10ID:???0340NAME IS NULL
2016/03/28(月) 02:38:43.77ID:Yr8T7iBH他人の批評をしているおまえは何なの?
0341NAME IS NULL
2016/03/28(月) 02:40:06.63ID:Yr8T7iBHどういうふうにデータを持っているのか説明してくれないとなんとも言えない。
0342NAME IS NULL
2016/03/28(月) 13:01:39.16ID:???> SELECT句のCASEはあまり勧めない。
>
> SQL文そのものに条件分岐を書くべきではない。
こんな「俺が嫌いだからダメ」レベルの話をされても困惑するわ
0343NAME IS NULL
2016/03/28(月) 13:03:36.53ID:???で、そのDBAさんは、開発プロセスのどこから関わり初めて、どこまでつきあうんですか?
それと、一人のDBAは何人のプログラマを担当するんですか?
0344NAME IS NULL
2016/03/28(月) 13:04:43.93ID:???回答してる人
0345NAME IS NULL
2016/03/28(月) 13:20:08.69ID:???手順も糞もあるかよ。
INSERT INTO hoge_archive SELECT * FROM hoge WHERE hoge_date < '一ヶ月前の日付';
DELETE FROM hoge WHERE hoge_date < '一ヶ月前の日付';
0346NAME IS NULL
2016/03/28(月) 13:28:33.86ID:???> レコードの量が多くなるのと必要なidとnameの該当する人のageだけを表示させたいので
通信時間が深刻になるほどのデータ量(取得後)だとするなら、それはUX的にやるべきではない。
大抵はHTTPのレスポンスはgzip圧縮されているので、少々データが増えたくらいは問題ない。
> ageだけはページを開いた時に取得せず、
> 名前(name)をクリックした時にその都度取得して表示するようにしたいんです。一度idとnameだけを全部取得してから
最初から、id,name,ageを取得しておけば、Ajaxも不要。
0347NAME IS NULL
2016/03/28(月) 14:00:19.72ID:???0348NAME IS NULL
2016/03/28(月) 14:21:19.00ID:???DBAが後から網羅的にコードを読んで指摘するんじゃなくて、そいつを教育した方が早いのでは。
0349NAME IS NULL
2016/03/28(月) 14:25:16.08ID:???○ 重複の除去
0350NAME IS NULL
2016/03/28(月) 14:40:24.89ID:vRoW12QA0351NAME IS NULL
2016/03/28(月) 14:45:14.94ID:vRoW12QA以下はあるサイトの引用
情報資源およびデータベースを計画・設計・構築・運用・管理する業務に従事し、次の役割を果たす。
データ管理者(DA)として、情報システム全体のデータ資源を管理する。データベース管理者(DBA)として、基幹データベースの構築と維持を行う。個別システム開発の各工程(計画・分析・設計・運用・保守)において、データベース関連の技術支援を行う。
(「情報処理推進機構:情報処理技術者試験センター:情報処理技術者試験制度:制度の概要」から引用)
0352NAME IS NULL
2016/03/28(月) 15:16:04.19ID:???0353NAME IS NULL
2016/03/28(月) 15:18:51.98ID:???設計段階でSQL書かせて、それをレビューせねば。
0354NAME IS NULL
2016/03/28(月) 15:23:46.77ID:vRoW12QAO/Rマッパーのせいで変なSQLを書かれる傾向があるから嫌だね。
結局、アプリケーションからクソSQLを隠しているだけになりかねない。
ストアドでも汚いSQLを隠すためにストアド化するやつもいるからな。
0355NAME IS NULL
2016/03/28(月) 15:27:36.83ID:???今のところそういう人はここに出てきてないから安心だね
0356NAME IS NULL
2016/03/28(月) 16:42:34.87ID:???君のことなんだが。
0357NAME IS NULL
2016/03/28(月) 16:45:27.70ID:???プルリクあったら、全コードDBAがレビューすんの?
0358NAME IS NULL
2016/03/28(月) 16:54:25.18ID:vRoW12QA0359NAME IS NULL
2016/03/28(月) 16:57:02.65ID:???0360NAME IS NULL
2016/03/28(月) 17:06:20.27ID:???> 変なクセがついて、あちこちで変なSQLを書かれたら迷惑だからな。
そうだな
消えろ、お前が
0361NAME IS NULL
2016/03/28(月) 17:32:30.78ID:???0362NAME IS NULL
2016/03/28(月) 18:09:54.01ID:???この現象に何か名前がついてませんかね。
0363NAME IS NULL
2016/03/28(月) 18:22:13.97ID:???このスレって俺とあなたしかいないの?ならあなたの自演が相当すごいってことに
0364NAME IS NULL
2016/03/28(月) 18:23:49.53ID:???ミサワ病
または
日課の乳首いじりしてたら突然ポロっと取れて病院行ってきた病
0365NAME IS NULL
2016/03/28(月) 18:32:52.76ID:???一人で始められるお山の大将とその取り巻きごっこ
0366NAME IS NULL
2016/03/28(月) 18:33:37.11ID:W6YzWt9cそれではひきつづき「俺様が一番できる」をお楽しみください
0367NAME IS NULL
2016/03/28(月) 18:34:54.65ID:???「そういう人」はひとりいるじゃん。
それがわからないってことは、つまり君がそうとしか考えられない。
0368NAME IS NULL
2016/03/28(月) 18:38:18.37ID:???安価つけなよ
0369NAME IS NULL
2016/03/28(月) 21:30:52.33ID:???うおおお ありがとうございます!
調べててもパーティションだかパンティだかそんな内容しかでてこなくて困ってました。
これで寝れます
0370NAME IS NULL
2016/03/28(月) 21:41:02.42ID:Yr8T7iBH自作自演っぽいなw
0372NAME IS NULL
2016/03/29(火) 10:34:45.13ID:???ID:hsf+0Rn0 だよ。
いちいち間違いを指摘するのも時間の無駄なんで指摘しないが、こいつの駄目さ
かげんがわかんないなら君も同レベル。
0373NAME IS NULL
2016/03/29(火) 11:08:07.43ID:???他の端末で修正中のダーティデータが紛れてもいいから、とり急ぎの登録商品の一覧を
SELECT コード,品名
FROM 商品マスタ WITH (NOLOCK) WHERE 〜 ORDER BY 〜
という風に一覧取得したうえで、各レコードごとに、それがダーティデータ(ロックされている行)かどうか判別したいのですが
どうやったらいいじょうか。
気持ち的に
SELECT コード,品名,(case when この行がロックされているか then 1 else 0 end) as ダーティフラグ
FROM 〜
にしたいのですが
0374NAME IS NULL
2016/03/29(火) 12:52:10.03ID:???>>312が俺
0375NAME IS NULL
2016/03/29(火) 12:55:26.17ID:???DBA様以外の俺らが喧嘩しても意味なかったな。
謝るよ。
0376NAME IS NULL
2016/03/29(火) 12:56:46.02ID:???Microsoft SQL Server 総合スレ 10
http://echo.2ch.net/test/read.cgi/db/1385363382/
0377NAME IS NULL
2016/03/29(火) 13:16:09.98ID:???よかった。おめでとう
0378NAME IS NULL
2016/03/29(火) 16:38:18.72ID:???RDBMSの更新時に発生するロックのことなら、それは大抵一瞬なのでそんなこと画面に表示する意味ない。
そうではなくて、
1. 誰かがある商品の編集を開始する(ということをマークする)
2. 編集中は他ユーザは参照のみで編集はできない
という制限をかけるための「ロック」なら、別途「編集中フラグ」などで管理する必要がある。
0379NAME IS NULL
2016/03/29(火) 16:49:05.01ID:???0380NAME IS NULL
2016/03/29(火) 16:52:55.87ID:???その書き方だと、uncommitedなデータを意図的に読み出したいということにもなるんだけど
あえてそういうトランザクション分離レベルを指定しているのか、
それとも他端末のトランザクション中はとにかくダーティデータが混ざってしまうと勘違いしているのかどちら?
0381NAME IS NULL
2016/03/29(火) 17:02:49.18ID:???その発想はなかった
0382NAME IS NULL
2016/03/29(火) 17:04:12.93ID:sfT27TYgそもそもロックされてるデータがSELECT時に分かって編集中と表示しても、そのときのロックの状態しか分からないのでは意味がない。
編集中ではないものが次の瞬間、ロックされてたりもするだろうし。
0383NAME IS NULL
2016/03/29(火) 17:09:40.31ID:sfT27TYgそんなことするなら、昔のSQL ServerみたいにSELECTしただけでロックする設定で運用しろよ。
0384NAME IS NULL
2016/03/29(火) 17:35:37.11ID:???0385NAME IS NULL
2016/03/29(火) 18:13:47.31ID:???あらかじめ商品マスタテーブルにロックフラグ(Boolean型)を追加したうえで
ロックする側(トランザクションで括った中)で、ロックフラグを
まず、商品マスタテーブル
ロックフラグ
0386NAME IS NULL
2016/03/29(火) 18:15:46.03ID:???ロックする側(トランザクションで括った中)で
・BEGIN TRANS直後にロックフラグを立てる
・COMMIT直前にロックフラグを戻す
・何かトラブルあってROLLBACKしたら、ロックフラグは勝手に戻る
参照側はダーティなロックフラグを読み取って、ロックされてるかどうか見る
んで大丈夫ですかね
0387NAME IS NULL
2016/03/29(火) 18:27:47.11ID:???0388NAME IS NULL
2016/03/29(火) 19:46:42.60ID:???0389NAME IS NULL
2016/03/29(火) 22:20:39.74ID:???自分でロックフラグを操作する気なら、ダーティリードしちゃ駄目
ロックフラグ操作が正しく取得できないから、自分でフラグ操作する意味がなくなる
0390NAME IS NULL
2016/03/29(火) 22:22:39.80ID:???いわゆる楽観的ロックで良いんじゃないかと
0391NAME IS NULL
2016/03/30(水) 07:11:29.15ID:???・編集中は排他的ロック
(お手つき判定は編集開始時点にやりたい)
・編集中の半端な状態でもレコード内容の確認はしたいが
半端な状態(ダーティリード)であることは知りたい
・編集者のマシンがいきなり再起動しちゃっても
「強制フラグ倒し」みたいな別処理をしないでいたい
こんな要件です。
0392NAME IS NULL
2016/03/30(水) 07:13:48.27ID:???10人が別々のレコードを編集してたとき(排他ロック)
参照端末から全件抽出な操作したとき
・排他ロック分を除いた 990件 だけが出てくるのではNG
・編集中かどうかが分からない状態で 1000件 抜けてきてもNG
0393NAME IS NULL
2016/03/30(水) 07:35:00.15ID:???ダーティリードで排他制御なんて一般的には無理。
0394NAME IS NULL
2016/03/30(水) 07:41:48.05ID:9ZUEATtw> ・編集者のマシンがいきなり再起動しちゃっても
> 「強制フラグ倒し」みたいな別処理をしないでいたい
これがやりたければ編集開始時に別テーブルにロックレコード作るのが楽だと思うけど
その上で排他ロックとかread uncommittedとかせずに
> ・編集中の半端な状態でもレコード内容の確認はしたいが
編集中のプロセスは一項目毎に変更をコミットするとか
ロールバックしたい時はロックテーブルに保存された値を戻すのがいいのかな
何のためにこんなややこしい事をする必要があるのかいまいち分からんけど…
0395NAME IS NULL
2016/03/30(水) 09:35:21.44ID:???軽く試した限りだと、参照側が WITH (NOLOCK) 付けておけば直ちに変更が見えたのですが
確かに、それは「たまたま」であって、サーバーが保障してるわけじゃないですよねぇ
>>394
別テーブルにロックレコード作るとして
編集者のマシンが異常停止すると、それ残ったままになってしまいませんか?
起動時に自マシンのロックレコードの残骸を自動削除するような処理はやりたくありません。
(PCが壊れて起動できなくなった場合に、シス管がロックレコードを強制削除するような保守するのは避けたい)
0396NAME IS NULL
2016/03/30(水) 10:36:29.26ID:???> (PCが壊れて起動できなくなった場合に、シス管がロックレコードを強制削除するような保守
以外のやり方はないのか?
SQL Serverのことはよく知らないが、編集中のセッションIDだかプロセスIDだかを保存しといて、
つぎに誰かがロックを獲得しようとしたときに、そのセッションだかプロセスが存在するかどうか
チェックして、なければDELETEするとか。
0397NAME IS NULL
2016/03/30(水) 12:19:08.48ID:uLjgqC6Jなんだよロック残したいのかと思ったよw
0398NAME IS NULL
2016/03/30(水) 12:52:41.11ID:???0399NAME IS NULL
2016/03/30(水) 13:59:54.57ID:???機能要件の「編集中ロック」「変更途中の中途半端な状態」をごっちゃにするな。
「変更途中の中途半端な状態」と「ダーティリード」については、以下のことをよく考える必要がある。
以下、時系列:
1. User1がトランザクションを開始して、あるレコード(内容A)を変更し内容Bに変化した
2. User2が上記レコードを取得(内容はB)
3. User2は、内容Bということを前提になにかをする
4-1. User1が編集をUndoしてコミット(最終的には内容Aになる)
4-2. BからCに変更してコミット(最終的には内容Cになる)
4-3. ロールバックする(最終的には内容Aになる)
つまり、確定された状態は、内容Aか内容Cであり、内容Bなど存在しないというケース。
0400NAME IS NULL
2016/03/30(水) 14:11:48.02ID:???0401NAME IS NULL
2016/03/30(水) 14:13:22.06ID:???まだ伝わらないですか?
0402NAME IS NULL
2016/03/30(水) 14:22:20.82ID:???そんなの最初からわかってるわ。
お前が「ダーティリード」と特に明記してるから、その意図を明確にしようとしてるだけだ。
0403NAME IS NULL
2016/03/30(水) 14:25:03.57ID:???0404NAME IS NULL
2016/03/30(水) 15:10:06.97ID:???横からだが
そのステータスをを、DBのロック機構によって判断しようとしてるんだけど
>>402はそれは機能要件だろうと言ってる
つまりDBのロック機能を使うんじゃなくて、自分でフラグ管理して
ダーティリードするなって話
0405NAME IS NULL
2016/03/30(水) 16:03:43.31ID:???0406NAME IS NULL
2016/03/30(水) 16:30:05.51ID:???> ・編集中の半端な状態でもレコード内容の確認はしたいが
> 半端な状態(ダーティリード)であることは知りたい
編集前の状態ではだめなんですか
0407NAME IS NULL
2016/03/30(水) 19:39:01.73ID:9ZUEATtw「編集画面を開いたら対象レコードをロックしなければいけない」
という強い勘違いのせいで
話が面倒な事になってるだけの気がしてきた
0408NAME IS NULL
2016/03/30(水) 20:19:30.02ID:???> (PCが壊れて起動できなくなった場合に、シス管がロックレコードを強制削除するような保守するのは避けたい)
どんなアプリ使おうとしてるのか知らんけど、PCがダウンしたのか担当者がロックしたまま帰宅しちゃったのかを区別する仕組みがいることはわかるよな?
よくやる手は
30分に1回サーバーにアクセスしないと脅しを入れといて30分越えてたら問答無用でロック無効にする
とか
サーバー側のプログラムとクライアントが定期的に通信してて通信が途絶えたらロック解除する
とかかな
あと、お前の要件だとダーティリードとかは忘れた方がいい
0409NAME IS NULL
2016/03/30(水) 23:08:41.16ID:???postgres9.5
・テーブルデータ
create table suuji(suuji numeric);
insert into suuji values(20150505);
上記2つを実行
・欲しい結果
select * from suuji
where
to_char(suuji,'99999999')=
to_char(to_date('20150510','YYYYMMDD')-5,'YYYYMMDD')
の実行結果で1行データを取得出来ること
・説明
numericの項目を文字列化
'20150510'の値を日付化して5日引いた後に文字列化
それを比較した結果一致のはずなのに取得結果は0件
どうしてなのでしょうか?
0410NAME IS NULL
2016/03/30(水) 23:26:22.18ID:???0411NAME IS NULL
2016/03/31(木) 00:21:27.86ID:???何とか見つけることができました。
select * from suuji
where suuji = to_number(to_char(to_date('20150510','YYYYMMDD')-5,'YYYYMMDD'),'99999999');
こんなにキャストしなければいけないのでしょうか・・・
to_numberで日付を直接することはできそうにないのでこうなるの?
0412NAME IS NULL
2016/03/31(木) 00:46:09.39ID:???suujiじゃねーんだよ、numとかにしろや
0413NAME IS NULL
2016/03/31(木) 01:06:05.98ID:???to_char(num,'FM99999999')
date型にしてないのは何か理由があるって事でいいのかな。
0414NAME IS NULL
2016/03/31(木) 01:06:23.57ID:???0415NAME IS NULL
2016/03/31(木) 03:34:46.70ID:???0416NAME IS NULL
2016/04/02(土) 23:09:48.78ID:???商品マスタ(商品CD, 店舗CD, 販売地域, 販売金額, PRIMARY KEY(商品CD, 店舗CD, 販売地域))
■テーブルデータ
商品CD | 店舗CD | 販売地域 | 販売金額
-------------------------------------
T10001 | 000000 | 000 | 30,000
T10001 | 000100 | 001 | 27,000
T10001 | 000100 | 000 | 26,000
T10001 | 000000 | 001 | 24,000
T10001 | 000200 | 000 | 25,000
[商品マスタの説明]
・商品CD全てに店舗CDが'000000'(:店舗共通コード)と販売地域が'000'(:販売地域共通コード)が
付与されております。
・各店舗で全店舗と違う金額で販売する場合のみ、
店舗CDを指定したレコードを"商品マスタ"に登録してます。
・商品CDの数は10万レコードとそれなりにあります。
[取得したい結果]
商品CDと販売金額を取得します
・取得したいデータの優先順位
(1)店舗CD、販売地域が伴に指定したレコードがある場合
店舗CD = '000100', 販売地域 = '001' ⇒ 商品CD T10001, 販売金額 27,000
(2)店舗CDには指定したレコードがあり、販売地域は無い場合
店舗CD = '000100', 販売地域 = '999' ⇒ 販売地域を'000'で取得
店舗CD = '000100', 販売地域 = '000' ⇒ 商品CD T10001, 販売金額 26,000
(3)店舗CDに該当するものがなく、販売地域に該当するものがない場合
店舗CD = '999999', 販売地域 = '001' ⇒ 店舗CDを'000000'で取得
店舗CD = '000000', 販売地域 = '001' ⇒ 商品CD T10001, 販売金額 24,000
(4)店舗CDも販売地域も両方とも該当しない場合
店舗CD = '999999', 販売地域 = '999' ⇒ 店舗CD, 販売地域ともに共通レコードで取得
店舗CD = '000000', 販売地域 = '000' ⇒ 商品CD T10001, 販売金額 30,000
10万レコード + 店舗と販売地域で特化したレコード数千レコードがある状態から
SQLのみで商品CD毎の販売金額を取得する方法はございますでしょうか?
0417NAME IS NULL
2016/04/02(土) 23:21:05.63ID:???現状は、
店舗CD IN ('000000', 指定店舗CD) AND 販売地域 IN ('000', 指定販売地域)で取得 ⇒
取得した行配列を優先順位の通りにソート ⇒
ループで回して商品コードが重複する場合に優先度が低いものを削除
という流れで行っているのですが、ループで回して削除する箇所で時間が掛かっております。
SQLで取得することで時間を減らせれればと考えております。
宜しくお願いいします。
0418NAME IS NULL
2016/04/03(日) 00:20:11.82ID:???select 商品CD, 販売金額 from 商品マスタ
where 店舗CD=指定店舗CD and 販売地域=指定販売地域
union all
select 商品CD, 販売金額 from 商品マスタ T
where 店舗CD=指定店舗CD and 販売地域='000'
and not exists (
select * from 商品マスタ
where 商品CD=T.商品CD and 店舗CD=指定店舗CD and 販売地域=指定販売地域
)
union all
select 商品CD, 販売金額 from 商品マスタ T
where 店舗CD='000000' and 指定販売地域=指定販売地域
and not exists (
select * from 商品マスタ
where 商品CD=T.商品CD and 店舗CD=指定店舗CD and 販売地域=指定販売地域
)
and not exists (
select * from 商品マスタ
where 商品CD=T.商品CD and 店舗CD=指定店舗CD and 販売地域='000'
)
union all
(全部書いたらNGになったんで省略。パターンは同じ。)
0419NAME IS NULL
2016/04/03(日) 00:42:07.03ID:???and (販売地域 = '指定販売地域' or 販売地域 = '000')
で
max(店舗CD + 販売地域)をとればいいと思う
0420416
2016/04/03(日) 00:53:37.56ID:???ありがとうございます
無事いけました。
SQLは長くはなりますが、パターン部分は流用できるのでプログラムソース上は思ったより
コンパクトに出来ました。
なるほど"UNION ALL"で優先順位通り連結すればいけますね
AND NOT EXISTSの連結で綺麗にパターン化できますし
データファイルをオンラインで配布する関係でレコード数減らすために、
こういうデータ設計になってるのですが、その後の処理で困っていたので助かりました。
どうもありがとうございました。
0421416
2016/04/03(日) 00:59:01.68ID:???どうもありがとうございます。
なるほど、連結+MAXは盲点でした
文字列長固定なので、連結した後にMAXでもいけますね
こちらについても試してみます
色んな発想が得られて感謝してます。
0422NAME IS NULL
2016/04/03(日) 02:07:06.88ID:l98rC8erそれと各SELECT文にORDER BYを入れておいた方が処理順を把握できる。
処理途中で何か問題があったときにどこまで処理したか追跡しやすくなってテスト、運用が楽になる。
0423416
2016/04/03(日) 02:44:16.19ID:???アドバイスありがとうございます
他のソースでこういうSQLはしていないので、
修正前の取得方法と今回の修正後の取得方法について
第3者が分かるように理由込みでコメント残しておきました
ORDER BYの件参考になります。
検索結果画面等で表示順が絡む箇所でしかORDER BYを使ってなかったと思います。
動くことに重視しがちで、デバッグ等や運用についての意識が薄かったのでその辺り意識していきます。
0424NAME IS NULL
2016/04/11(月) 15:43:31.61ID:???SELECT *
FROM 売上
WHERE 商品コード IN ('A','B','C')
AND 日付 Between '2015/01/01' and '2015/12/31'
なSQL文の処理速度を上げたい場合、どのようなインデックスを貼るといいですか。
0425NAME IS NULL
2016/04/11(月) 16:08:26.66ID:???0426NAME IS NULL
2016/04/11(月) 16:47:46.81ID:???稼働して1年以内なら全く意味なし
2年経って選択率1/2になるが、table scanが選択されるかもしれない
10年くらい稼働すると意味がでてくるかもレベル
0427NAME IS NULL
2016/04/11(月) 16:54:21.79ID:???レコード件数は1000万件ちょっとです
SELECT のところは実際には SUM ったりするわけですが
レスポンスを向上させる良い手段はないかと思い
0428NAME IS NULL
2016/04/11(月) 16:57:05.42ID:???とりあえずチューニングアドバイザーに聞いてみる
0429NAME IS NULL
2016/04/11(月) 17:14:52.22ID:???パーティショニングかマテリアライズドビューか式インデックスあたりを検討してもいいかもね。
0430NAME IS NULL
2016/04/11(月) 17:42:20.54ID:???> 20年近くのデータがあって
> レコード件数は1000万件ちょっとです
先に言え
まぁ、1000万件くらいだったらたいしたことない場合もあるが
> SELECT のところは実際には SUM ったりするわけですが
先に言え
> レスポンスを向上させる良い手段はないかと思い
過去のデータを毎回再計算する必要が本当にあるかどうか考える
また、生データを毎回SUMする必要があるのか考える
例えば、mothlyで商品コード毎のサマリを事前にしておくとか
0431NAME IS NULL
2016/04/11(月) 18:03:58.99ID:???平均すると、月に2回しか売れてない商品だらけみたいで
0432NAME IS NULL
2016/04/11(月) 18:13:25.14ID:???それならどうしたって遅くなるわな
0433NAME IS NULL
2016/04/11(月) 18:31:49.14ID:???どゆこと?
0434NAME IS NULL
2016/04/11(月) 18:45:07.74ID:???> 平均すると、月に2回しか売れてない商品だらけみたいで
ちょっとよくわからんな
年500万件だとすると、月40万件ちょい
取り扱い品目が20万以上あるということか?
0435NAME IS NULL
2016/04/11(月) 19:03:32.12ID:???select * from 注文 group by 商品, 注文年月 -- 500万
0436NAME IS NULL
2016/04/11(月) 19:18:17.25ID:???端折りすぎでしょ。
0437NAME IS NULL
2016/04/11(月) 21:38:54.95ID:???はい、ずばりそのとおり
商品登録は30万件ほどです
0438NAME IS NULL
2016/04/11(月) 21:42:40.23ID:???INやめて商品コード毎のクエリに分割してみるとか。
0439NAME IS NULL
2016/04/12(火) 02:44:01.02ID:???実際に早くしたいSQLはどれなんだ?
0440NAME IS NULL
2016/04/12(火) 03:41:18.33ID:???> はい、ずばりそのとおり
クイズはいいからずばり仕様を明確にしていただけませんかね
0441NAME IS NULL
2016/04/12(火) 07:48:25.36ID:???フィールドに前年度売上とか当月売上とかを作って持たせるそうすればデータ件数は激減すると思う
0442NAME IS NULL
2016/04/12(火) 18:56:07.21ID:???指名 給料 月 
AAA 250000 1 
BBB 350000 1 
CCC 300000 1 
AAA 150000 2 
BBB 280000 2 
CCC 400000 2 
AAA 300000 3 
BBB 150000 3 
CCC 200000 3 
求める結果
指名 給料 月 
BBB 350000 1 
CCC 400000 2 
AAA 300000 3 
0443NAME IS NULL
2016/04/12(火) 19:20:31.11ID:???>>4
0444NAME IS NULL
2016/04/12(火) 20:01:57.45ID:???join使わずにできませんか?
0445NAME IS NULL
2016/04/12(火) 20:39:29.70ID:???join使うのが嫌な理由は?
0446NAME IS NULL
2016/04/12(火) 22:39:33.71ID:???よくある質問とその回答なんですよ。
0447NAME IS NULL
2016/04/13(水) 00:04:12.75ID:???0448NAME IS NULL
2016/04/13(水) 00:34:45.71ID:???複雑になっていくと可読性が悪い気がしまして。
>>446
王道的な書き方なんですね
>>447
サンプリングして頂けませんでしょうか!
0449NAME IS NULL
2016/04/13(水) 00:44:10.37ID:???join複雑と思うならSQL 触るのやめた方がいい
0450NAME IS NULL
2016/04/13(水) 01:03:33.49ID:???SQLSERVERなんですか。
0451NAME IS NULL
2016/04/13(水) 01:44:09.01ID:???0452NAME IS NULL
2016/04/13(水) 02:48:48.03ID:???それが気のせいだったと気づくのにさほど時間はかからないかと
ただ、初心者でもないのにjoinは複雑過ぎて保守できないなんていう人もごくまれにいるようなので
そうはならないでねと
0453NAME IS NULL
2016/04/13(水) 07:14:37.61ID:???0454NAME IS NULL
2016/04/13(水) 14:54:14.98ID:???こちらjoinを使い
>>4で対応は出来ましたが、
求める結果
最高給料者 給料 最低給料者 給料 月
BBB 350000 AAA 250000 1
CCC 400000 AAA 150000 2
AAA 300000 BBB 150000 3
このように出すにはどうすればよいですか?
0455NAME IS NULL
2016/04/13(水) 15:06:47.66ID:???0456NAME IS NULL
2016/04/13(水) 15:23:03.04ID:???maxができたんだから…(・ω・`)
0457NAME IS NULL
2016/04/13(水) 16:07:37.76ID:sVoHcofV0458NAME IS NULL
2016/04/13(水) 16:40:42.43ID:???0459NAME IS NULL
2016/04/13(水) 17:00:12.48ID:???0460NAME IS NULL
2016/04/13(水) 17:02:04.09ID:58GQfTRGどう分けるってカラム名のこと?
0461NAME IS NULL
2016/04/13(水) 17:03:07.09ID:58GQfTRG0462NAME IS NULL
2016/04/13(水) 17:08:38.96ID:58GQfTRGいろいろやり方はあるけど、一つ一つ段階を踏んで考えていかないと、間違ったSQLを作って、間違いに気付かない状況になるよ。
0463NAME IS NULL
2016/04/21(木) 23:57:45.76ID:???やりたいこと:
長いテキスト型のフィールド[MEMO]が含まれるテーブルA(5000レコード程度)と、
短いテキスト型のフィールド[KEYWORD]が含まれるテーブルB(50レコード)があります。
テーブルA.MEMO の文字列に含まれている、テーブルB.KEYWORDの文字列を検索して、
含まれる文字列(=テーブルB.KEYWORD)をリスト化したいと考えています。
ただし、テーブルA.MEMOには、テーブルB.KEYWORD内の複数の文字列が含まれている
場合と、全く含まれていない場合があり、複数含まれている場合、テーブルA.MEMOに
最初に現れる文字列のみリスト化する(テーブルB.KEYWORDで最初に見つかった文字列、
ではない)という条件になっていて、うまいこと処理する手段が思いつかずにいます。
このような場合、どんなSQLを組めば良いのでしょうか?
0464NAME IS NULL
2016/04/22(金) 00:19:41.69ID:???これを使って工夫することになるかなーと。
0465NAME IS NULL
2016/04/22(金) 04:18:08.10ID:???いちおうACCESSでこんなクエリ書いてみた
SELECT t1.MEMO,t2.KEYWORD
FROM (
SELECT MEMO, MIN(POS) AS MINPOS
FROM (SELECT MEMO,KEYWORD, InStr(MEMO,KEYWORD) AS POS FROM テーブルA, テーブルB WHERE InStr(MEMO,KEYWORD)>0)
GROUP BY MEMO
) t1
INNER JOIN (SELECT MEMO,KEYWORD, InStr(MEMO,KEYWORD) AS POS FROM テーブルA, テーブルB WHERE InStr(MEMO,KEYWORD)>0
) t2
ON t1.MEMO=t2.MEMO and t1.MINPOS=t2.POS
長いテキストってのがMEMO型とかだと、色々制限があるからこれじゃ無理
SQL SERVERでNVARCHAR(MAX)とかなら、InStrをCHARINDEXにしてサーバ側のSQLなら行けるかもしれん
0466NAME IS NULL
2016/04/22(金) 10:20:56.23ID:???ある列の何文字目のみを一致した文字がある場合、その文字に書き換えるっていうのはどうすればいいでしょうか?
123123123
の三文字目(3)を2に書き換えるということです。
0467NAME IS NULL
2016/04/22(金) 10:35:28.27ID:???0468NAME IS NULL
2016/04/22(金) 10:38:27.19ID:???oracleです。
0469NAME IS NULL
2016/04/22(金) 10:41:01.50ID:???0470NAME IS NULL
2016/04/22(金) 10:43:50.04ID:???0471NAME IS NULL
2016/04/22(金) 10:49:52.78ID:???set フィールド1 = substr(フィールド1,1,2) + replace( substr(フィールド1,3,1),3,2 ) + substr(フィールド1,4)
where substr(フィールド1,3) = 3;
正規表現でやっちまうのがええんやろうけどね
0472NAME IS NULL
2016/04/22(金) 10:53:10.94ID:???環境 oracle 11.2
内容は>>466
です。ただ、数字はランダムなので…
0473NAME IS NULL
2016/04/22(金) 11:05:13.15ID:???条件出しきれてねーじゃねーかちゃんと書け
0474NAME IS NULL
2016/04/22(金) 17:02:10.57ID:???たった数千レコードの更新に、アホみたいに時間がかかると思ったら
ロックエスカレーションなどという、お節介な機能が作動しやがるのか
デフォはAUTOで、積極的にエスカレートしていくんだよね?
速攻で無効にしてやったよ
0475NAME IS NULL
2016/04/22(金) 23:01:44.46ID:???0476NAME IS NULL
2016/04/22(金) 23:59:23.40ID:???くゎしく
0477NAME IS NULL
2016/04/23(土) 22:49:07.85ID:???特に重要な意味を持つカラムというわけではないけれど、
AUTO_INCREMENTを指定して、レコードに通し番号をつけて管理を便利にするとする。
このカラム名を、複数のテーブルで同じ(あるいは同じような)名前にしたいとき、
どういう名前にするのが定番?
プログラミング界隈で変数名を i にしておけば、大体どの言語でもループだろう、みたいな。
今は仮に id としてるけど、これで知らない人が見ても、そう思うのかどうか分からなくて。
あと何らかの理由で id が使えない場合、第二候補は何がある?
0478NAME IS NULL
2016/04/24(日) 09:02:28.81ID:???0479NAME IS NULL
2016/04/24(日) 10:57:38.59ID:???idだと、なんちゃら.id になるけど
なんちゃらidだと、なんちゃら.なんちゃらid になって冗長に思える
0480NAME IS NULL
2016/04/24(日) 11:05:07.74ID:???0481NAME IS NULL
2016/04/24(日) 11:05:48.25ID:???0482NAME IS NULL
2016/04/24(日) 11:17:01.59ID:???0483NAME IS NULL
2016/04/24(日) 11:51:24.03ID:???O/RM界隈なんかの影響が強いかもしれないけどね。
0484NAME IS NULL
2016/04/24(日) 12:24:49.31ID:???妥協かもしれないけど、そのままidで行くよ。
0485NAME IS NULL
2016/04/24(日) 16:27:50.96ID:EHzEirzOテーブルの結合構文を想像しろ。
テーブル別名つけていると、id = id となって同じ意味のidに見えてしまう。
0486NAME IS NULL
2016/04/24(日) 16:34:49.55ID:???正確には、同名を付けることが良くない?
同じ機能を持つものに、同じような名前をつけるって考え方は正しくとも、
全く同じ名前だとデメリットが大きいのかな。
あ、もちろん無機質な名前、短い名前は被りやすいというのは前提で。
0487NAME IS NULL
2016/04/24(日) 16:38:11.59ID:EHzEirzO0488NAME IS NULL
2016/04/24(日) 16:41:20.97ID:EHzEirzO業務として言葉が違うなら、そうなるのは当然だけど、そうじゃないのにカラム名が違うとか、やめてほしいわ。
0489NAME IS NULL
2016/04/24(日) 16:52:53.32ID:???同じ名前なら USING(id) とか使えるやつもある
0490NAME IS NULL
2016/04/24(日) 16:57:32.89ID:EHzEirzOそれはidに限った話ではないだろうが。
0491NAME IS NULL
2016/04/24(日) 17:00:10.86ID:???> record_idだったらまだ悪くはないと思うよ。
ほとんど意味のない命名にしか見えないが...
0492NAME IS NULL
2016/04/24(日) 17:47:23.74ID:???0493NAME IS NULL
2016/04/24(日) 18:06:25.13ID:???これは語るスレでしっかり語って欲しいところ。
0494NAME IS NULL
2016/04/24(日) 19:46:00.39ID:???> これは語るスレでしっかり語って欲しいところ。
いらんわ
0495NAME IS NULL
2016/04/24(日) 20:14:28.97ID:???どの社員がどの部署に所属するかというテーブルはどう作る?
0496NAME IS NULL
2016/04/24(日) 20:25:08.09ID:???create table 所属 (
社員 int references 社員テーブル(record_id),
所属 int references 所属テーブル(reaord_id)
);
0497496
2016/04/24(日) 20:27:11.14ID:???所属テーブル(reaord_id) ⇒ 所属テーブル(record_id)
0498NAME IS NULL
2016/04/24(日) 20:58:57.64ID:???0500NAME IS NULL
2016/04/25(月) 12:03:04.06ID:???個人的には多少冗長になっても「foo.foo_id」とかにしたい気はする
アプリ側のミスを減らすために冗長でも分かりやすい方を取りたい
けど、この手の半ば好みの問題的な話は正解を公の場で決めようとすると
不毛な宗教論争に陥りがちなので、チーム内で話し合って決定するか
あるいは部署や全社で共通のルールがあるならそれに従おうってことで
何にせよ一度採用した命名規則は明文化して全員で墨守するのが重要だよな
0501NAME IS NULL
2016/04/25(月) 12:18:10.60ID:QbznyTMwしかしなぜかDBAは開発が分からないことを理由にしているのか、テーブル名、カラム名を開発者に決めさせることがよくある。
0502NAME IS NULL
2016/04/25(月) 18:45:44.87ID:???そら上手くいかないのも分る
0503NAME IS NULL
2016/04/25(月) 21:20:42.42ID:???あらゆるカラムにテーブル名をつけるって規則なら見たことがある
そしてそのテーブル名はイニシャルだか何だかを繋いだ謎の文字列
0504NAME IS NULL
2016/04/25(月) 21:31:24.09ID:SbNuU5CK自転車乗り場のなんとかですかねw
0505NAME IS NULL
2016/04/25(月) 22:21:41.87ID:???0506NAME IS NULL
2016/04/25(月) 23:05:19.15ID:???0507NAME IS NULL
2016/04/26(火) 03:00:22.54ID:???http://echo.2ch.net/test/read.cgi/db/1444733172/
0508NAME IS NULL
2016/04/26(火) 07:07:51.82ID:???SELECT * する前提でフィールド名が重複しないように、だな
腐りきってる
0509NAME IS NULL
2016/04/26(火) 07:28:05.43ID:HcQi1tAzselect * 自体に何の罪もない
0510NAME IS NULL
2016/04/26(火) 14:07:41.48ID:gStihLhiテーブル名修飾をしないのは、ほぼありえない。
0511NAME IS NULL
2016/04/26(火) 14:24:30.73ID:???JOINしまくった挙げ句に、さらっと SELECT * なプログラマーは未だに生息してる
0512NAME IS NULL
2016/04/26(火) 14:26:26.75ID:???しらんけど
0513NAME IS NULL
2016/04/26(火) 14:34:09.83ID:gStihLhiORマッピングのことくらい調べてもの言えよ。
0514NAME IS NULL
2016/04/26(火) 14:36:32.32ID:gStihLhiSQLをまともに勉強したことがないやつがいるのか。
それは恐ろしいな。
0515NAME IS NULL
2016/04/26(火) 14:57:53.21ID:???ORMって全カラム持ってくるのが基本じゃないの?
しらんけど
0516NAME IS NULL
2016/04/26(火) 15:29:49.61ID:gStihLhi何言ってんのw
0517NAME IS NULL
2016/04/26(火) 15:44:20.91ID:???お前こそ何言ってんだかw
0518NAME IS NULL
2016/04/26(火) 15:54:03.02ID:gStihLhi0519NAME IS NULL
2016/04/26(火) 16:10:11.54ID:???よそでやれよ
0520NAME IS NULL
2016/04/26(火) 16:25:17.36ID:???それでも別に問題ないが?
0521NAME IS NULL
2016/04/26(火) 16:33:42.54ID:???0522NAME IS NULL
2016/04/26(火) 16:45:40.32ID:???一人なのか複数なのかわからんが
0523NAME IS NULL
2016/04/26(火) 16:52:25.00ID:gStihLhiこのスレは俺のスレッドだと言いたいわけか。
0524NAME IS NULL
2016/04/26(火) 16:57:04.46ID:???変なこと言う奴にそれ変だっていうと、このスレが俺のものになるのか?
どういうロジックだよ。
0525NAME IS NULL
2016/04/26(火) 17:04:34.63ID:???0526NAME IS NULL
2016/04/26(火) 17:06:33.37ID:???それだけでしょ
0527NAME IS NULL
2016/04/26(火) 17:20:58.87ID:???0528NAME IS NULL
2016/04/26(火) 21:29:05.22ID:???0529NAME IS NULL
2016/04/26(火) 23:23:00.96ID:gStihLhi0530NAME IS NULL
2016/04/26(火) 23:38:14.49ID:???経験則ではそうかもしれないが
0531NAME IS NULL
2016/04/26(火) 23:52:14.27ID:???その前提書かないことには変なこと書いてる人のままになるかと。
そしてそれは不本意でしょ?
0532NAME IS NULL
2016/04/27(水) 00:07:19.36ID:???でもそれを受け取るホスト言語でバインド変数を自動生成する仕組みも作ってた
0533NAME IS NULL
2016/04/27(水) 00:58:00.39ID:???0534NAME IS NULL
2016/04/27(水) 01:14:40.29ID:???使っちゃマズい状況なら使わない
使っても問題ない状況なら使う
そんだけ
0535NAME IS NULL
2016/04/27(水) 01:34:36.42ID:xBVjkvdeオラクルマスターでも結合を伴う場合は、テーブル名(別名).* にすると指導している。
このスレは初心者すぎるんだよ。
0536NAME IS NULL
2016/04/27(水) 02:10:45.73ID:???0537NAME IS NULL
2016/04/27(水) 02:50:14.92ID:???0538NAME IS NULL
2016/04/27(水) 10:11:45.42ID:???> オラクルマスターでも結合を伴う場合は、テーブル名(別名).* にすると指導している。
というのが唯一のよりどころな奴が暴れてると
0539NAME IS NULL
2016/04/27(水) 10:55:33.27ID:???クライアントにまで変更された内容が伝わる、というメリットもある
0540NAME IS NULL
2016/04/27(水) 10:58:14.89ID:???…EXISTSでな!
まあこの話はそろそろ終わりでいいだろ、質疑応答スレであって議論スレではないんだから
0541NAME IS NULL
2016/04/27(水) 11:41:47.95ID:???0542NAME IS NULL
2016/04/27(水) 20:28:53.18ID:???Oracleのテーブルに、SQLを格納したいんだけどさ、
シングルクォーテーション、ダブルクォーテーションが含まれている状態でInsertすることってできるの?
0543NAME IS NULL
2016/04/27(水) 20:32:50.87ID:???バイナリファイルですら突っ込めるのに何を言ってるんだよ...
0544NAME IS NULL
2016/04/27(水) 22:18:57.25ID:???プレースホルダ使おう、以上
0545NAME IS NULL
2016/04/28(木) 09:51:05.88ID:???0546NAME IS NULL
2016/04/28(木) 10:00:54.96ID:???string cmd1 = "IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='" + tableName + "') SELECT 1 ELSE SELECT 0";
string cmd2 = "select case when exists((select * from information_schema.tables where table_name = '" + tableName + "')) then 1 else 0 end";
SQL SERVERに対してならどちらも正常に実行できました。
こういう事は良く有る事でしょうか?
SQL文というのはどのデータベースに対しても同じように実行出来ると思っていたのですが、それは間違いですか?
0547NAME IS NULL
2016/04/28(木) 10:19:36.68ID:???0548NAME IS NULL
2016/04/28(木) 10:23:23.23ID:???0549NAME IS NULL
2016/04/28(木) 13:14:48.26ID:???SQLの規格への準拠度合いがデータベースによってまちまち。
それに加えて、それぞれに独自拡張がある。
0550NAME IS NULL
2016/04/28(木) 13:32:17.98ID:???詳しい説明ありがとうございました。
テーブルを作る、削除する、データを追加する、検索する
程度の簡単なSQLが実行出来ればいいのですが、それくらいの範囲でも
各社でコマンドが違いますか?
0551NAME IS NULL
2016/04/28(木) 13:38:00.85ID:???そのくらいなら方言じゃなくて標準語使えばいい。よっぽどじゃなきゃ標準語できる。
そこに無理矢理方言使うから他のDBで動かなくなる
0552NAME IS NULL
2016/04/28(木) 14:06:40.06ID:???そのsqlの標準語はどういう規格で決まっていますか?ググるキーワードを教えて下さい。
0553NAME IS NULL
2016/04/28(木) 14:18:23.35ID:???よく見ろ、SQL標準に入ってるCASE構文だ
0554NAME IS NULL
2016/04/28(木) 14:19:51.42ID:???まずSQLで検索しなよ
0555NAME IS NULL
2016/04/28(木) 14:24:17.58ID:???『SQL92/99標準リファレンスブック』みたいな本買えばいいよ
0556NAME IS NULL
2016/04/28(木) 14:34:49.21ID:???ありがとうございました。
さっそく買います。
0557NAME IS NULL
2016/04/28(木) 14:40:02.73ID:???各関数のページにどのDBで使えるか書いてあるの意外と重宝
0558NAME IS NULL
2016/04/28(木) 14:43:46.44ID:???ただのif文じゃね?
0559NAME IS NULL
2016/04/28(木) 15:04:45.49ID:???前半のはIFで後半のはCASEだな、自分もよく見てなかったよ、お恥ずかしい
0560NAME IS NULL
2016/04/30(土) 13:42:21.23ID:???col1, col2, col3の列がある時
col1, col3のみ取り出したい。
ただしcol3でdistinct したいんです。
全部文字型データです。
0561NAME IS NULL
2016/04/30(土) 13:53:53.00ID:???存在しないならcol1も入れてdistinctすればいい。
存在するならどっちのcol1の値を取り出すのか決めろ。
0562NAME IS NULL
2016/04/30(土) 14:09:32.46ID:???col1は複数存在します。
distinctでは最初に見つけた行以外を消したいです。
0563NAME IS NULL
2016/04/30(土) 14:11:42.63ID:???0564NAME IS NULL
2016/04/30(土) 14:25:16.91ID:???よろしく
0565NAME IS NULL
2016/04/30(土) 14:35:55.28ID:???レコードに「最初」って概念はないからそれは無理。要はどれでもいいってことだな?
なら最小のcol1を選ぶことにして
select min(col1), col3 ... group by col3
0566NAME IS NULL
2016/04/30(土) 16:12:58.22ID:WJU7LjMT0567NAME IS NULL
2016/04/30(土) 16:13:44.96ID:???select min(col1), col3 from table group by col3
で、出来ました。distinctと言うのを使わなくても出来るのですね。
もし、同じ条件で、col1, col2, col3を取り出すにはどうすれば良いでしょうか。
0568NAME IS NULL
2016/04/30(土) 16:16:48.67ID:???そうなると >>4 となる。理屈は考えて
0569NAME IS NULL
2016/04/30(土) 16:30:14.59ID:???ありがとうございました。うまくいきました。
取得する列が一個増えるだけで、SQLの記述がガラッと変わるんですね。
不思議です。
0570NAME IS NULL
2016/04/30(土) 17:17:27.94ID:WJU7LjMT0571NAME IS NULL
2016/04/30(土) 17:19:17.24ID:WJU7LjMTorder byもどうせいるんだろ?
グループ化するとソートされるから気づかないんだろうが。
0572NAME IS NULL
2016/04/30(土) 18:40:13.93ID:???いかにもSQLでやるべきことに対して>>566と書いたことは恥じなくていいのだろうか
0573NAME IS NULL
2016/04/30(土) 19:59:26.59ID:WJU7LjMT0574NAME IS NULL
2016/05/01(日) 11:35:19.32ID:???そう言う場合、大概はテーブル設計が間違ってる
>>4のやり方なら、項目数で書き方が変わる事はない
0575NAME IS NULL
2016/05/01(日) 13:36:23.38ID:41MU92iyだからクソデータモデルとクソSQLのシステムばっかりできるんだよ。
0576NAME IS NULL
2016/05/01(日) 13:49:54.37ID:???それちょっとテーブル定義書いてみろよw
0577NAME IS NULL
2016/05/01(日) 13:54:18.97ID:41MU92iy0578NAME IS NULL
2016/05/01(日) 14:07:31.63ID:???0579NAME IS NULL
2016/05/01(日) 14:15:21.52ID:???create table oya {
col3 primary key
}
create table ko {
col1 primary key,
col3 not null references oya(col3)
}
0580NAME IS NULL
2016/05/01(日) 14:17:32.75ID:???create table ko {
col1 not null,
col3 not null,
primary key(col1,col3)
foreign key (col3) references oya(col3)
}
0581NAME IS NULL
2016/05/01(日) 14:17:57.33ID:???0582NAME IS NULL
2016/05/01(日) 14:51:38.12ID:41MU92iyオラクル社とマイクロソフトにお手紙でも書いてください。
0583NAME IS NULL
2016/05/01(日) 17:40:00.74ID:???>>567 から >>4 になるに当たってがらっとかわったわけで、それは別に設計が間違えていたわけじゃない
0584NAME IS NULL
2016/05/01(日) 17:43:55.39ID:???書くまでも無く、クエリになんらよい変化をもたらしませんでしたな
0585NAME IS NULL
2016/05/01(日) 17:46:10.73ID:41MU92iy0586NAME IS NULL
2016/05/01(日) 17:52:58.13ID:41MU92iy実際にそれだけのテーブルを作るわけじゃないだろうが。
グールプ化のSQLも重複排除なんて言ってたけど、ただのSQL初心者じゃん。
自分の求めたいことを説明できない時点で、自分自身が分かってないんだから、順序立てて考えろと言いたい。
0587NAME IS NULL
2016/05/01(日) 18:19:51.51ID:???いや、あなたもいまいち説明できてないよ。
>>575 によると、テーブルを分割するとデータモデルは正しくなり、SQLも形を変えるように読める。
しかし結果は変わらなかった。それどころかもともとのテーブルが>>579のような形である可能性は十二分にある。
0588NAME IS NULL
2016/05/01(日) 18:20:23.09ID:???0589NAME IS NULL
2016/05/01(日) 19:58:05.44ID:41MU92iy0590NAME IS NULL
2016/05/01(日) 20:10:38.73ID:???まぁ、「そのくらい自分で考えろ」と逃げてもいいけどさ。
0591NAME IS NULL
2016/05/01(日) 20:26:21.37ID:???0592NAME IS NULL
2016/05/01(日) 21:18:01.18ID:???0593NAME IS NULL
2016/05/02(月) 11:32:13.16ID:???こういう状況でこんな処理がすぐに出来れば一人前と言うような課題を出して下さい。
0594NAME IS NULL
2016/05/02(月) 11:44:38.60ID:???0595NAME IS NULL
2016/05/02(月) 14:03:49.35ID:???知識だけなら
高度情報処理(データベース)
ぐらいを取れればいいんじゃね
0596NAME IS NULL
2016/05/02(月) 15:57:03.63ID:???全然足りない
0597NAME IS NULL
2016/05/02(月) 16:18:27.82ID:???もっと上位の設計とか運用が重視されてた気がするが
0598NAME IS NULL
2016/05/02(月) 16:25:13.07ID:???やりたいことがわかってて設計がまともにできてれば SQL ぐらい普通に書けるでしょ
超絶技巧の SQL なんて書けなくてもいいし
0599NAME IS NULL
2016/05/02(月) 16:29:12.56ID:???0600NAME IS NULL
2016/05/02(月) 16:46:06.25ID:???お前の「普通」はレベルが低すぎる
0601NAME IS NULL
2016/05/02(月) 16:51:23.90ID:???例えば分析関数みたいに勉強しないと絶対に書けないものとか、
データベース毎の実行計画の確認方法とか、統計情報の見方とか
そういうの勉強しないとわからんでしょ
それを普通といってるのか、普通を超えてるのかしらないけど
0602NAME IS NULL
2016/05/02(月) 17:11:30.55ID:???普通にSQLを書きたければ、普通にそれを書けるような勉強・努力・経験が必要というあたりまえのこと。
0603NAME IS NULL
2016/05/02(月) 17:15:57.86ID:???こう言うアホは実務の邪魔にしかならん
0604NAME IS NULL
2016/05/02(月) 17:17:48.63ID:???その前提の設計とかは情報処理程度でまずはいいだろ
って話
0605NAME IS NULL
2016/05/02(月) 17:40:02.59ID:???やばいな
0606NAME IS NULL
2016/05/02(月) 18:05:23.73ID:???設計の話じゃなくてクエリの話なんだが
0607NAME IS NULL
2016/05/02(月) 18:06:13.70ID:???あと、お前多分データベーススペシャリストの内容知らんだろうから調べとけ
0608NAME IS NULL
2016/05/02(月) 18:16:33.54ID:???0609NAME IS NULL
2016/05/02(月) 18:24:01.24ID:???0610NAME IS NULL
2016/05/02(月) 18:30:05.29ID:???設計がまともにできたら
って書いてあるんだが
日本語も理解できないのかよ w
>>607
持ってますけどなにか?
0611NAME IS NULL
2016/05/02(月) 18:33:30.18ID:???お前にとっては with が超絶技巧なのか
0612NAME IS NULL
2016/05/02(月) 19:05:01.39ID:???OracleのSQL基礎の問題集でも買ってすらすら解けるようならまあいいんじゃない?
再帰問い合わせがないとかCASEがないとかEXISTSがないとか
いろいろ難はあるけどまずは基礎ってことで
0613NAME IS NULL
2016/05/02(月) 19:11:13.84ID:qxw3T0B90614NAME IS NULL
2016/05/02(月) 21:09:02.67ID:???この例を見て
http://blog.geekq.net/2010/08/11/add-column-safely-mysql/
このように実行しても
IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA=sakila
AND COLUMN_NAME='my_column'
AND TABLE_NAME='my_table_name') ) THEN
ALTER TABLE my_table_name ADD my_column varchar(2048) NOT NULL DEFAULT '';
END IF;
エラーします。どこが間違っていますか?
0615NAME IS NULL
2016/05/02(月) 21:58:19.48ID:qxw3T0B9そもそもそんなやり方でいきなりテーブル定義を変更してはいけません。
0616NAME IS NULL
2016/05/02(月) 21:58:25.30ID:???DBMSのバージョンと出力されているエラーメッセージぐらいは書こう
話はそれからだ
0617NAME IS NULL
2016/05/02(月) 22:00:49.81ID:???urlの例は間違いということですか?
0618NAME IS NULL
2016/05/02(月) 22:01:24.35ID:???sqlにエラーがあります
0619NAME IS NULL
2016/05/02(月) 22:01:52.37ID:qxw3T0B9MySQLはよく分からないけと、それって共有ロックがかかってる状態で、テーブル定義を変更しようとしてるからじゃないの?
0620NAME IS NULL
2016/05/02(月) 22:02:02.71ID:???0621NAME IS NULL
2016/05/02(月) 22:05:34.61ID:qxw3T0B90622NAME IS NULL
2016/05/02(月) 22:09:32.21ID:???分解しても特定できなかったのです
0623NAME IS NULL
2016/05/02(月) 22:20:48.76ID:qxw3T0B9まずそのSELECT文は正しいのか?
0624NAME IS NULL
2016/05/02(月) 22:34:44.10ID:qxw3T0B90625NAME IS NULL
2016/05/02(月) 22:38:15.98ID:qxw3T0B90626NAME IS NULL
2016/05/02(月) 22:41:02.33ID:aUzf9M0e0627NAME IS NULL
2016/05/03(火) 09:44:26.40ID:???sakilaって何だよ
文字列ならちゃんと囲め
0628NAME IS NULL
2016/05/03(火) 10:44:39.78ID:???ちょっと何言ってっかわかんないっすね
0629NAME IS NULL
2016/05/03(火) 10:44:40.34ID:???0630NAME IS NULL
2016/05/03(火) 12:36:52.84ID:CwXNjZUShttp://echo.2ch.net/test/read.cgi/db/1424001054/
0631NAME IS NULL
2016/05/06(金) 10:47:32.70ID:???妥当な設計ができるようになる知識と、妥当なクエリを書く知識は別物だって言ってるんだが。
> 持ってますけどなにか?
お前は、データベーススペシャリストで扱うレベルのクエリしか書かないのか?
だとしたら、それで十分だと思うのも無理はない。
0632NAME IS NULL
2016/05/06(金) 11:19:52.13ID:uq34uOVX設計の知識とクエリを書く知識との間にはおそらく深く濃密で淫靡な関係があるんやで
0633NAME IS NULL
2016/05/06(金) 11:20:00.44ID:???> 妥当な設計ができるようになる知識と、妥当なクエリを書く知識は別物だって言ってるんだが。
誰も同じと言ってる奴はいないんだが、誰と戦ってるんだ?
> お前は、データベーススペシャリストで扱うレベルのクエリしか書かないのか?
実務ならね
> だとしたら、それで十分だと思うのも無理はない。
意味不明な勝利宣言乙 w
0634NAME IS NULL
2016/05/06(金) 14:18:30.55ID:???0635NAME IS NULL
2016/05/06(金) 15:25:37.82ID:zcqKFhJ2その3つが揃わないとまともなものはできないけどな。
0636NAME IS NULL
2016/05/06(金) 15:34:39.28ID:???0637NAME IS NULL
2016/05/06(金) 20:58:17.29ID:uq34uOVX関係ある言ってんのに意地っぱりなやつやな
0638NAME IS NULL
2016/05/07(土) 10:36:30.67ID:???SQLite 3.8.3.1 を python3 から利用
・テーブルデータ
CREATE TABLE TableNames(utid INTEGER PRIMARY KEY, tableName TEXT)
・欲しい結果
tableName が同じデータの場合は何もしない。
tableName がない場合は、追加したい。
・説明
INSERT INTO TableNames(tableName) VALUES('TEST1') WHERE NOT EXISTS (SELECT 1 FROM TableNames WHERE tableName = 'TEST1')
で実行すると
SQLError: near "WHERE": syntax error
でした。
よろしくお願いします。
0639NAME IS NULL
2016/05/07(土) 10:47:16.27ID:yfxTR66qそんな構文聞いたことがない。
あほくさ。
0640NAME IS NULL
2016/05/07(土) 10:57:56.87ID:???自己解決しました。 CREATE で UNIQUE 指定したらできました。
0641NAME IS NULL
2016/05/07(土) 13:38:47.65ID:yfxTR66q0642NAME IS NULL
2016/05/08(日) 16:29:51.36ID:???MS SQL Server(LocalDB)
漢字、カタカナ、ひらがな、数字、記号のいずれか1文字が入ったカラム[Character]を持つテーブル"Table1"(40万件ほど格納)があります。
[Character]に入っている文字漢字、カタカナ、ひらがな、数字、記号が、それぞれ何個あるか確認したいのですが、
どのようなクエリにすれば良いでしょうか?
0643NAME IS NULL
2016/05/08(日) 16:36:26.41ID:mxeFBByy文字コードによって違うかどうかはしらない。
0644NAME IS NULL
2016/05/08(日) 16:46:56.61ID:???0645NAME IS NULL
2016/05/08(日) 16:53:00.85ID:mxeFBByy0646NAME IS NULL
2016/05/08(日) 16:54:36.42ID:mxeFBByy0647NAME IS NULL
2016/05/08(日) 16:57:23.62ID:???0648NAME IS NULL
2016/05/08(日) 17:00:31.83ID:mxeFBByy0649NAME IS NULL
2016/05/08(日) 17:07:52.00ID:???正確書いてみなよ
0650NAME IS NULL
2016/05/08(日) 17:10:43.13ID:mxeFBByyおまえは不勉強ではないと書いているけどなw
0651NAME IS NULL
2016/05/08(日) 17:12:11.82ID:mxeFBByyすぎないか。
0652NAME IS NULL
2016/05/08(日) 17:14:19.86ID:mxeFBByyすぎない。
よく「か」を忘れるやつがいるけど、仕事してんの?
0653NAME IS NULL
2016/05/08(日) 17:15:51.27ID:???それはどうも。
>>651
一般的な口語表現ですよ。ネットスラングですらない。
どうせ正確なクエリを書きはしないんでしょう?
俺は状況を限定しなければ書けないけれど、
>>645 の段階で正確に書こうと思えば書けるという含みを持たせてるんだから
どうせなら書いてほしい。
0654NAME IS NULL
2016/05/08(日) 17:17:36.33ID:mxeFBByy俺はSQL Serverの専門家ではない。
0655NAME IS NULL
2016/05/08(日) 17:19:13.47ID:???> わざわざ正確書く必要ないだろ、不勉強の初心者に。
じゃなくて
正確には書けないって言っとけばいいんだよ。俺みたいに。
0656NAME IS NULL
2016/05/08(日) 17:20:10.39ID:mxeFBByy0657NAME IS NULL
2016/05/08(日) 17:21:03.41ID:mxeFBByyヒントを与えてやっただけだろうが。
いきなり正解を書いて相手のためになるのか?
0658NAME IS NULL
2016/05/08(日) 17:22:54.41ID:mxeFBByyこのスレを否定することになるぞ。
まあ、このスレは俺は嫌いなんだが。
0659NAME IS NULL
2016/05/08(日) 18:53:18.42ID:???select
sum(case when Character like '[0-9]' then 1 else 0) as 数字の個数,
sum(case when Character like '[ぁ-ん]' then 1 else 0) as ひらがなの個数,
sum(case when Character like '[ァ-ン]' then 1 else 0) as カタカナの個数
from Table1
という感じで増やす。
0660NAME IS NULL
2016/05/08(日) 19:49:16.07ID:???適当な文字との大小範囲比較でやる方法が示されてるけど
SQL ServerならSQL CLRで.NETの正規表現クラス使うって方法もあるかもしれん
LocalDBで使えるかどうか知らんが
それだとUnicodeのブロックでIsHiraganaとかIsKatakanaとかあるぞ
0661NAME IS NULL
2016/05/09(月) 11:05:38.14ID:???> DB設計スレとSQLスレは、回答すると批判する性格の悪いやつがよくいるから困るわ。
正しくない回答したんだろ
0662NAME IS NULL
2016/05/09(月) 11:27:35.93ID:???0663NAME IS NULL
2016/05/09(月) 11:39:41.66ID:???* 「1文字」という条件を読めてない
* 「それぞれ何個あるか確認したい」を実現できていない
* 文字種別毎に複数回のクエリを発行する(と読める)
と言う意味で、もうダメダメ。
こういうレベルのゴミレスしといて、俺様偉いするから叩かれるんだよ。
0664NAME IS NULL
2016/05/09(月) 11:44:50.11ID:???0665NAME IS NULL
2016/05/09(月) 11:46:50.39ID:???自分がレスしたいようにすればいい
0666NAME IS NULL
2016/05/09(月) 11:55:25.11ID:???0667NAME IS NULL
2016/05/09(月) 13:40:40.63ID:???添削してまともな回答する人が増えるからなw
0668NAME IS NULL
2016/05/09(月) 14:05:59.99ID:???その答えが正しいか確認したりするとそれすなわち答えなんで、それ教えた方が楽なんだよ
0669NAME IS NULL
2016/05/09(月) 14:41:11.47ID:???気に入らないなら、回答する義務はないんだし
0670NAME IS NULL
2016/05/09(月) 14:42:53.67ID:???0671NAME IS NULL
2016/05/09(月) 15:05:28.59ID:???0672NAME IS NULL
2016/05/09(月) 15:17:35.49ID:bsfml+jJ0673NAME IS NULL
2016/05/09(月) 15:19:52.24ID:bsfml+jJ0674NAME IS NULL
2016/05/09(月) 15:27:08.00ID:???0675NAME IS NULL
2016/05/09(月) 15:45:36.07ID:???例えばこのスレでいうとどの質問?
0676NAME IS NULL
2016/05/09(月) 15:56:30.96ID:???> 誰と戦ってるんだ?
お前とだけど。
> 実務ならね
あっそ。
レベル低すぎだわ。
0677NAME IS NULL
2016/05/09(月) 16:08:45.21ID:???どちらのスレも、主にお前がトリガーになって荒れるんだが
0678NAME IS NULL
2016/05/09(月) 16:20:21.17ID:bsfml+jJ0679NAME IS NULL
2016/05/09(月) 18:32:48.79ID:???つまり前者の方法で成功したクエリ文字列をコピペしてphpなどの文字列に埋め込めば良いのかどうか?
文字列を囲むシングルやダブルのクオーテーションとかの置換など必要ですか?
0680NAME IS NULL
2016/05/09(月) 18:38:51.94ID:bsfml+jJPHPなどのスレで聞いてください。
SQLの話ではないので。
0681NAME IS NULL
2016/05/09(月) 18:46:32.25ID:???同意
>>680
珍しく同意
0682NAME IS NULL
2016/05/09(月) 18:51:31.19ID:???0683NAME IS NULL
2016/05/10(火) 12:21:48.42ID:txEc0BOi0684NAME IS NULL
2016/05/10(火) 13:29:48.97ID:???> クエリの書き方は全く同じで良いですか?
それで良いが、よりよい方法がある(プリペアードクエリ)
> 文字列を囲むシングルやダブルのクオーテーションとかの置換など必要ですか?
置換は不要。
ただし、エスケープは必要になる場合がある。
0685NAME IS NULL
2016/05/10(火) 13:36:58.97ID:???日付の書き方とか、項目名[]で囲まなきゃとかちょろちょろあるわな
0686NAME IS NULL
2016/05/11(水) 16:07:53.35ID:???0687NAME IS NULL
2016/05/11(水) 16:41:16.63ID:???とりあえず全部の
テーブル名、
データベース名、
カラム名を[]で囲ってさらに""で囲っておけばいい
0688NAME IS NULL
2016/05/11(水) 16:45:31.80ID:???日付のところいじった記憶あるな…DB2だったかなあ
0689NAME IS NULL
2016/05/11(水) 17:15:12.38ID:???0690NAME IS NULL
2016/05/11(水) 20:13:33.75ID:???> 意味不明な勝利宣言乙 w
0691NAME IS NULL
2016/05/12(木) 05:27:41.67ID:HmbS4CfDhttp://echo.2ch.net/test/read.cgi/db/1462998353/
0692NAME IS NULL
2016/05/12(木) 05:29:24.40ID:HmbS4CfDhttp://echo.2ch.net/test/read.cgi/db/1462998547/
0693NAME IS NULL
2016/05/12(木) 10:34:32.24ID:???実務でデータベーススペシャリストレベルのクエリ/知識で事足りてるなんてレベル低すぎだろ。
何が意味不明なんだか。
0694NAME IS NULL
2016/05/12(木) 11:24:31.79ID:???ってか w
0695NAME IS NULL
2016/05/12(木) 11:51:10.46ID:???0696NAME IS NULL
2016/05/12(木) 13:13:34.27ID:???0697NAME IS NULL
2016/05/12(木) 13:50:40.34ID:???SQLで気にしたことはないなあ
不格好でも性能さえ良ければ良いという感じ
0698NAME IS NULL
2016/05/12(木) 14:03:19.44ID:???> 常に知識をフル活用したクエリを書かないといけない病ですか
何が得意なのかしらないけど、コーディングが得意でかなりの知識を持っていたとして、
いつでも知識をフル活用しないとコードが書けないんですか?
0699NAME IS NULL
2016/05/12(木) 17:04:11.85ID:???大文字小文字適当なやつとか、余分なスペース一切無しで改行一切なしの数千文字とか見たら、考えが変わるかもよ
0700NAME IS NULL
2016/05/12(木) 17:23:54.67ID:???データモデル・DB論理・物理設計スレ → DB設計を語るスレ
SQL初心者質問スレ → このスレ
でいいじゃん
0701NAME IS NULL
2016/05/12(木) 19:41:05.20ID:???なんで俺あてなんだろう。しかもなんか話変わってるし。
とりあえず >>693 と話しててくださいな
0702NAME IS NULL
2016/05/12(木) 23:18:25.61ID:HmbS4CfD0703NAME IS NULL
2016/05/13(金) 00:02:07.43ID:???0704NAME IS NULL
2016/05/13(金) 10:40:00.28ID:???まぁまぁ妥当な設計になってるのは当然のこととして、クエリがシンプルで済むかどうかは要件によるだろ
0705NAME IS NULL
2016/05/13(金) 10:51:29.84ID:???0706NAME IS NULL
2016/05/13(金) 12:57:50.58ID:???実務でややこしい SQL なんてめったにお目にかからんけどな
0707NAME IS NULL
2016/05/13(金) 13:06:32.36ID:???お前もういい加減にしとけ
0708NAME IS NULL
2016/05/13(金) 13:31:08.43ID:???0709NAME IS NULL
2016/05/13(金) 13:33:15.73ID:???0710NAME IS NULL
2016/05/13(金) 13:42:56.90ID:???保存しておいたりなどの対処が必要になる。
シンプルなデータ構造で複雑なSQLを書くのか、
シンプルではないデータ構造でシンプルなSQLを書くのか
という選択となる。
複雑な要求を、シンプルなデータ構造とシンプルなSQLで実現できることはまれ。
高度な機能、例えば再帰クエリサポートや分析関数サポート、ランダムサンプリング機能
などがRDBMSに実装されていれば、SQLがシンプルになる場合もある。
0711NAME IS NULL
2016/05/13(金) 14:10:20.52ID:???0712NAME IS NULL
2016/05/13(金) 14:22:26.51ID:???例えば、こういう例だとどうでしょう。
hoge: 何かの開始・終了時刻を保持する
(id(PK), start_ts, end_ts) =
(1, '2016-05-01 10:00', '2016-05-01 20:00'),
(2, '2016-05-02 10:00', '2016-05-02 20:00'),
(3, '2016-05-01 08:00', '2016-05-01 09:00'),
(4, '2016-05-01 12:00', '2016-05-01 15:00'),
(5, '2016-05-01 18:00', '2016-05-02 02:00')
要求:全データの重複部分を抽出する
結果:
2016-05-01 12:00 〜 2016-05-01 15:00
2016-05-01 18:00 〜 2016-05-01 20:00
この要求は: シンプルである or シンプルではない
私の感覚では、この要求はシンプルでは無く、何らかのRDBMSの恩恵がない限り
SQLは複雑なものになると思います。
0713NAME IS NULL
2016/05/13(金) 14:30:32.53ID:???0714NAME IS NULL
2016/05/13(金) 14:45:26.20ID:???アプリでやった方がやりやすそうだし
後のメンテナンスも楽だろう
0715NAME IS NULL
2016/05/13(金) 14:58:09.06ID:???0716NAME IS NULL
2016/05/13(金) 15:03:52.95ID:???あー、こういうメンタリズム持ってる奴が、全件取得してコードであれこれやってるのか
0717NAME IS NULL
2016/05/13(金) 15:18:55.64ID:???こういう奴が、insert/updateの前にテーブルをロックして、コードで妥当性を確認したりするんだよ
0718NAME IS NULL
2016/05/13(金) 15:42:48.40ID:???0719NAME IS NULL
2016/05/13(金) 16:32:26.85ID:???0720NAME IS NULL
2016/05/13(金) 16:51:07.85ID:???自分で例を出すといてあれなんですが、ちょっと難しすぎました。
少し考えたんですが、私には無理でした。すみません。
重なりが最高2レコードまでという条件を付加すれば、PostgreSQLなら簡単に書けます。
SELECT lower(t.dup) as start_ts,
upper(t.dup) as end_ts
FROM (
SELECT tstzrange(t1.start_ts, t1.end_ts) * tstzrange(t2.start_ts, t2.end_ts) as dup
FROM hoge as t1
JOIN hoge as t2
ON t1.id < t2.id
AND tstzrange(t1.start_ts, t1.end_ts) * tstzrange(t2.start_ts, t2.end_ts) <> 'empty'
) as t
0721NAME IS NULL
2016/05/13(金) 17:01:58.50ID:???重複の開始と終了の基準は?特に複数の重複がある場合
idは何らかの順序で振られてる保障があるのか?
まあSQLだけで出来なくはないだろうけど
それがシンプルかどうかはしらん
0722NAME IS NULL
2016/05/13(金) 17:32:11.87ID:???>>721
> 重なりってのは完全に内包されるような事もあるのか?
はい。
> 重複の開始と終了の基準は?特に複数の重複がある場合
hogeテーブルが、どこかの部屋の誰かの入出・退出記録だとしたとき、
同時に二人以上存在した時間。
> idは何らかの順序で振られてる保障があるのか?
PK以外特に何もありません。
0723711
2016/05/13(金) 18:32:34.17ID:???たぶん誰かと勘違いしてるけど、まぁいいや。
select l.id, r.id, greatest(l.start_ts, r.start_ts), least(l.end_ts, r.end_ts)
from hoge as l join hoge as r on (l.start_ts <= r.end_ts and l.end_ts >= r.start_ts)
where l.id < r.id
イディオムで構成されたクエリではあるけど、シンプルかどうかは読む人に任せるよ。
greatest leastは標準ではないけどたいていのRDBMSにあるでしょう。
なければ case つかってください。
0725NAME IS NULL
2016/05/13(金) 19:12:20.29ID:???重なりが2つまでなら、ちょっと簡単すぎたかも。
0726NAME IS NULL
2016/05/13(金) 19:21:32.04ID:???まだいたのかよ w
>>712
ほぼ >>723 と同じだが
select
r.start_ts as start_ts,
case
when l.end_ts < r.end_ts
then l.end_ts
else r.end_ts
end as end_ts
from hoge as l join hoge as r
on
r.start_ts between l.start_ts and l.end_ts
and l.id <> r.id
これで >>712 のデータなら求める結果は出るけど重なりがネストしていると余計なレコードがでる
例えば
(6, '2016-05-01 13:00', '2016-05-04 14:00')
を追加すると
2016-05-01 12:00 〜 2016-05-01 15:00
2016-05-01 18:00 〜 2016-05-01 20:00
2016-05-01 13:00 〜 2016-05-01 14:00
2016-05-01 13:00 〜 2016-05-01 14:00
となる
> 要求:全データの重複部分を抽出する
は満たしてるけどこの余計なレコードは大抵要らないよね
でも俺の頭だと消す方法わからん...
0727NAME IS NULL
2016/05/13(金) 19:27:05.92ID:???で、君ならどうするの?
まさか煽ってるだけじゃないよね?
0729NAME IS NULL
2016/05/13(金) 21:38:30.94ID:???だから重なりの開始、終了ってのはいつの事を指してるんだ
たとえば、日付は同じだとして
1時〜5時
2時〜6時
3時〜7時
ってデータがあったら、どんな結果が欲しいんだよ
そこに
0時〜9時
ってデータもあったら、どんな結果になればいいんだよ
0730NAME IS NULL
2016/05/13(金) 21:53:05.81ID:???>>722 じゃないけど
> 1時〜5時
> 2時〜6時
> 3時〜7時
⇒ 2時〜6時
> そこに
> 0時〜9時
⇒1時〜7時
じゃね?
0731NAME IS NULL
2016/05/14(土) 08:09:52.84ID:wCMs+ZVVそれはDBMS側がやっているのか、アプリケーションがやっているのかの違いで、DBMSに処理を任せすぎると性能問題の対処が難しくなる。
0732NAME IS NULL
2016/05/14(土) 08:53:03.15ID:???0733NAME IS NULL
2016/05/14(土) 12:21:12.49ID:wCMs+ZVV汎用性と特化の違いが分からないのか?
DBMSの処理が最適とは限らない。
しかもSQLで何もかもやらせるのは、仕様変更があった場合、工数を増大させ、性能問題、リソース問題を引き起こすリスクがある。
なかにはSQLのテストはしないなんてプロジェクトもあるから、SQL検証用のテストデータ作り、テストで苦労するSQLを書くやつがいるんだよな。
0734NAME IS NULL
2016/05/14(土) 12:27:22.23ID:wCMs+ZVV仕様変更でSQLを変更すると、もとの仕様からも大きく外れたものになってしまうこともある。
SQLはちょっとしたミスでまったく意味が変わってしまうから、本当にリスクが高いんだよ。
よほどSQLに詳しくて、実データにも詳しくない限り、安易なSQLの変更は危険。
0735NAME IS NULL
2016/05/14(土) 12:32:45.30ID:???そいつがその後プロジェクトに残るとは限らないからな
そこがメンテする度に、すでにやめた会社から連絡が来て
対応することになるのかな?
SQLに限った話ではないけどね
0736NAME IS NULL
2016/05/14(土) 13:01:20.80ID:???何を言ってるのか知らんけど
だから
> 全件取得してコードであれこれ
やれってか?
極端な例出す奴はバカの法則 w
0737NAME IS NULL
2016/05/14(土) 14:29:03.25ID:???0738NAME IS NULL
2016/05/14(土) 16:23:52.68ID:???DBはMySQL 5.5を、利用するプログラムはPHP5.6を一応の前提としておく。
例えば「会社」「部」「課」「係」「社員」のような、
上下が関連付けられた5つのテーブルがあるとする。
会社は部を、部は課を、課は係を、係は社員を、それぞれ "0個以上" 持つ。
逆に複数の会社に所属する部というような、上位のデータを複数持つことはない。
また、部に直属の社員というような、上位の部署を持たないとうなレコードも存在しない。
それぞれのテーブルは、自分の1つ上位のテーブル(課から部など)のプライマリキーを参照できる。
2つ上のテーブル(課から会社など)や、自分の下(課から社員など)は直接的に参照は出来ない。
さて、ここで質問なのだけれど、
(1)
このような、1つ上位のテーブルだけを参照するという設計は一般的なのか。
(2)
特定の係に所属する社員を一覧表示したいという文脈で、
その係の最上位にある会社の名前も取得したいというとき、どうするのが無難か。
とりあえず社員テーブルを取得する際に、課・部・会社テーブルも外部結合で一緒に引っ張っているが、
クエリを2回に分けて、会社名は会社名で取得したほうがいいのかとか。
0739NAME IS NULL
2016/05/14(土) 16:50:51.30ID:???どういう要件かいまいち分からないんだけど、
最初から係の数だけ社員テーブルを作ってしまった方が良くない?
0740NAME IS NULL
2016/05/14(土) 16:51:52.62ID:???(1)
それが一般的ってことでいい。
もし「社員」に1つ上位の「係」とその上の「課」の両方を持たせた場合、「社員」→「係」→「課」の
推移的従属が存在するから第3正規形ではない。
(2)
パフォーマンス的に問題なければそのクエリでいい(外部結合はいらんと思うが)。
問題になるようであれば、クエリの実行に比べて組織変更の頻度が非常に小さいことを前提に
(1)を崩してJOINのコストを削減したりする。
0741NAME IS NULL
2016/05/14(土) 18:08:13.18ID:???知らんがな
>>716 に聞けよ
0742NAME IS NULL
2016/05/14(土) 21:28:53.84ID:???・キャラクタテーブル
char_id
user_id
name
str
stm
int
,,,その他ステータス
・パーティーテーブル
id
user_id
char_a
char_b
char_c
上記構造の場合に、user_idからパーティーに紐づくキャラクタを一発で抽出する方法ってありますでしょうか…
SELECT * FROM キャラクタテーブル WHERE char_id IN (SELECT char_a, char_b, char_c FROM パーティーテーブル WHERE user_id =?);
みたいな事がやりたいです。
素直にテーブル構造変えるべきでしょうか(ヽ´ω`)
0743NAME IS NULL
2016/05/14(土) 21:36:50.74ID:???0744NAME IS NULL
2016/05/14(土) 21:46:18.44ID:???キャラクタテーブルのuser_idで検索するだけじゃないのか?
そのselectから想像するなら
INのサブクエリをchar_a,b,cのunionにすれば行けんじゃね
char_a,b,cでそれぞれjoinしても行けるかもしれんな
まあテーブル構造見直すほうがよさそうだけど、設計はスレ違いだし
0745NAME IS NULL
2016/05/14(土) 21:48:57.11ID:???SELECT * FROM t_char c
INNER JOIN (
SELECT char_a_id, char_b_id, char_c_id
FROM t_party
WHERE user_id =?
)p ON (
c.id = p.char_a_id
OR c.id = p.char_b_id
OR c.id = p.char_c_id
)
WHERE c.user_id =?;
0746NAME IS NULL
2016/05/14(土) 21:51:32.36ID:???すみません、そうですよね…
・パーティーテーブル
id ←シーケンシャル
user_id
char_a ←
char_b ←
char_c ←それぞれがchar_id
でした。
ご指摘の通りjoinで出来ました。
失礼しました。
扱う要素が多くてリレーションかなり複雑になってるので、
できれば再設計はしたくなかったのでこれで行こうと思います…
お騒がせしましたー
0747738
2016/05/15(日) 11:53:53.97ID:???アドバイスありがとう。
>>739
本データとは別に検索用テーブルを作るってことじゃなく
最初から係別に格納するってことか。
なるほどそういう考え方もあるのか…
>>740
外部結合は要らないってことは、内部結合ってこと?
ちょっと今日は休日なので試せないんだけど、
係に所属する社員が0のときに会社名引っ張ってこれなさそうと思ってしまった。
……が、それは多分レアケースなんだから、
そのとき改めてクエリ発酵すりゃいいのか・
0748NAME IS NULL
2016/05/15(日) 13:32:10.78ID:???0749NAME IS NULL
2016/05/15(日) 14:26:25.55ID:???テーブル設計してみた。
アドバイスやら、共同で出来る人求む。
ttp://59ch.net にすべての定義分載せた
0750NAME IS NULL
2016/05/16(月) 00:01:17.01ID:ZvSt0PFw顧客の要望でSQL知っている人で、JOINが使えんらしい。
意味わからんがピリオド使う系を使わずに結合させる方法があればいいんだよなぁ
0751NAME IS NULL
2016/05/16(月) 00:12:29.99ID:???単純に一つのテーブルからデータ出すのだけは出来るって事?
0752NAME IS NULL
2016/05/16(月) 00:13:05.89ID:???使えるようになれって言う
0753NAME IS NULL
2016/05/16(月) 00:32:25.34ID:???下手に抜け道を探そうとしない方がいいよ。
0754NAME IS NULL
2016/05/16(月) 02:18:02.82ID:???ビューを作ってそこだけ触らせる
0755NAME IS NULL
2016/05/16(月) 09:31:26.93ID:???FROMにテーブル書いてWHEREで結合条件書けば解決とかいうオチじゃないか
0756712
2016/05/16(月) 10:46:24.07ID:???重ねて言いますが、これは私が回答を知っていて書いたものでは無く、
>>702
> まあ普通、シンプルなSQLで済まないようなシステムならデータモデルがおかしいんだよ。
に反論するためのお題です。
要するに、要求がシンプルでない場合は、シンプルなSQLではすまない、ということの例です。
>>712は、ある部屋への入退出記録だとすると、知りたいのは、「複数人在室している期間」です。
言い換えれば、「一人しかいない期間、ではない期間」です。
SQLでそこそこ頑張れば取得できると思ったんですが、少なくとも私には無理そうです。
ただ、回答があるかどうかもわからないため、この問題に時間を使うのはお勧めしません。
0757712
2016/05/16(月) 10:58:12.75ID:???> DBMSの処理が最適とは限らない。
逆にDB側で処理させるのが最適の場合もありますね。
多少複雑なクエリを書けば一つのクエリで終わるのに、クエリを何段階にも分け、クライアントコードの
データ構造をいじくり回し、ループして何回もクエリを発行する、というようなコードになるかもしれません。
今回の議論の問題は、「複雑な」とか「多少複雑な」の基準が個々人で異なるため、なかなか議論が
かみ合わない所にあると感じています。
0758NAME IS NULL
2016/05/16(月) 11:48:53.50ID:???> 特定の係に所属する社員を一覧表示したいという文脈で、
なら、
> クエリを2回に分けて、会社名は会社名で取得したほうがいいのかとか。
こっちがいいんじゃないの?
係→課→部→会社ってjoinするの無駄なんだけど
0759NAME IS NULL
2016/05/16(月) 13:05:21.98ID:???0760NAME IS NULL
2016/05/16(月) 13:15:34.63ID:???なにが無駄なんだ?
joinすれば1回のクエリ発行ですむのに、わざわざ2回クエリ発行するのは無駄じゃないのか?
つかjoinなしで係から会社まで3層あるならクエリ4回必要だが
>>759
順次上のグループをたどって最上位まで表示したいって事だろ
それは別におかしな話でもないけど
会社組織に例えてるから、会社が一つしかないだろって先入観もちすぎじゃね
0761NAME IS NULL
2016/05/16(月) 13:50:26.83ID:???> なにが無駄なんだ?
社員数分、同じ処理で会社名を取得するのが無駄
> つかjoinなしで係から会社まで3層あるならクエリ4回必要だが
会社名を取得するときにjoinしないとは言ってない
社員一覧を取得する時に、毎レコード4階層分処理するのが無駄と言ってるだけ
> 会社組織に例えてるから、会社が一つしかないだろって先入観もちすぎじゃね
特定の係に所属していれば、会社は一つ
0762NAME IS NULL
2016/05/16(月) 13:57:10.45ID:???だとしたら、全部joinしてもいいかもな
0763NAME IS NULL
2016/05/16(月) 14:41:28.40ID:???1:nのリレーションで、1側のテーブルを必ずn回読み込む処理が実行されるとか思ってるんだろうか
さすがにそんなアホなオプティマイザしかないDBMSは少ないと思うが
今回の例でクエリ分ける事にメリットがあるとしたら
回線が細いときに伝送量を減らせるぐらいしか思いつかないが
今時の回線事情考えるとそこまで気にする事はないだろうし
0764NAME IS NULL
2016/05/16(月) 14:48:43.22ID:???> 1:nのリレーションで、1側のテーブルを必ずn回読み込む処理が実行されるとか思ってるんだろうか
> さすがにそんなアホなオプティマイザしかないDBMSは少ないと思うが
ちょっと何を言っているのかわかないが、今回のケースでは、最終結果が社員100人だとしたら、
係・課・部・会社テーブルのlook upは合計400回必要で、そのうちのいくつかはnested loopになるかもしれん
さらには、lookupの結果で会社テーブルを再度取得する必要がある
「特定の係」というのが一つの係の場合は、そのnested loopを含む400回の処理結果は、
一つの会社名にすぎない
0765NAME IS NULL
2016/05/16(月) 15:10:16.26ID:???その結果が一つになるのがわかってるのなら、400回のindex scanは不要とも言える
0766NAME IS NULL
2016/05/16(月) 15:19:29.64ID:???そうか、そうだね、ループは発生しないね
0767NAME IS NULL
2016/05/16(月) 15:28:06.07ID:???0768NAME IS NULL
2016/05/16(月) 15:34:55.04ID:???速度が重視される場合には、JOIN的なことをクライアント側でやる
0769NAME IS NULL
2016/05/16(月) 15:43:48.98ID:???0770NAME IS NULL
2016/05/16(月) 15:45:03.11ID:???1000件のデータ取得&1個のマスター取得なら1000回のindex scanが発生するんだし
だが、いろんなところで
join 係 using (係id)
join 課 using (課id)
join 部 using (部id)
join 会社 using (会社id)
が氾濫するなら、正規化崩しを考えた方がいいかもね
0771NAME IS NULL
2016/05/16(月) 15:48:13.13ID:???0772NAME IS NULL
2016/05/16(月) 16:04:36.01ID:???0773NAME IS NULL
2016/05/16(月) 16:12:04.19ID:???0774NAME IS NULL
2016/05/16(月) 16:28:30.11ID:???> どう崩すつもりかわからないけど
係が決まれば一意に会社が決まって、社員を検索するときによく会社も絡めて検索する
場合が多いなら、社員テーブルに会社idを入れるとか
0775NAME IS NULL
2016/05/16(月) 16:29:34.33ID:???0776NAME IS NULL
2016/05/16(月) 17:16:50.35ID:???0777NAME IS NULL
2016/05/16(月) 18:15:36.42ID:???0778NAME IS NULL
2016/05/16(月) 18:32:09.44ID:???0779NAME IS NULL
2016/05/16(月) 20:33:02.74ID:ZoNDbMXd0780NAME IS NULL
2016/05/17(火) 11:27:04.88ID:???>>740
> もし「社員」に1つ上位の「係」とその上の「課」の両方を持たせた場合、「社員」→「係」→「課」の
> 推移的従属が存在するから第3正規形ではない。
これって本当に推移的関数従属?
社員が複数の部や課に属さないという前提の場合、社員が決まれば課は一意に決まる。
部も会社も同様。つまり、係からたどる必要はないと言う意味で、推移的ではない気がする。
0781NAME IS NULL
2016/05/17(火) 17:28:44.51ID:???係と課と両方あれば情報が重複するのはあきらかなんだから
用語の定義についてどうこう言いたいなら然るべきスレでやってくれ
0782NAME IS NULL
2016/05/17(火) 17:59:26.57ID:???「社員」→「係」→「課」というのが本当に推移的従属なのかが知りたいだけだから。
0783NAME IS NULL
2016/05/17(火) 18:09:35.59ID:???そうだからもう来るな
0784NAME IS NULL
2016/05/17(火) 18:45:55.10ID:???>>738が元凶
0785NAME IS NULL
2016/05/18(水) 11:58:44.85ID:???Aにユニークを付け忘れちゃったのでこっそり修正したいです
Aが重複していたら、Bが1番大きいのを残してあとは削除
というクエリーを作りたいんだけど、
1番大きいのを残してあとは削除 のところがうまく書けない
0786NAME IS NULL
2016/05/18(水) 13:38:02.75ID:???0787NAME IS NULL
2016/05/18(水) 14:09:52.42ID:???Bも同じだったらどれか適当に
0788NAME IS NULL
2016/05/18(水) 14:12:36.22ID:???0789NAME IS NULL
2016/05/18(水) 14:47:10.48ID:???0790NAME IS NULL
2016/05/18(水) 14:48:30.17ID:???0791NAME IS NULL
2016/05/18(水) 18:10:43.59ID:???0792NAME IS NULL
2016/05/18(水) 18:14:08.06ID:???どちらかだけ消すとか無理じゃね
A,max(B)を別テーブルにinsertして、元テーブル全て消して作り直しじゃね
0793NAME IS NULL
2016/05/18(水) 19:21:00.95ID:???これができるのはOracleだけだったような
0794NAME IS NULL
2016/05/18(水) 20:27:09.80ID:???Postgresql でもできるっぽい
http://blog.fusic.co.jp/archives/1765/
0795NAME IS NULL
2016/05/18(水) 20:39:13.18ID:???当時自分がメインで使ってたsqlserverだとそれが使えなくてモヤモヤモヤモヤした結果、
もういいやとexists使うクセがついた。
0796NAME IS NULL
2016/05/19(木) 11:10:15.16ID:???limit 1 でdeleteすればどっちらか消すのはできますい
0797NAME IS NULL
2016/05/19(木) 11:29:50.07ID:???とりあえずNVARCHAR(MAX)にしておけばいいのか?
0798NAME IS NULL
2016/05/19(木) 18:14:20.65ID:???deleteにlimitとかtopとか使えたっけ?
できるなら、1行指定でループまわすとかすれば可能かもしれんな
0799NAME IS NULL
2016/05/20(金) 01:21:34.54ID:???不確定でも最大値くらいは確定させよう
0800NAME IS NULL
2016/05/20(金) 08:02:56.36ID:???MySQL もできた気がする。
0801NAME IS NULL
2016/05/20(金) 09:28:04.13ID:???分からない場合もあるだろ。
0802NAME IS NULL
2016/05/20(金) 11:42:27.56ID:???全くサイズ制限なくデータの入る型をもつDBMS実装は見た事ない
事実上無制限とか言うのは見たことあるけどな
まあ普通は上限決めとくもんだ
とりあえずって言うなら、そのDBMSで使える一番サイズの広い型使えばいいんじゃね
まあnvarchar(max)かclobだと思うけど、その場合でもサイズ制限が無いわけではないし
0803NAME IS NULL
2016/05/20(金) 15:32:10.94ID:???> 全くサイズ制限なくデータの入る型をもつDBMS実装は見た事ない
つ text型@PostgreSQL
> まあ普通は上限決めとくもんだ
PostgreSQLでは文字列はtextがデファクトだがな
0804NAME IS NULL
2016/05/20(金) 17:45:49.12ID:???0805NAME IS NULL
2016/05/20(金) 17:48:52.13ID:???0806NAME IS NULL
2016/05/20(金) 17:56:00.22ID:???> つ text型@PostgreSQL
でもこのやり取りには首を傾げざるを得ないな。
9.5で無制限になったのかと思ったけどそうでもないようだし。
0807NAME IS NULL
2016/05/20(金) 18:08:08.06ID:???0808NAME IS NULL
2016/05/20(金) 18:08:56.33ID:???0809NAME IS NULL
2016/05/20(金) 18:18:43.50ID:???ただ、大抵はtextの説明は「制限なし可変長」だけどな
0810NAME IS NULL
2016/05/20(金) 18:20:43.42ID:???0811NAME IS NULL
2016/05/20(金) 19:09:25.11ID:???0812NAME IS NULL
2016/05/20(金) 20:24:28.41ID:???なら自分で決めて仕様書に書いとけばいい
上限決めてないと限界値テストもされないからいざその手のデータが来た時に他の場所で死んじゃうとかのバグはかなり多い
0813NAME IS NULL
2016/05/21(土) 01:16:18.96ID:cPaShX53長さ制限って何のことを言っているのか?
でかいデータ型なら言うまでもなく分かるだろ?
0814NAME IS NULL
2016/05/21(土) 02:49:38.86ID:???DBMSの実装によるので何とも言えんわ
特定のDBMSの話なら、該当するスレで聞け
0815NAME IS NULL
2016/05/21(土) 11:08:19.71ID:sqyLzqrf「あなたのような従業員は会社のパフォーマンスにとってマイナスなので早く死んでください」
などと自殺教唆を公然と行った!! その結果人が死んだ!!
丁寧に言えば何を言ってもいいというものではない!!これはヤクザや借金取りが脅迫をする時に
「いついつまでに金一億円をお振り込みください。命が惜しければ間違った判断をなされないことを期待します」
と発言するのと同じレベルだ!!
しかもそれを注意してやったら、「世間はわれわれの味方だ。文句があるなら訴えてきたらよろしい。メールを電番を公開したければ
どうぞご自由に。世論はわれわれを賛辞するするメールを送付するだろう」
などとイカ様気取りも大概にしろという発言を行った!!
抗議先 日本マイクロソフト人事本部 西川昌邦
メール:masaikaw●microsoft.com
(●を@に置き換えて)
電話:09025411718
0816NAME IS NULL
2016/05/22(日) 00:33:04.73ID:???SQLの場合、そうはいかない場合が多いじゃん?
どういう基準で妥協してる?
0817NAME IS NULL
2016/05/22(日) 00:39:50.32ID:???そういうのはDB設計を語るスレでやってくれ
0818NAME IS NULL
2016/05/22(日) 02:50:03.65ID:???ありがとう
0819NAME IS NULL
2016/05/22(日) 05:38:09.72ID:???0820NAME IS NULL
2016/05/22(日) 10:17:37.83ID:???気持ちは分かる
0821NAME IS NULL
2016/05/23(月) 17:20:45.84ID:???> 上限決めてないと限界値テストもされないから
いやするでしょ。
しないのは、お前が悪い。
0822NAME IS NULL
2016/05/23(月) 19:32:24.41ID:???上限わからんのにどうやってテストするつもりなんだよ w
0823NAME IS NULL
2016/05/23(月) 19:54:33.53ID:???システム上の制約があるんだからそこの境界チェックをしなさいよという話では。
0824NAME IS NULL
2016/05/23(月) 19:58:57.82ID:???0825NAME IS NULL
2016/05/23(月) 20:26:44.87ID:???0826NAME IS NULL
2016/05/23(月) 20:29:48.29ID:???0827NAME IS NULL
2016/05/23(月) 21:11:12.29ID:???今時のDBMSだと実データをファイルに保存したりする機能があったりして
その場合たとえばNTFSのファイル上限の16T弱まで入ることになるはずだが
もしアプリ上で上限きめてなければ、そんなのもちゃんとチェックするのかね
0828NAME IS NULL
2016/05/24(火) 00:11:41.97ID:???まあ、そんなに1レコードにぶち込んでどうすんのよという気はする。「普通の使い方するなら気にするな」って事でしょ。
>>827
Windows Server 2012、Win8以降は実装上256TiB。
0829NAME IS NULL
2016/05/24(火) 10:15:29.42ID:???> 上限わからんのにどうやってテストするつもりなんだよ w
お前が作るアプリは、あらゆる場所で何も制限がないのか?
保存先に制限がなくても、他の場所にはあるはずだが。
0830NAME IS NULL
2016/05/24(火) 12:14:41.25ID:???何もわからないままテストケースなんて作れないから
0831NAME IS NULL
2016/05/24(火) 13:17:09.79ID:???0832NAME IS NULL
2016/05/24(火) 14:10:52.99ID:???長さを予め指定するって面倒だよな、サロゲートペアもあるし
0833NAME IS NULL
2016/05/24(火) 15:42:38.67ID:???RDBMSの仕様としてサイズが決められているなら、その上限まで正しく保存できるか
どうかというのはRDBMSのテストに他ならない。
0834NAME IS NULL
2016/05/24(火) 18:13:14.00ID:???……ごめん、多分仕事はうらやましいとは思えない
0835NAME IS NULL
2016/05/24(火) 18:40:04.24ID:???「16あれば十分かな」
「いや16だと危険かも。32にしとこう」
「俺、日本で一番名前が長い人調べるわ」
「まてまて、ユーザが日本人だけだっていつ決まった」
「nvarchar(max)にしとこうぜ」
0836NAME IS NULL
2016/05/24(火) 20:36:32.96ID:???テストすべきって言ってる人ひとりじゃないの?
0837NAME IS NULL
2016/05/24(火) 21:57:38.70ID:???さすがに会社のプロジェクトでnvarchar(max)使ってるのは見た事ない
0838NAME IS NULL
2016/05/24(火) 22:30:30.06ID:???>>801 から読み直せ
0839NAME IS NULL
2016/05/24(火) 23:32:11.62ID:???普通はアプリ側で入力制限があるから実際にDBMSのテストするようなことはないけど
0840NAME IS NULL
2016/05/25(水) 10:18:41.56ID:???視野が狭いね
0841NAME IS NULL
2016/05/25(水) 11:38:26.64ID:???0842NAME IS NULL
2016/05/25(水) 12:50:43.86ID:???まあまともなソフトならどこかで上限を設定してるわな
残念ながら >>801 はそう言うことが理解できてないみたいだが
0843NAME IS NULL
2016/05/25(水) 12:56:54.42ID:hsVpZiWLユーザーに意味のない制約を課さない
0844NAME IS NULL
2016/05/25(水) 13:15:14.84ID:???0845NAME IS NULL
2016/05/25(水) 13:17:56.53ID:???ふさわしいスレに移動して続けるか
どちらかにして
0846NAME IS NULL
2016/05/25(水) 13:25:10.77ID:???もうここはこういうスレだということを受け止めた方がいい
0847NAME IS NULL
2016/05/25(水) 13:28:21.49ID:???0848NAME IS NULL
2016/05/25(水) 13:44:54.21ID:???> Mediumで独自ドメインを使ったサイトの記事が、正常にブックマークできない問題を改善しました
> はてなブックマークはデータベースの構造上、ブックマークできるURLの最大文字数が
> 255文字に設定されています。
少なすぎでしょ。
0849NAME IS NULL
2016/05/25(水) 13:46:48.54ID:???0850NAME IS NULL
2016/05/25(水) 13:53:06.91ID:???0851NAME IS NULL
2016/05/25(水) 18:46:13.85ID:???それは上限を決める事に問題があったわけではなく
決めた上限の数値に問題があっただけだが
0852NAME IS NULL
2016/05/25(水) 19:17:47.66ID:???それ以前に仕様通りに動くこと
できてない奴がいっぱいいるけど...
0853NAME IS NULL
2016/05/25(水) 19:21:06.54ID:???おバカさんwww
0854NAME IS NULL
2016/05/25(水) 21:04:23.55ID:???http://echo.2ch.net/test/read.cgi/db/1056957157/
ここが雑談スレとして使われています。
まもなく埋まりそうです。
もしもここに次が立つ様ならここに移りましょうか?
0855NAME IS NULL
2016/05/26(木) 10:51:31.21ID:???> それは上限を決める事に問題があったわけではなく
> 決めた上限の数値に問題があっただけだが
いや、その通りのことを書いてるんだけど
0856NAME IS NULL
2016/05/26(木) 12:12:37.05ID:???最後の行を見ると>>855の言うとおりだと思うし
どっちにも取れる
0857NAME IS NULL
2016/05/26(木) 12:30:21.47ID:LpVjiQ57元々存在しない上限を決める→正しい馬鹿w
0858NAME IS NULL
2016/05/26(木) 12:46:53.55ID:???つまりよくない文章ってことだな
0859NAME IS NULL
2016/05/26(木) 12:50:47.73ID:???0860NAME IS NULL
2016/05/26(木) 13:00:09.20ID:???URL エンコードもあるから日本語が含まれると結構簡単に越えちゃう...
0861NAME IS NULL
2016/05/26(木) 13:23:13.06ID:???0862NAME IS NULL
2016/05/26(木) 14:13:35.10ID:???0863NAME IS NULL
2016/05/26(木) 14:31:16.54ID:???SQL初心者質問スレ [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/db/1462998547/
0864NAME IS NULL
2016/05/26(木) 15:30:05.12ID:???ワッチョイつけてNGするぐらいしかないかと。
0865NAME IS NULL
2016/05/26(木) 15:52:32.61ID:???0866NAME IS NULL
2016/05/26(木) 16:11:35.94ID:???0867NAME IS NULL
2016/05/27(金) 09:02:22.51ID:???実際の現場ではdbを変えるなんて滅多にないと思うので、sqlの互換性の無さははあまり問題にならないの?
それともsqlコンバーターみたいなのがあるの?
0868NAME IS NULL
2016/05/27(金) 09:18:42.46ID:???0869NAME IS NULL
2016/05/27(金) 12:14:48.49ID:???http://1000nichi.blog73.fc2.com/blog-entry-7696.html
税金の無駄遣い?STAP細胞関連経費1億4500万円 小保方晴子氏の検証実験参加は不要だったで書いた理研の税金の無駄使い。
実は小保方晴子さんらのSTAP細胞関連だけでなく、別の問題にも触れられていました。扱いが小さかったんですけど、こちらもすごく問題だと思います。
(中略)
●本来なら大問題である税金の無駄遣い
この高級家具の件は、小保方晴子さんが買ったのでは?と、STAP細胞疑惑のときにいっしょに話題になったものです。しかし、すぐに東大教授になった別の方のところで購入したものだと、断定されていました。
違っていたら困りますし、名前を出しちゃうとあれかな?と思うので書きませんが、「カッシーナ・イクスシー 東大教授」あたりで検索すると簡単に出ます。もうあだ名が「カッシーナ」という感じになっていました。
「計288個の穴があること」など、実質的に特定のブランド以外を排除した購入など認められるはずがないものであり、本来なら非常に問題です。これは小保方さん問題以上に返金を求めやすくないですかね?
マスコミはこっちの問題ももっと追求すべきだと思います。
0870NAME IS NULL
2016/05/27(金) 12:45:19.84ID:???> mysqlとsqlserverとpostgreを少しだけ使って見たのだが、簡単なsql文でさえ互換性がない場合が多いよね?
具体的には?
0871NAME IS NULL
2016/05/27(金) 12:53:34.92ID:???sqlsaverにodbcでリンクサーバ貼って
全てsqlsaverでやればいい
0872NAME IS NULL
2016/05/27(金) 13:15:39.49ID:???ggrks
0873NAME IS NULL
2016/05/27(金) 16:35:02.84ID:???簡単なsql文って辺りは人によって受け止めが違うんだろうな
0874NAME IS NULL
2016/05/27(金) 16:35:40.51ID:???0875NAME IS NULL
2016/05/27(金) 16:36:54.85ID:???0876NAME IS NULL
2016/05/27(金) 17:52:54.44ID:???まあそう言うこと
なので ggrks とか言ってる奴は単なるバカ w
>>874
確かによく使いそうなものの中だとやはり merge とか upsert 辺りかな
簡単かどうかは人によるだろうけど
0877NAME IS NULL
2016/05/27(金) 18:20:13.18ID:???どんだけIQ低いんだよ
0878NAME IS NULL
2016/05/27(金) 18:28:44.18ID:???> 簡単かどうかは人によるだろうけど
>>875も人によるのか?
0879NAME IS NULL
2016/05/27(金) 18:53:22.57ID:???まずは標準を知るといい。
そうすれば、準拠していないから使えないとか、
これは便利だけど独自拡張だからほかのRDBMSでは使えない可能性があるとか
そういうのが頭に入りやすくなる
0880NAME IS NULL
2016/05/27(金) 20:14:20.77ID:khxvP1pq0881NAME IS NULL
2016/05/27(金) 21:00:04.44ID:???0882NAME IS NULL
2016/05/29(日) 02:23:06.74ID:6A+VeXJZ日本マイクロソフト人事本部シニアマネージャー(名ばかり管理職)の西川昌邦(さいかわまさくに)は犯罪者にして殺人犯だ!!
「あなたのような従業員は会社のパフォーマンスにとってマイナスなので早く死んでください」
などと自殺教唆を公然と行った!! その結果人が死んだ!!
丁寧に言えば何を言ってもいいというものではない!!これはヤクザや借金取りが脅迫をする時に
「いついつまでに金一億円をお振り込みください。命が惜しければ間違った判断をなされないことを期待します」
と発言するのと同じレベルだ!!
しかもそれを注意してやったら、「世間はわれわれの味方だ。文句があるなら訴えてきたらよろしい。メールを電番を公開したければ
どうぞご自由に。世論はわれわれを賛辞するするメールを送付するだろう」
などとイカ様気取りも大概にしろという発言を行った!!
抗議先 日本マイクロソフト人事本部 西川昌邦
メール:masaikaw●microsoft.com
(●を@に置き換えて)
電話:09025411718
0883NAME IS NULL
2016/05/29(日) 14:23:38.60ID:???0884NAME IS NULL
2016/05/29(日) 14:27:55.58ID:???0885NAME IS NULL
2016/05/29(日) 14:39:44.41ID:???0886NAME IS NULL
2016/05/29(日) 15:12:10.23ID:???参考にした web に載ってた SQL が独自仕様使いまくりとかあるんじゃね?
0887NAME IS NULL
2016/05/29(日) 17:40:45.77ID:eJLnBAYe0888NAME IS NULL
2016/05/29(日) 23:03:29.27ID:0sEDlbelハイハイボール もう一杯!
ハイハイボール もう一杯ね
ハイハイボール 女の店員さんにつくって欲しいね
ハイハイボール 女店員ね?店員一人でね
ハイハイボール 種類はないの?店員さん?
ハイハイボール 店員一人で1種類
ハイハイボール 店員一人じゃん
ハイハイボール 女店員、入れろよ店長
0889NAME IS NULL
2016/05/30(月) 02:14:14.22ID:bu03jhsY日本マイクロソフト人事本部シニアマネージャー(名ばかり管理職)の西川昌邦(さいかわまさくに)は犯罪者にして殺人犯だ!!
「あなたのような従業員は会社のパフォーマンスにとってマイナスなので早く死んでください」
などと自殺教唆を公然と行った!! その結果人が死んだ!!
丁寧に言えば何を言ってもいいというものではない!!これはヤクザや借金取りが脅迫をする時に
「いついつまでに金一億円をお振り込みください。命が惜しければ間違った判断をなされないことを期待します」
と発言するのと同じレベルだ!!
しかもそれを注意してやったら、「世間はわれわれの味方だ。文句があるなら訴えてきたらよろしい。メールを電番を公開したければ
どうぞご自由に。世論はわれわれを賛辞するするメールを送付するだろう」
などとイカ様気取りも大概にしろという発言を行った!!
抗議先 日本マイクロソフト人事本部 西川昌邦
メール:masaikaw●microsoft.com
(●を@に置き換えて)
電話:09025411718
0890NAME IS NULL
2016/05/30(月) 02:16:17.26ID:???初心者が気づかずに使いそうといえばそれだろうなぁと思う
0891NAME IS NULL
2016/05/30(月) 10:20:15.06ID:???ただFIRSTとかTOPとかだけはさっさと共通化して欲しいといつも思ってる
0892NAME IS NULL
2016/06/12(日) 01:51:54.83ID:hCY7ctRMUPDATEについて質問させてください。
まず他のカラムとともに「更新者」カラムがあるテーブルを用意します。
id ワード … 更新者
1 りんご … 遠藤
2 ゴリラ … 田中
3 ラッパ … 松本
:
このときidはプライマリキーとします。
また例に挙げた箇所以外にも、多くのカラムやレコードがあります。
さて、このテーブルにUPDATEをかけます。
各レコードについて、「更新者」以外のカラムいずれかの内容に変更があった場合、
「更新者」の内容も変更したいと考えています。
ID:2、ワード:ゴリラ、更新者:浜田 …なら、
「ワード」の内容に変化がないので、「更新者」はそのまま(田中)。
ID:3、ワード:パンダ、更新者:浜田 …なら、
「ワード」の内容が変化しているので、「更新者」の名前も変更する。(松本→浜田)
最近のMySQLには、テーブル作成時に ON UPDATE CURRENT_TIMESTAMP というのを
決められるらしいですが、その挙動に少し似ているかもしれません。
このようなとき、どういうクエリを書くのがスマートでしょうか。
ぱっと思いつくのはWHERE句で条件を羅列することですが、指定するカラムが増えると長くなる一方です。
また可能ならば複数行を一度に更新できたらなと考えています。
0893NAME IS NULL
2016/06/12(日) 02:46:45.62ID:YEbpLz0V日本マイクロソフト人事本部シニアマネージャー(名ばかり管理職)の西川昌邦(さいかわまさくに)は犯罪者にして殺人犯だ!!
「あなたのような従業員は会社のパフォーマンスにとってマイナスなので早く死んでください」
などと自殺教唆を公然と行った!! その結果人が死んだ!!
丁寧に言えば何を言ってもいいというものではない!!これはヤクザや借金取りが脅迫をする時に
「いついつまでに金一億円をお振り込みください。命が惜しければ間違った判断をなされないことを期待します」
と発言するのと同じレベルだ!!
しかもそれを注意してやったら、「世間はわれわれの味方だ。文句があるなら訴えてきたらよろしい。メールを電番を公開したければ
どうぞご自由に。世論はわれわれを賛辞するするメールを送付するだろう」
などとイカ様気取りも大概にしろという発言を行った!!
抗議先 日本マイクロソフト人事本部 西川昌邦
メール:masaikaw●microsoft.com
(●を@に置き換えて)
電話:09025411718
0894NAME IS NULL
2016/06/12(日) 03:39:10.14ID:cStvfFcbなんかの宿題か?
0895NAME IS NULL
2016/06/12(日) 10:17:44.84ID:???0896NAME IS NULL
2016/06/12(日) 10:50:23.92ID:???CASE 使えば
0897NAME IS NULL
2016/06/12(日) 12:56:35.87ID:???要件がよくわからんぞ。UPDATEの際は「更新者」が必ず渡される前提なのか?
そうだとして、ID:3、ワード:パンダ、更新者:松本 の場合はどうする?
もしそういうケースが存在しないか、あるいは(松本→松本)の更新でいいのなら
ただのUPDATEでいいんじゃね?
0898NAME IS NULL
2016/06/12(日) 13:01:01.61ID:???トリガを仕込むのが楽だろうな。
0899NAME IS NULL
2016/06/12(日) 13:12:42.34ID:???すみません、どういう意味でしょうか?
MySQLを最新版に更新すれば解決するということでしょうか?
>>896
それは複数行の一括更新のときの話でしょうか?
>>897
はい、常に更新者の名前が渡される前提です。
(3, パンダ, 松本) の場合は、レコードは更新されますが当然更新者は松本のままです。
ですがただ単にidを指定しただけのUPDATEですと、
(3, ラッパ, 浜田) の場合、「単語」に変更がないのにも関わらず、浜田になってしまいます。
0900NAME IS NULL
2016/06/12(日) 13:15:53.23ID:???>>898
ありがとうございます。
名前は聞いたことあったのですが、使ったことがなくて頭から抜けてました。
こういうときにも使えるとは思ってもいませんでした。
0901NAME IS NULL
2016/06/12(日) 13:23:16.38ID:???>すみません、どういう意味でしょうか?
何らかのクライアントで、
現在のデータを取得した上で更新掛けていると思うんですけど、
その際に、実際に更新されている項目があるかどうか分かると思うんです。
更新者が違っているだけで、それ以外の内容に変化がないなら、
SQLを呼び出す必要がないんじゃないかと言うことです。
0902NAME IS NULL
2016/06/12(日) 13:35:11.49ID:???変更の必要がなければ更新者を更新者で更新すればいいんだよ。
0903NAME IS NULL
2016/06/12(日) 13:41:06.65ID:???ああ、なるほど。確かにそうですね。
情報小出しで申し訳ないですが、今回はウェブ系なので、
更新してるかどうかの判定をクライアントに任せるのは少し不安だったりします。
仕様書をもう一度確認し、そこまで厳密にしなくていいなら
妥当な選択肢だと思うので、検討してみます。
0904NAME IS NULL
2016/06/12(日) 14:37:02.06ID:???0905NAME IS NULL
2016/06/12(日) 14:52:04.73ID:???まあ
毎回更新者カラムも更新するか
トリガ仕込んで項目チェックか
更新ストアド作って呼ぶか
のどれかだな
0906NAME IS NULL
2016/06/13(月) 13:39:38.51ID:???何れかのタイミングで入力値チェックはしているだろう
それをjavascriptでクライアント側で行うなり、
サーバーで一旦受け取り、チェックした上で確認画面表示するなり
していると思うんだ。
要件定義にもよるだろうが、更新者のみのアップデートを受け付けないなら、そこではじけると思うよ。
0907NAME IS NULL
2016/06/13(月) 13:51:57.55ID:???0908NAME IS NULL
2016/06/13(月) 13:53:49.44ID:???問題無いだろ別に長くなっても
0909NAME IS NULL
2016/06/13(月) 15:48:42.23ID:???・クライアントは更新者の変更のみでも「更新」だとしてサーバに送る
・サーバは、更新者の変更のみの場合は「更新ではない」と判定する
という仕様そのものがダメダメ。
0910NAME IS NULL
2016/06/13(月) 16:46:52.81ID:???> 妥当な選択肢だと思うので、検討してみます。
いやいや、全然妥当じゃないぞ
項目の変更がないやつは送ってくるなというようにするのが妥当
0911NAME IS NULL
2016/06/13(月) 16:52:10.28ID:???トリガまで含めれば、トリガがんばれば対応できるけど、トリガの中で比較がんばるしかなくて
スレ違いだけどアプリまで含めれば、モデルが吸収すればいいよ
>>909
更新者を変更しようとしているのではなくて、更新者以外の変更をした場合に、操作者を自動で記録したいという感じじゃないかな。
更新者は俺です!って言わなきゃいけない仕様はおかしいよね。
>>910
クライアント側で送信できないようにするということ?片手落ちなシステムの完全な見本じゃないですか。
0912NAME IS NULL
2016/06/13(月) 17:04:13.20ID:???更新者がすり替わって何が問題なのかということもあるし
やっぱ変更記録つけるほうがいいいんでねえの?
0913NAME IS NULL
2016/06/13(月) 17:49:09.01ID:???> クライアント側で送信できないようにするということ?片手落ちなシステムの完全な見本じゃないですか。
Webアプリの基本がわかってないのかな
「クライアント側で送信できないようにする」じゃなくて、クライアントから更新不要なデータを
「更新するデータとして送信」しているのだとしたら、それをやめろと言ってる
1. 松本が(2, ゴリラ, 田中)をGETする
2. 遠藤が(2, ゴリラ, 田中)をGETする
3. 松本が更新の必要ありと認識し、ゴリラをチンパンジーに変えて送信
4. サーバ側のデータが(2, チンパンジー, 松本)に書き換わる
5. 遠藤は変更の必要はないが、POSTあるいはPUTで(2, ゴリラ, 田中)を送信する
はい、サーバ側ではどうする?
0914NAME IS NULL
2016/06/13(月) 17:50:20.88ID:???> 5'. 遠藤は変更の必要はないが、POSTあるいはPUTで(2, ゴリラ, 遠藤)を送信する
とするなら、それは最悪
0915NAME IS NULL
2016/06/13(月) 18:06:33.40ID:???0916NAME IS NULL
2016/06/13(月) 18:12:54.25ID:???ゴリラと思い込んで作業を続けるわけか・・・
0917NAME IS NULL
2016/06/13(月) 18:13:42.78ID:???全レコード送信しちゃうような糞ライブラリでも使ってんのか
0918NAME IS NULL
2016/06/13(月) 18:15:20.82ID:???> 遠藤はサーバのデータがチンパンジーになったことを知らないまま
> ゴリラと思い込んで作業を続けるわけか・・・
お前それマジで言ってんの?
あたりまえじゃん、そんなこと
お前が作るWebアプリは、何かデータが変更されたら直近にGETしてWebページ表示してるかも
しれないユーザ全員にpush通知でも送るのか?
0919NAME IS NULL
2016/06/13(月) 18:16:27.75ID:???0920NAME IS NULL
2016/06/13(月) 18:18:56.17ID:???私がやってるやつは更新画面に入るとデータの排他ロック(業務ロジック)して更新前後の一貫性を確保してますよ。
そういうのやらない方がふつうなの??
0921NAME IS NULL
2016/06/13(月) 18:21:42.18ID:???楽観ロック、悲観ロックという考え方があるよ。
どちらを採用するかはシステム次第ともいえる。
場合によっては後勝ちでもいい。
0922NAME IS NULL
2016/06/13(月) 18:26:24.64ID:???ど素人は黙っとけ
0923NAME IS NULL
2016/06/13(月) 18:28:51.81ID:???普通はしないけどね
したければすれば?
0924NAME IS NULL
2016/06/13(月) 18:34:46.72ID:???旅費申請や勤怠は悲観ロックだなぁ
0925NAME IS NULL
2016/06/13(月) 18:35:56.95ID:???> 私がやってるやつは更新画面に入るとデータの排他ロック(業務ロジック)して更新前後の一貫性を確保してますよ。
それって、>>913でいうところの1で複数レコード(あるいはテーブル)に対して排他ロックかけるってこと?
まぁ、普通に考えたらめちゃくちゃ使いづらいシステムになるので、やらないと思う。
俺は一度もそういう風な設計にしたことはないよ。(基本、後書きOKということで大丈夫にしている)
0926NAME IS NULL
2016/06/13(月) 18:37:49.79ID:???> 旅費申請や勤怠は悲観ロックだなぁ
これにロックかける必要ある?
0927NAME IS NULL
2016/06/13(月) 18:43:30.35ID:???代理申請機能があるからです。
特に旅費は事前申請があって、それに対して精算するんです。
入力はパンチャーみたいな人がどんどんやるからロックしないとまずい。
0928NAME IS NULL
2016/06/13(月) 20:48:41.72ID:???0929NAME IS NULL
2016/06/13(月) 21:35:38.31ID:???自分の子孫を全て列挙するにはどういうSQL文書けばいいの?
0930NAME IS NULL
2016/06/13(月) 21:52:57.17ID:???あまりいい例ではないが>>8
Oracleなら階層問合せでも可
0931NAME IS NULL
2016/06/13(月) 22:44:42.96ID:???それぞれの処理系に依存した方法ならあるかもしれない
0932NAME IS NULL
2016/06/13(月) 22:50:18.52ID:???会社の部署とか組織図みたいな親子関係はどうやってテーブル持つべき?
0933NAME IS NULL
2016/06/13(月) 23:10:32.02ID:???階層問合せは標準じゃない
0934NAME IS NULL
2016/06/13(月) 23:11:56.30ID:???0935NAME IS NULL
2016/06/13(月) 23:15:30.49ID:???例えば、戸籍簿とそれに基づいて家系図を作るSQLを考えればいいのかな?
0936NAME IS NULL
2016/06/13(月) 23:19:15.44ID:???それでお願いします。
0937NAME IS NULL
2016/06/14(火) 08:27:59.61ID:???会社の部署ならかなりでかい会社でも10階層ぐらいあれば大丈夫だろ
0938NAME IS NULL
2016/06/14(火) 13:16:56.27ID:???処理系が何かを特定した方が良いかもよ
例えば、MySQLでできますか?とか、
PostgreSQLならどうやればいいですか?とか
0939NAME IS NULL
2016/06/14(火) 14:56:00.27ID:???0941NAME IS NULL
2016/06/14(火) 20:26:48.42ID:???> 一般的な汎用性のある書き方が知りたいです。
だから再帰使えよ
0942940
2016/06/14(火) 20:35:41.57ID:???1.再帰なら一般的な書き方で可能
2.処理系固有じゃないと無理
どっちが正しいんです?
0943NAME IS NULL
2016/06/14(火) 20:50:27.50ID:???0945NAME IS NULL
2016/06/14(火) 22:47:47.03ID:???入れ子集合、経路列挙、閉包テーブル
0946NAME IS NULL
2016/06/17(金) 21:07:19.89ID:???入れ子集合ってあんまりイケてないような気がする。
閉包テーブルが俺好みかな
0947NAME IS NULL
2016/06/18(土) 21:39:40.34ID:???0948NAME IS NULL
2016/06/18(土) 22:50:21.67ID:???prepared statement を使え
使い方は言語や DBMS で違うからか該当の言語スレとか DBMS スレで聞いとくれ
0949NAME IS NULL
2016/06/19(日) 02:21:32.22ID:uN6fJaugバイナリーデータとして扱えば?
0950NAME IS NULL
2016/06/19(日) 22:10:22.57ID:OYzzJ3Kf■ 2ch認定 スピリチュアル詐欺一覧
小泉義仁 知井道通
http://karma.2ch.net/test/read.cgi/spiritual/1441832249/
不道徳連発!冨田佳音のキチガイ スピ活動
http://karma.2ch.net/test/read.cgi/spiritual/1464971384/
【詐欺師】 スピ 梶岡あん子 【キチガイ】
http://karma.2ch.net/test/read.cgi/spiritual/1466206702/
【詐欺師】 スピ ミカタカミ 【キチガイ】
http://karma.2ch.net/test/read.cgi/spiritual/1466207813/
詐欺師 岩崎士郎 嘘八百
http://karma.2ch.net/test/read.cgi/spiritual/1451143434/
ユニフォース・センター 金子浩一
http://karma.2ch.net/test/read.cgi/spiritual/1452973952/
.
0951NAME IS NULL
2016/06/24(金) 00:36:40.24ID:z/HEqrO/・MS SQL Server
Aテーブルに100万件
Bテーブルに10万件
の同じフィールド郡のデータが保持されているとして、BテーブルにあるKeyデータを元にAテーブルから削除したいとした場合、
�@
DELETE FROM A INNER JOIN B ON A.KEY = B.KEY
�A
DELETE FROM A WHERE EXISTS (SELECT * FROM B WHERE A.KEY = B.KEY)
などありますが、どちらもだいぶ時間が掛かってしまいます。
より、時短する良い方法はありますでしょうか?
0952NAME IS NULL
2016/06/24(金) 03:20:30.65ID:???SQL Serverでは1のSQLは通らんと思うけど
SQLの書き方的にはJOINかEXISTSかINかぐらいだけど
この程度の単純なSQLならどう書いても同じ実行計画な気がする
SQLの書き方で速度アップは無理じゃね
それ以外の方法だと
どうせ主キーにクラスタ化インデックスあるだろうけど、クラスタ化やめたら速くなるかもしれん
あとは復旧モデルを単純にするとか
まあ、詳しくはSQL Serverのスレ行け
0953NAME IS NULL
2016/06/24(金) 09:03:28.76ID:U7Zq2XvUだいぶ時間がかかるって具体的に何分?
0954NAME IS NULL
2016/06/24(金) 20:27:29.59ID:???流石に一瞬では終わらないんじゃないの?
0955NAME IS NULL
2016/06/24(金) 20:57:02.46ID:tN3/YgIb0956NAME IS NULL
2016/06/24(金) 21:00:57.11ID:???0957NAME IS NULL
2016/06/24(金) 21:14:56.93ID:???0958NAME IS NULL
2016/06/24(金) 22:06:29.12ID:???フラグ立てて、後でこっそり削除するというのだと
速くならないかなって思ったw
0959NAME IS NULL
2016/06/24(金) 22:07:54.72ID:???0960NAME IS NULL
2016/06/25(土) 02:56:29.55ID:???0961NAME IS NULL
2016/07/05(火) 00:04:05.04ID:???それぞれで検索抽出して1件のデータが抽出されたとします。
これらのテーブルを合わせて一行の結果として表示したいのですが
共通の結合条件がない場合
Full join onの部分をAのID=AのIDとか全く意味のないものにして
結合条件では結合されないけどFull joinだからA、Bのテーブルがひとつにまとまって表示されますけど
こんなやり方って悪いやり方ですか?
Row idとか無理矢理つくって結合させるべきですか?
0962NAME IS NULL
2016/07/05(火) 00:08:40.32ID:mfNgaxwo完全外部結合
ただし、本当にそのSQLが必要かどうかよく考えてください。
0963NAME IS NULL
2016/07/05(火) 12:29:02.44ID:???full joinが必要なら使えばいいし
条件がないなら無意味な結合条件は指定しない方が良い
どちらも全く問題はない
0964NAME IS NULL
2016/07/05(火) 13:19:54.37ID:mfNgaxwoそういうアドバイスを安易にするな。
なんでもSQLで無理やりやる人間を増やすな。
0965NAME IS NULL
2016/07/05(火) 16:24:28.58ID:???0966NAME IS NULL
2016/07/05(火) 16:30:24.23ID:???FROM A,B
WHERE A.ID=1 AND B.ID=3
0967NAME IS NULL
2016/07/05(火) 16:50:21.62ID:???0968NAME IS NULL
2016/07/05(火) 18:02:17.40ID:???select * from a,b,c
とかやると発狂しちゃう?
0969NAME IS NULL
2016/07/05(火) 18:14:06.95ID:mfNgaxwo0970NAME IS NULL
2016/07/05(火) 18:33:31.61ID:???お前よりましだわw
0971NAME IS NULL
2016/07/05(火) 18:55:00.35ID:???なんでもSQLで無理やりやる人間を増やすという見解が理解できん
0972NAME IS NULL
2016/07/05(火) 19:21:41.72ID:Dz8tw1hH0973NAME IS NULL
2016/07/06(水) 10:58:46.43ID:???0974NAME IS NULL
2016/07/06(水) 20:27:27.54ID:???0975NAME IS NULL
2016/07/06(水) 20:40:28.49ID:WC7QzboQ0976NAME IS NULL
2016/07/06(水) 21:10:38.27ID:???enum Hoge { A,B,C,D};
に対して
isA boolean
isB boolean
isC boolean
isD boolean
っていう列があるんだけどこれマジ?
俺の怒りが有頂天、深い悲しみに包まれたんだけど?
0977NAME IS NULL
2016/07/07(木) 00:24:34.15ID:???0978NAME IS NULL
2016/07/07(木) 00:30:55.06ID:???なつかしいな。
0979NAME IS NULL
2016/07/07(木) 06:48:54.30ID:???全然理解できない...
enum Hoge { A = 1, B = 2, C = 4, D = 8 };
って言うならまだしもだけど
それでも A | B で enum にない値ができるのも違和感あるし
0980NAME IS NULL
2016/07/07(木) 07:04:27.72ID:???それだけじゃ判断できん。4つのカラムが常にセットで更新されるものなら怒り心頭も頷けるが。
0981NAME IS NULL
2016/07/07(木) 18:38:47.92ID:???怒りが最上の喜びにかわる性癖の持ち主なんだから、最高の職場じゃないか。
0982NAME IS NULL
2016/07/07(木) 20:02:35.94ID:???0983NAME IS NULL
2016/07/07(木) 23:14:29.21ID:???ええと、よく分からんんのだけど
それをビット演算用というんじゃないの?
それとも単に、宣言時に数字を指定してないから違う!
ってだけの話?
0984NAME IS NULL
2016/07/08(金) 07:04:38.93ID:???> enum Hoge { A,B,C,D};
って
enum Hoge { A = 1, B = 2, C = 3, D = 4 };
のことなんだけどわかってる?
0985NAME IS NULL
2016/07/08(金) 08:05:36.70ID:???分かるよ
自分の場合は単に、>976が例として出しただけのコードだし
そのへん省略されてる可能性もあると思っただけ
0986NAME IS NULL
2016/07/08(金) 12:45:25.43ID:???0987NAME IS NULL
2016/07/08(金) 13:00:55.24ID:???0988NAME IS NULL
2016/07/08(金) 13:41:05.27ID:K0ZRcz14なおざりだろw
0989NAME IS NULL
2016/07/08(金) 14:14:35.55ID:???ゼロオリジンですよ
0990NAME IS NULL
2016/07/08(金) 14:16:51.00ID:???>「おざなり」は「御座成り」と書くように、当座の間に合わせの意味であり、自分
>で意識的にいいかげんな言動をしてその場を逃れようとすること。一方「なおざり」
>は、注意深くないことであり、自分では意識せずにおろそかな結果になってしまう
>言動にも用いる。だから「忙しくて仕事をなおざりにしてしまっていた」なら許さ
>れる可能性があるが、「仕事をおざなりにした」では、わざとその場逃れの仕事ぶ
>りを発揮していたことになる。
https://kotobank.jp/word/おざなり-897698
だそうです。
元の設計者が後からでも直していれば、なおざりでも良いでしょうけど、
そのままトンズラしちゃったんじゃないでしょうか?
0991NAME IS NULL
2016/07/08(金) 15:35:11.09ID:K0ZRcz14なおざりは放っておくこと。
0992NAME IS NULL
2016/07/08(金) 15:49:27.44ID:???0993NAME IS NULL
2016/07/08(金) 21:07:33.08ID:???主キー項目はCOL1、COL2、COL3です。
1レコード目の主キーは、1、2、3、
2レコード目の主キーは、1、2、4、です。
select a.* from TBL_A a
inner join TBL_A a2
on a.COL1 = a2.COL1
and a.COL2 = a2.COL2
and a.COL3 = a2.COL3
上記SQLの結果が4レコードになるのですが
(1レコード目×2、2レコード目×2) なぜでしょうか?
Oracle12cです。
0994NAME IS NULL
2016/07/08(金) 21:33:31.59ID:K0ZRcz14結果から考えられるのは直積になってないかだな。
0995NAME IS NULL
2016/07/08(金) 21:35:09.88ID:K0ZRcz140996NAME IS NULL
2016/07/08(金) 21:40:50.13ID:???すまんC言語の思想から言ってもゼロオリジンだったな
寝起きでボーッとしてたわ
0997NAME IS NULL
2016/07/08(金) 23:09:54.88ID:???0998NAME IS NULL
2016/07/08(金) 23:17:51.14ID:K0ZRcz14http://s.news.mynavi.jp/news/2016/07/04/261/
0999NAME IS NULL
2016/07/08(金) 23:25:01.19ID:???意味不明すぎ
1000NAME IS NULL
2016/07/08(金) 23:29:50.73ID:???ソース読めよカス
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
life time: 241日 1時間 22分 12秒
10021002
Over 1000Thread運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。