◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

SQL質疑応答スレ 16問目 [転載禁止]©2ch.netYouTube動画>1本 ->画像>2枚


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/db/1447160858/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1 :
NAME IS NULL
2015/11/10(火) 22:07:38.40 ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:
SQL質疑応答スレ 15問目
http://peace.2ch.net/test/read.cgi/db/1402919549/
2 :
NAME IS NULL
2015/11/10(火) 22:09:00.55 ID:???
3 :
NAME IS NULL
2015/11/10(火) 22:10:13.52 ID:???
4 :
NAME IS NULL
2015/11/10(火) 22:11:19.91 ID:???
よくある質問1

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

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

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

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

(答)
select A.ID,
    A.DATE,
    A.DATA
from TableName A
   inner join
   (select ID, max(DATE) as MAX_DATE
    from TableName
    group by ID
   ) B
   on A.ID = B.ID
   and A.DATE = B.MAX_DATE
;
5 :
NAME IS NULL
2015/11/10(火) 22:12:29.80 ID:???
よくある質問2

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

というテーブルから

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

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

(答)
SELECT key,
    SUM(CASE data WHEN 'a' THEN 1 END) AS a,
    SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table
GROUP BY key
ORDER BY key
;
6 :
NAME IS NULL
2015/11/10(火) 22:13:39.32 ID:???
よくある質問3

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

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

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

(答2)
select *
from TableName T1
where not exists (select *
         from (values 'A', 'B', 'C') T2 (HOGE)
         where not exists (select *
                  from TableName T3
                  where T1.ID = T3.ID
                  and T2.HOGE = T3.HOGE
                  )
         )
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意
7 :
NAME IS NULL
2015/11/10(火) 22:14:51.52 ID:???
よくある質問4

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

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

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

Oracleのpivot(11g以降)
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#CHDCEJJE
http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html
8 :
NAME IS NULL
2015/11/10(火) 22:16:01.06 ID:???
よくある質問5

(問)
年月(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ならこれを適当に改変すれば動きますが
 どのみちお奨めしません。
9 :
NAME IS NULL
2015/11/10(火) 22:25:16.15 ID:???
以上、テンプレ終わり
10 :
NAME IS NULL
2015/11/11(水) 00:11:34.95 ID:???
文字列でバージョン情報を格納してるカラムがあるんですけど、
これをうまく並べ替えれないですかね?

3.12.1
3.8.1

こういう二つのバージョンがあった場合、文字列ソートだから後者の方が大きいと判定されてしまうんですよね。
やっぱりバージョンのドット毎に区切った数字をカラムに保存して、ソートするしかないでしょうか?
11 :
NAME IS NULL
2015/11/11(水) 18:51:31.29 ID:???
難しいな、、、
ピリオドの数固定なら
PostgreSQLだと split_part() と lpad() 組み合わせてなんとかなったけど
12 :
NAME IS NULL
2015/11/11(水) 19:18:28.66 ID:???
自分なら邪道だけど、文字列のカラムに加えて、ソート用にバラした整数のカラムを追加するかな...

ver_raw = '1.23.4'
ver_mj = 1
ver_mi = 23
ver_se = 4

てな感じに。これだと "2.11.5_revB" みたいな変なものがきても、格納はできる。
13 :
NAME IS NULL
2015/11/11(水) 20:17:19.69 ID:???
SQL質疑応答スレ 16問目 [転載禁止]©2ch.netYouTube動画>1本 ->画像>2枚
14 :
NAME IS NULL
2015/11/13(金) 17:41:51.54 ID:???
【質問テンプレ】
・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では厳しそうなので相談させてください。

宜しくお願いします。
15 :
NAME IS NULL
2015/11/13(金) 17:50:20.53 ID:???
これってA、B、Cそれぞれ1行しか無いの?
16 :
NAME IS NULL
2015/11/13(金) 17:57:57.53 ID:???
イメージ的にはこんなかんじにしたいです。

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
:
:
17 :
NAME IS NULL
2015/11/13(金) 18:09:42.07 ID:???
よくわからんけどorでくっつけりゃいけるんじゃ
18 :
NAME IS NULL
2015/11/13(金) 19:26:16.88 ID:???
>>14
>>5のsum()のかわりにgroup_concat()を使う
19 :
NAME IS NULL
2015/11/13(金) 23:13:15.96 ID:???
>>14
> col1,col2.col3の内容によって、DATAカラム内の意味が変わってくるテーブルです。

あんさんが書いた内容だと、col1 は 100、col3 は 0 固定なんだが
とりあえず col2 で変わると言うことか?

そもそも >>16 見ると ID でまとめてる様に見えるし
データがないところに NULL じゃなくて 0 を入れればいいのか?
ID と col2 が同じレコードは複数ないのが前提なのか?
20 :
NAME IS NULL
2015/11/14(土) 17:56:40.28 ID:???
【質問テンプレ】
・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の集計値を表示させたい。
階層の深さは一定ではない。
21 :
NAME IS NULL
2015/11/14(土) 21:10:35.03 ID:???
こうかな?

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)
;
22 :
NAME IS NULL
2015/11/15(日) 00:46:14.76 ID:???
>21 ありがとうございます。
今現在環境がないので、月曜日に試してみます。
23 :
NAME IS NULL
2015/12/01(火) 19:58:51.94 ID:???
お願いします

■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
24 :
NAME IS NULL
2015/12/02(水) 00:26:39.36 ID:???
select to_char(created_at,'YYYY-MM-DD') as day,sum(price) from tablename
where created_at between '2015-12-01 00:00:00' and '2015-12-31 23:59:59'
group by day order by day ;

日付はいらないのかな・・
25 :
NAME IS NULL
2015/12/02(水) 01:18:28.41 ID:???
>>23
ご指摘されてから日付も必要だと気づきました
試してみてうまくいきました
ありがとうございます
26 :
NAME IS NULL
2015/12/02(水) 06:56:53.70 ID:???
>>24
'2015-12-31 23:59:59.00001' ~ '2015-12-31 23:59:59.99999' のデータを取りこぼしちゃう…
27 :
NAME IS NULL
2015/12/02(水) 13:00:04.86 ID:???
適当に直してくださいw
28 :
NAME IS NULL
2015/12/21(月) 18:32:01.84 ID:???
【質問テンプレ】
・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
29 :
NAME IS NULL
2015/12/21(月) 20:03:59.26 ID:6czbpcbH
>>28
後者。

何この質問?

宿題?
30 :
NAME IS NULL
2015/12/21(月) 20:04:56.43 ID:6czbpcbH
後者が結合条件。
31 :
NAME IS NULL
2015/12/21(月) 20:11:18.81 ID:???
詳しく言えば非等価結合な。
32 :
NAME IS NULL
2015/12/21(月) 21:10:08.83 ID:ozDeyBqI
思うんだけど、入門者に対して最初からこういった(専門)用語を学ばせる(覚えさせる)ってのはどうなんだろうな?
こんな用語知らなくても実務じゃ問題なかろう
33 :
NAME IS NULL
2015/12/22(火) 03:57:36.25 ID:???
結合させるためのものか検索するためのものかは用語を知らずとも判断できるはずだよね。
そして少なくとも今回の場合、用語がどちらに当てはまるものかはきわめて容易に分かるよね。
その上で>>32のレスを書いたということ?
34 :
NAME IS NULL
2015/12/22(火) 07:03:32.73 ID:???
>>32
普通にここの検索条件見直せとか言うだろ
くそ忙しい時に検索条件ってどれですかぁ?
なんて間抜けなこと聞かれたらブチ切れられて当然だと思う
35 :
NAME IS NULL
2015/12/22(火) 10:50:38.89 ID:???
暇でない人間は2チャンネルなんか見に来ないよ
36 :
NAME IS NULL
2015/12/22(火) 11:41:35.78 ID:???
それ、一連のやり取りに関係ある?
ただの捨て台詞だよね?
37 :
NAME IS NULL
2015/12/22(火) 11:45:56.45 ID:???
職場で聞かれているわけじゃないんだから、
そういうシチュエーションはいらないと思います。
38 :
NAME IS NULL
2015/12/22(火) 12:53:03.62 ID:???
データベースの構成についての質問もここでいいですか?
39 :
38
2015/12/22(火) 12:54:41.62 ID:???
訂正
テーブル構造の質問です
40 :
NAME IS NULL
2015/12/22(火) 13:33:42.07 ID:???
DB設計を語るスレ 9
http://peace.2ch.net/test/read.cgi/db/1444733172/

とかどう?
41 :
NAME IS NULL
2015/12/22(火) 19:49:10.84 ID:???
>>37
>>32 > こんな用語知らなくても実務じゃ問題なかろう
                  ̄ ̄ ̄ ̄
まあ、DB回りは俺一人で開発してる
とかなら知らんが
42 :
NAME IS NULL
2015/12/22(火) 19:53:13.39 ID:???
その人がどういう環境でSQLを使おうとしているかをまず聞いた上でなら分かるけど
実務で使うかどうかすら聞いてないんでしょ?
43 :
NAME IS NULL
2015/12/22(火) 20:46:53.76 ID:???
その無益な言い合いどうでもいいです
何か書き込みあったかと思って見てみれば…
44 :
NAME IS NULL
2015/12/22(火) 20:57:56.09 ID:???
>>42
その人がどの人か知らんけど、俺は >>32 にレスしてるだけ
45 :
NAME IS NULL
2015/12/22(火) 21:03:24.88 ID:???
>>34
実務でそんな話が出たらWHERE句全体のことかと思いそうだが。
>>28の検索条件と結合条件って実際呼び分けてる?
46 :
NAME IS NULL
2015/12/22(火) 21:06:02.81 ID:???
そうですか。では私の発言は無視して下さい。
47 :
NAME IS NULL
2015/12/22(火) 21:24:17.70 ID:???
>>45
呼び分けてない
48 :
NAME IS NULL
2015/12/22(火) 22:26:22.87 ID:+RAFY3WQ
>>45
結合条件と絞込条件

俺は検索条件というあいまいな言葉は使わないな。
49 :
NAME IS NULL
2015/12/22(火) 22:59:18.71 ID:???
FROM句のテーブルを直積→WHERE句の条件で絞込み(選択)、ってイメージだから
区別したことないわ。
50 :
NAME IS NULL
2015/12/22(火) 23:44:03.90 ID:+RAFY3WQ
>>49
FROM句で結合条件を書く方法だとそれでいい。

WHERE句で書く場合は、結合条件と絞込条件が混在するので、先に結合条件を書いたり、コメントを入れる。
51 :
NAME IS NULL
2015/12/23(水) 00:07:47.91 ID:???
逆だろ。FROM句にJOINで結合条件書いたらそれは直積じゃない。
で、直積に対しては結合条件と絞込条件などと区別する必要もない。
52 :
NAME IS NULL
2015/12/23(水) 00:18:40.85 ID:???
>直積に対しては結合条件と絞込条件などと区別する必要もない。
あのさあ
53 :
NAME IS NULL
2015/12/23(水) 00:35:24.51 ID:???
>>52
なになに?
54 :
NAME IS NULL
2015/12/23(水) 00:38:52.62 ID:???
>>50
&#9747;FROM句で結合条件を書く方法だとそれでいい
○FROM句に結合条件書かないならそれでいい

だよな?書き間違い?
55 :
NAME IS NULL
2015/12/23(水) 00:56:59.80 ID:???
>>53
上を見て納得しました
絡んですいません
56 :
NAME IS NULL
2015/12/23(水) 01:27:59.83 ID:???
http://q.hatena.ne.jp/1327717990

このページのうぃんどさんが偉そうに説明してる全結合ってどこの用語?
StackOverFlow 見ると explain させて where も inner join もどっち使っても一緒って切り捨てられてるみたいだけど
57 :
NAME IS NULL
2015/12/23(水) 09:55:42.49 ID:???
>>54
たぶん>>50は直積を知らなくて、>>49がJOINのことを言っていると脳内変換したと思われ
58 :
38
2015/12/23(水) 18:06:16.42 ID:???
>>40
質問を整理してからそこで聞いてきます
59 :
NAME IS NULL
2015/12/27(日) 12:35:10.49 ID:???
教えてください。

やりたいこと
・元のデータ(生データ)を格納する table A がある
・生データを週単位で集計した table B がある
・新たな生データを投入した table A' を集計して集計済みの table B のデータに加えたい

単純に A' のデータを集計して B に新規追加するだけなら簡単なのですが、
A' のデータと同じ集計単位のデータが B にあった場合にどう処理するのが効率的なのかが分かりません。
A' のデータを一端一時テーブル等に集計した後に、B に存在する集計単位と存在しない集計単位ごとに
UPDATE と INSERT を行う方法が思いつくのですが、一般的でしょうか。

アドバイスを頂ければ、と思います。
60 :
NAME IS NULL
2015/12/27(日) 13:08:20.26 ID:yu7sfdbc
>>59
質問が分かりません。
61 :
NAME IS NULL
2015/12/27(日) 13:42:43.76 ID:9lnqXFiU
いるよな、こういう質問のドヘタクソな奴
62 :
NAME IS NULL
2015/12/27(日) 14:00:57.58 ID:???
>元のデータ(生データ)を格納する table A がある

table Aの定義を明らかにしなさい。

>生データを週単位で集計した table B がある

何をキーに集計するのかを明らかにしなさい。

>新たな生データを投入した table A'

「新たなデータ」なら同じ集計単位は発生しないんじゃないの?
63 :
NAME IS NULL
2015/12/27(日) 14:15:05.30 ID:???
■PostgreSQL 9.4

■テーブルデータ
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で割った値が欲しいです
64 :
59
2015/12/27(日) 14:45:24.34 ID:???
具体的な質問じゃなくてごめんなさい。
ここは SQL 文そのものの質問をするところだったのね。スレチだし答えられなければ無視しといてください。

>「新たなデータ」なら同じ集計単位は発生しないんじゃないの?

例えば過去に 2015/11/01 のデータを投入するとそのデータが table B に保存される。
その後で 2015/11/02 のデータを投入すれば「同じ週」なので同じ集計単位のデータが発生します。
65 :
NAME IS NULL
2015/12/27(日) 14:53:32.86 ID:???
>>64
同一日付のデータはテーブルAから弾いていいの?それとも別データ扱い?
テーブルBでは弾いていいの?それとも後から来たデータで更新したいの?

DBMS名も言った方がいいよ。やりたいことさえはっきりすれば方法はあると思う。
66 :
59
2015/12/27(日) 15:21:14.83 ID:???
>>62,65
仮定の話になるので不要と思っていましたが、データの具体例を挙げます。

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 で試します。
67 :
59
2015/12/27(日) 15:24:48.58 ID:???
訂正

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
68 :
NAME IS NULL
2015/12/27(日) 15:45:31.96 ID:???
よかった何言ってるのかわからなかったのは俺だけじゃなかったんだw
69 :
NAME IS NULL
2015/12/27(日) 20:38:14.45 ID:???
>>59,66
知りたいのはMERGE文じゃない?
大体のDBMSで似た様なものがあるけど
70 :
NAME IS NULL
2015/12/27(日) 20:41:07.29 ID:???
>>66
SQL Serverの場合、mergeというステートメントが使用できる。
これ使うと、対象テーブルに対して、特定条件でinsertとupdateの何れかを実行できるそうだ。
申し訳ないが、こちらには実行環境がないので実際に試しての検証はできない。
71 :
NAME IS NULL
2015/12/27(日) 21:26:06.33 ID:???
>>69-70
欲しかったのはこれです。
ありがとうございます。

こんな感じでしょうか。(書いただけです。全く確認してません。)

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 )

思いつきで書いただけなのでもっと効率のいい書き方がいくらでもありそう。考えます。
72 :
NAME IS NULL
2015/12/28(月) 12:48:32.72 ID:jyNPkj4+
>>71
ロジック書いた方がいい。

メンテナンスが難しくなる。
73 :
NAME IS NULL
2015/12/28(月) 14:17:09.48 ID:???
>>63
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 とかで
74 :
NAME IS NULL
2015/12/28(月) 14:20:06.57 ID:???
週でわけるなら
TO_CHAR(created_at,'YYYY-MM/w')
か、でもこれ起点が1日だからな
75 :
NAME IS NULL
2015/12/28(月) 15:21:10.21 ID:???
当日から日付までの日数引いて7で割るのがよさげ
76 :
NAME IS NULL
2015/12/28(月) 15:48:22.89 ID:???
>>72
> ロジック書いた方がいい。
ロジックって何?
クライアントループしろとかそういう話?
77 :
NAME IS NULL
2015/12/28(月) 16:05:32.61 ID:???
Transact-SQL 使っても良いんじゃない?
78 :
NAME IS NULL
2015/12/28(月) 17:11:36.25 ID:???
UPDATEとINSERTの2文を1トランザクションで流せば良いだけの気が
79 :
NAME IS NULL
2015/12/28(月) 20:45:47.24 ID:???
MERGE ぐらいでメンテナンスが難しくになるかなぁ…
80 :
NAME IS NULL
2015/12/28(月) 20:53:03.73 ID:FOWa2ASA
SQLのテストをしない低レベルなら、かまわないが。
81 :
NAME IS NULL
2015/12/28(月) 22:02:22.65 ID:???
>>73
できました
ありがとうございます
82 :
NAME IS NULL
2015/12/29(火) 03:44:58.15 ID:???
>>72
スレチですよ
83 :
NAME IS NULL
2015/12/29(火) 12:38:55.09 ID:PogCLmH3
SQLを何だと思ってるのかw

まさかStructureなんたらとか思ってるんじゃないだろうなw
84 :
NAME IS NULL
2016/01/09(土) 11:31:38.67 ID:???
初学者です。
ご回答よろしくお願いします。
単一の表から複数の異なる集約結果を求めたいのですが、以下のような方法しか思いつきませんでした。
なにかもっとスマートな方法はありませんか?

select
(select count(番号) from 在庫) as 合計,
(select count(番号) from 在庫 where 分類='メンズ') as メンズ計,
(select count(番号) from 在庫 where 分類='レディース') as レディース計,
(select count(番号) from 在庫 where 分類='ジュニア') as ジュニア計
85 :
NAME IS NULL
2016/01/09(土) 12:34:33.27 ID:???
86 :
NAME IS NULL
2016/01/09(土) 14:04:40.10 ID:P8kdYMvv
>>84
それの方が分かりやすい。

ただなんのために横列で取得したいの?

union allで複数行で取得してもいいと思うけど?
87 :
NAME IS NULL
2016/01/09(土) 14:24:07.10 ID:???
>>86
ありがとうございます。
これでも変なSQLではないのですね?
union all とかも考えたんですが、上の例で言うと、
アイテム数(行数)が数百万で分類が数十万とかになるので、かえって遅くなるかと思いました。
88 :
NAME IS NULL
2016/01/09(土) 14:29:38.09 ID:???
かえって遅くなると考えたのはどうして?
89 :
NAME IS NULL
2016/01/09(土) 14:52:19.58 ID:???
まさかGROUP BY知らないとかじゃないよな
分類でGROUP BYして、必要ならアプリで縦横変換ってパターンじゃないのかねぇ
90 :
NAME IS NULL
2016/01/09(土) 22:50:39.07 ID:4FHVsotA
>>87
分類が数十万もあるなら、数十万カラムもあるSELECT文を発行するつもりだったのか?

どんな言語で処理したいのか、どんな方法で見たいのか分からないが、プログラムだとしても恐ろしいことになるぞ。
91 :
NAME IS NULL
2016/01/09(土) 22:56:36.82 ID:4FHVsotA
>>87
データベース内の処理はほぼ同じなので性能差を体感できないだろうよ。
92 :
NAME IS NULL
2016/01/09(土) 23:25:13.64 ID:???
>>90
ありがとうございます。
本件(に限って)の場合、数十万に及ぶ全ての分類の集計が必要なのではなく、
数十万のうち常に3つの分類(の組み合わせ)の集計だけが必要だったのです。
93 :
NAME IS NULL
2016/01/09(土) 23:26:25.39 ID:???
アイテム数が数百万と言うのはあると思うけど、
実務で分類が数十万になるケースってあるのかな。
仮にあったとして、そのレベルで集計した物を
どういう風に利用するんだろうか。
94 :
NAME IS NULL
2016/01/09(土) 23:32:21.31 ID:???
直前の書き込み見て無くてごめん。
その時々で集計したい分類が決まるというなら、
union all の方が柔軟性があるんじゃないかな。
95 :
NAME IS NULL
2016/01/10(日) 00:20:26.29 ID:4AZcq86j
>>92
検索結果が必ず一貫性の取れた
96 :
NAME IS NULL
2016/01/10(日) 00:23:36.54 ID:4AZcq86j
>>92
あとそれってある時点の一貫性の取れた検索結果じゃないといけないの?

検索中にデータが増減しないなら、無理に一つのSQLにする必要もない。
97 :
NAME IS NULL
2016/01/10(日) 01:18:03.30 ID:???
>>96
ありがとうございます、質問者です。
すいません、「一貫性の取れた検索結果」というのはどう言う意味でしょうか?
データベース用語でしょうか?

あと、在庫とかメンズ、レディースというのは便宜上使っただけで、
実際のsubjectはある集団の「人間」です。
98 :
NAME IS NULL
2016/01/10(日) 03:17:44.84 ID:4AZcq86j
>>97
SELECT文を実行するときに、他のセッションが在庫テーブルにレコードを登録、削除するかどうかということ。

1つのSELECT文で検索すると読み取り一貫性が担保される。

複数のSELECT文で検索すると合計が合わないかもしれない。
99 :
NAME IS NULL
2016/01/10(日) 07:13:17.63 ID:???
すなおに3回select文発行すれば良いだけの気がするが
整合性うんぬんなら、しかるべき分離レベルの1トランザクションにすれば良いだけ
100 :
NAME IS NULL
2016/01/10(日) 07:49:32.48 ID:???
ド素人がSQLってどんなものか勉強するのにおすすめな本や方法ってありますか?
あとそういう人が行くべきスレはどこですか?
101 :
NAME IS NULL
2016/01/10(日) 09:16:16.90 ID:???
>>93
Amazon 辺りで 分類 = 商品コード で管理してたらあるんじゃね?
まあカテゴリ毎に分散してるのかも知らんけど
102 :
NAME IS NULL
2016/01/10(日) 09:18:48.75 ID:???
>>99
3回発行するぐらいなら、>>89 の言うように group by でいいと思うが
103 :
NAME IS NULL
2016/01/10(日) 09:30:10.71 ID:???
>>101
いやだからそれはアイテム数が数百万のケースだろ
それを分類とは呼ばん
104 :
NAME IS NULL
2016/01/10(日) 09:43:33.31 ID:???
分類あたりのアイテム数が10そこそこだし、分類にインデックスが張られているなら
select 3回、なければgroup byだろうね。
105 :
NAME IS NULL
2016/01/10(日) 09:53:20.10 ID:???
>>103
> それを分類とは呼ばん
自分の考えが全てとか、笑える
106 :
NAME IS NULL
2016/01/10(日) 12:08:06.85 ID:???
>>101
アマゾンクラスの仕事の依頼がここに来たら感激だな
107 :
NAME IS NULL
2016/01/10(日) 19:30:04.74 ID:???
>>102
そのへんはホストアプリとの兼ね合いだな
GROUP BYするにしても、分類を三つに絞るのにorなりinのリストなり
動的にSQL組み立てる必要があるかもしれん

その場合三つってのが確定的なら動的に組み立てて1SQLでも良いかもしれんが
ループまわして複数回発行する方が楽かもしれん

>>104
分類にインデックスが無い状態で3回selectすると、スキャンが3回発生するわけだが
それなら1回ですむGROUP BYの方が良いと思うが
そもそもアイテム数が10そこそことか、どこからそう判断したんだ
108 :
NAME IS NULL
2016/01/10(日) 19:33:46.64 ID:???
>>105
お前はまず日本語の勉強しろ
109 :
NAME IS NULL
2016/01/10(日) 20:01:12.41 ID:???
>>108
恥ずかしい奴 w
110 :
NAME IS NULL
2016/01/10(日) 20:21:22.14 ID:???
>>107
インデックスがあるならselect 3回って書いてあるが。
111 :
NAME IS NULL
2016/01/10(日) 23:11:43.96 ID:???
>>110
ああ、そう書いてあるな。読み違えてるか

それで、アイテム数10ってのはどういう判断だ]

インデックスないならGROUP BYってのはわかるが
select3回の根拠は?インデックスあってもGROUP BYでも良いわけだが
112 :
NAME IS NULL
2016/01/11(月) 01:57:27.73 ID:MkJd1wQz
>>111
そのグループ化するカラムがフルテーブルスキャンならダメだろ。
113 :
NAME IS NULL
2016/01/11(月) 04:03:36.24 ID:???
orやin使うとインデックスあってもフルスキャンするって主張?
114 :
NAME IS NULL
2016/01/11(月) 05:36:49.44 ID:???
>>111
実行計画見たことない奴に聞いても無駄
115 :
NAME IS NULL
2016/01/12(火) 11:55:31.85 ID:???
>>111
横だけど、分類あたりの平均アイテム数は10くらいであってると思うんだけど
116 :
NAME IS NULL
2016/01/13(水) 00:37:10.16 ID:ztbfyYEK
>>113
117 :
NAME IS NULL
2016/01/17(日) 10:07:32.95 ID:???
>>116
118 :
NAME IS NULL
2016/01/21(木) 20:12:45.94 ID:???
SQLServerですが、
NULL禁止なフィールドのあるテーブルをFROMとして
作業表へ SELECT INTO しようとしてます。
作業表では全てのフィールドNULL許可にしたいのですが、WITH〜 なんかを指定することで簡単にできないですか。

作業表を create table するのは避けたいです。


SELECT * FROM [NULL禁止項目のあるテーブル] INTO #TMP;

普通にやると、もとの制限が INTO 先にも適用されてしまいますが
#TPM の中は全てNULL許可にしたいのです。
119 :
NAME IS NULL
2016/01/21(木) 20:13:29.41 ID:???
例のSQL文を間違えました

SELECT * INTO #TMP FROM [NULL禁止項目のあるテーブル];
120 :
NAME IS NULL
2016/01/22(金) 07:51:52.73 ID:???
information_schema 漁って create table するか alter table する sql を生成する。
121 :
NAME IS NULL
2016/01/22(金) 23:44:55.55 ID:???
へぇ、そんな優しい?仕組みがあるんだね。
中の人のことを考えると、結合したりテーブル丸ごとじゃなくて一部の列だけだったりすると
追いかけるの大変そうな気がするし、select 1と結合してみたらどうなるんだろ。
122 :
NAME IS NULL
2016/02/16(火) 13:57:33.49 ID:sAeuyZvT
sqliteにpdoを使って接続しているのですが、
insertする文字列って$pdo->quote()しなくても良いのでしょうか?
これをすると、全てのカラムにクォートが入ってしまいました

例)「あいう'えお」をクォートしてinsertしたい場合
「'あいう''えお'」としてinsertされている
123 :
NAME IS NULL
2016/02/16(火) 15:40:39.33 ID:???
>>122
> sqliteにpdoを使って接続しているのですが、
> insertする文字列って$pdo->quote()しなくても良いのでしょうか?
まず、"sqlite SQLインジェクション"でググる
その次に"sqlite pdo プリペアドステートメント"でググる
そうすれば、しなくても良いかどうかがわかる
124 :
NAME IS NULL
2016/02/16(火) 17:32:15.88 ID:???
>>122
どうやってるのか実際にコード書いたほうが伝わりやすい
quoteするのはデータだけよ、SQL文そのものは一部でも入れちゃダメ
それがわかった上で、>>123 の言うようにプリペアドステートメントを使うようにしたほうがいい
125 :
NAME IS NULL
2016/02/16(火) 18:11:20.21 ID:???
>>122
PHPスレでやるべきだと思うけども、一応。
executeに渡すパラメータはquoteしなくていいよ。
quoteは自分でクエリを文字列として組み立てるときに使う。
126 :
122
2016/02/17(水) 12:24:07.77 ID:???
>>125
お恥ずかしながらググってもよく分からなくて質問したのですが、
125さんの解説で理解できました。ありがとうございました。
127 :
NAME IS NULL
2016/02/17(水) 14:37:03.18 ID:???
>>126
ちょっと心配だな。
プリペアードクエリは使ってる?
使ってなくてINSERTするデータがユーザ由来のものなら、クォートしないとSQLインジェクションが発生する可能性があるよ。
128 :
NAME IS NULL
2016/02/18(木) 20:17:47.51 ID:4K+rE1O7
メインテーブルと紐づくマスターテーブルが大量にあるデータベースが
あるのですが、
SELECT時、マスターテーブルの情報を連結させた上でメインテーブルを呼ぼうとおもったら
JOINを大量に書いていくしかないでしょうか?
129 :
NAME IS NULL
2016/02/18(木) 21:40:44.54 ID:???
具体例書いたほうが良い回答つくと思うけど
サブクエリでできないこともないけど、JOINが一番シンプルにかけるんじゃないかなあ
130 :
NAME IS NULL
2016/02/19(金) 08:05:36.44 ID:???
>>128
JOINしなくてもできる

プログラムで制御すればいい
メインテーブルからマスタを参照すればいいなら、マスタ情報を抜く関数を作る
131 :
NAME IS NULL
2016/02/19(金) 13:40:11.52 ID:???
>>130
たいていの場合、JOINした方が速いよ。
132 :
NAME IS NULL
2016/02/19(金) 16:09:05.98 ID:E2UQE3yA
テーブルに入るデータは、
固定文字列の場合
コード番号でいれるか
もしくは直接文字としていれるか どちらのほうがいいでしょうか?


ID サイズ
01 Sサイズ
02 Lサイズ
03 Lサイズ
04 Mサイズ
 ↓
ID サイズ
01 0004
02 0002
03 0002
04 0003


特に固定文字が、可、不可 男、女 とか2つしかない場合どうしようか迷います。
133 :
NAME IS NULL
2016/02/19(金) 16:57:37.22 ID:???
>>132
正規化について調べた方がいいよ
134 :
NAME IS NULL
2016/02/20(土) 00:07:27.71 ID:???
>>133
だよね
135 :
NAME IS NULL
2016/02/20(土) 00:13:01.68 ID:???
>>132のどこが正規化と関係あるというのか
136 :
NAME IS NULL
2016/02/20(土) 01:31:48.15 ID:???
おれなら、、、
id サイズ
01 S
02 L
03 L
04 M

だな、、、
名称に意味をもたせたいなら、サイズは数字にして
別に名称を含めたサイズテーブル追加する
137 :
NAME IS NULL
2016/02/20(土) 01:35:30.47 ID:???
小さい順にソートしたいとかもあるなら数字に意味もたせるか、やはり別テーブルでソート順が決まるカラムも入れる
138 :
NAME IS NULL
2016/02/20(土) 01:51:06.80 ID:???
>>132
コード化されているならコード
コード化できないなら文字入れないとしょうがない

コード化できるけどコード化されてないって話なら、コード化するかどうか決めろって話
SQL関係ないし設計関係のスレ行け
139 :
NAME IS NULL
2016/02/21(日) 21:36:28.33 ID:???
SQLite3使ってます
最後に入れたデータを消したいです
DELETE FROM tbl WHERE Id = MAX(Id)
ではエラーになりました
どう書くのがいいですか
140 :
NAME IS NULL
2016/02/21(日) 23:58:26.39 ID:???
DELETE FROM tbl WHERE Id = (SELECT MAX(Id) FROM tbl)
141 :
NAME IS NULL
2016/02/22(月) 05:45:34.92 ID:???
>>140
ありがとうございます!
tblって2回書かないとダメだったのか
142 :
NAME IS NULL
2016/02/22(月) 07:56:30.75 ID:???
>>141
この場合全レコードを参照して最大値を求める以上、サブクエリーを使うしかない。
143 :
NAME IS NULL
2016/02/22(月) 15:46:45.15 ID:???
DELETE FROM tbl WHERE ROWID = last_insert_rowid()

これでいけるかも知れないな
144 :
NAME IS NULL
2016/02/22(月) 20:56:47.07 ID:???
>>142
ありがとうございます
そう言う風に言っていただけると、なぜそうなるのかが理解できて助かります

>>143
ありがとうございます
やってみましたが、エラーにはならないものの、データも削除されませんでした
145 :
NAME IS NULL
2016/02/23(火) 03:37:49.14 ID:???
あくまでも余談。

まさかとおもいながらぐぐってみたら、
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
146 :
NAME IS NULL
2016/02/23(火) 11:19:56.69 ID:???
>>144
last_insert_rowid() はほんとに最後にinsertした行だからね
1度でもこの方法か別の手段で消しててたらもう消えないよ
新たにinsertして試してみて
147 :
NAME IS NULL
2016/02/23(火) 12:24:22.46 ID:mHP3GVeD
むしろ一度消したレコードを再度消す方法があるのか?
148 :
NAME IS NULL
2016/02/23(火) 15:34:15.46 ID:???
>>146
それ以前に、別テーブルにinsertしてたら、違うテーブルの最終ID返すんじゃないのか?
つまり>144は意図しない行が消されてる可能性があるぞ
149 :
NAME IS NULL
2016/02/23(火) 15:44:24.12 ID:???
「最後に入れたデータ」というのを直前の操作と考えたが、
確かにテーブル単位で考えて行かないと正確じゃないな
150 :
NAME IS NULL
2016/02/23(火) 21:11:40.38 ID:???
>>145
私には難しすぎます・・・

>>146
INSERTしてみましたが、結果は同じでした

>>148
まだテスト段階なので1テーブルしかありません
なので大丈夫です
151 :
NAME IS NULL
2016/02/23(火) 21:16:09.87 ID:???
>>150
SELECT ROWID, * FROM tbl WHERE ROWID = last_insert_rowid()

これで何が表示されますか?
152 :
NAME IS NULL
2016/02/23(火) 22:39:57.18 ID:???
一寸試してみました

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>
153 :
NAME IS NULL
2016/02/24(水) 01:07:08.41 ID:???
last_insert_rowidを使うのはもっと理解が進んでからのほうがいいと思うよ。
正直やりたいことに沿っているかどうかも不明な点が多いわけで。
154 :
NAME IS NULL
2016/02/24(水) 09:34:48.51 ID:???
最後に入れたデータを消す理由によるが
もしかするとトランザクションでRollbackしたらいいんでないか
155 :
NAME IS NULL
2016/02/24(水) 11:08:05.77 ID:???
>>150
こっちで試して書き込んでるのに、それと違う結果なんてなにかおかしいね
156 :
NAME IS NULL
2016/02/24(水) 15:55:36.17 ID:???
質問者は insert → .quit → delete という流れなんじゃないかなって思うぐらいかな。
157 :
NAME IS NULL
2016/02/24(水) 20:17:24.10 ID:???
>>154
トランザクション知らんは流石にアホすぎるだろ。
158 :
sage
2016/02/24(水) 22:27:01.48 ID:ap7CA/JN
私の一番最初の書き方が悪かったのですが、SQLite3ではあるのですが、exeでは
なくdllの方です。c#から操作しています。

以下のプログラムで「データの追加」を3回して、「データの表示」をすると安倍
さんが3人います。

ここで「最後の一件削除」をして「データの表示」をしたとき、
  cmd.CommandText =
159 :
NAME IS NULL
2016/02/24(水) 22:35:19.22 ID:???
あれ?書き込めない。
すみません、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です。
160 :
NAME IS NULL
2016/02/24(水) 22:37:12.66 ID:???
 private void btnテーブル作成_Click(object sender, EventArgs e) {
   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();
 
   }
 }
161 :
NAME IS NULL
2016/02/24(水) 22:37:39.49 ID:???
 // データの表示
 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();
   }
 }
162 :
NAME IS NULL
2016/02/24(水) 22:59:02.44 ID:???
>>156 さんが指摘しているように、
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>
163 :
NAME IS NULL
2016/02/25(木) 00:54:03.30 ID:???
select last_insert_rowid(); で良くてよ。
164 :
NAME IS NULL
2016/02/25(木) 01:05:58.20 ID:???
> sqlite は、一旦 quit で閉じると
> last_insert_rowid()が初期化されてしまうみたい。

sqlite「は」なの?
165 :
NAME IS NULL
2016/02/25(木) 05:43:23.43 ID:???
書いてた時は気付きませんでしたが、メソッドの中でCloseしちゃっていました。
これが原因かーと思い、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();
   }
 }
166 :
NAME IS NULL
2016/02/25(木) 10:38:40.17 ID:???
まあ今回の目的にlast_insert_rowid()は合わないのでやめといたほうがいいね
167 :
NAME IS NULL
2016/02/25(木) 10:43:47.76 ID:???
INSERTしてCloseする前にDELETEするなんてこのプログラムでやろうとしてることだと意味ないだろうし
168 :
NAME IS NULL
2016/02/25(木) 16:02:07.79 ID:???
各メソッドで、cn.Open();cn.Close();しているからそれで完結してしまい、
last_insert_rowid()で最後のレコードが取得できないんじゃないの?
btn最後の一件削除_Click()メソッドでlast_insert_rowid()の値が
何になっているか、確認してみたら?
169 :
NAME IS NULL
2016/02/25(木) 16:10:25.34 ID:???
SELECT last_insert_rowid() FROM tbl LIMIT 1
とかで
170 :
NAME IS NULL
2016/02/25(木) 16:42:23.32 ID:???
つーか試すのにいちいちコンパイルからやってるんじゃ日が暮れる、、、
コマンドラインかSQL直接入力できるツールも使えるようになったほうがいいかと
171 :
NAME IS NULL
2016/02/25(木) 17:13:29.60 ID:???
>>170
簡単なコードだし、1回書けばコンパイルも実行も一瞬で終わるだろ
172 :
NAME IS NULL
2016/02/25(木) 17:58:29.34 ID:???
これ一回ならそうだけど、今後もSQL組み立ててコードに追加していくんだろ?
そのたびにデバッガ動かすのかよ
173 :
NAME IS NULL
2016/02/25(木) 18:09:41.22 ID:???
>>172
ん?
どこに問題があるかわからんから、ちょこちょこコードを変えながら実行するだけだろ?
結果はtbxOutputに出力してるじゃん
デバッガなんか必要ないだろ
174 :
NAME IS NULL
2016/02/25(木) 18:15:43.77 ID:???
自分のコードが期待通りに動作しないのを確かめるのは、自分のコードを使うのが一番。
いちいち「コマンドラインかSQL直接入力できるツール」で検証する必要ない。
175 :
NAME IS NULL
2016/02/25(木) 18:39:22.76 ID:???
デバッガて・・・
VSのことか?
176 :
NAME IS NULL
2016/02/25(木) 20:02:35.16 ID:???
>>168
ここまで仕様が明確になってなお last_insert_rowid を使わせようとしてるの?
177 :
NAME IS NULL
2016/02/25(木) 20:10:30.09 ID:???
問題自体はもう解決してる。
今は興味本位で sqlite の挙動見てるだけ。
178 :
NAME IS NULL
2016/02/25(木) 20:16:16.70 ID:???
>>165
このスレ的には>>140で終わってる話だから
アホに頼ってないでドキュメントを読もう
https://www.sqlite.org/c3ref/last_insert_rowid.html
https://msdn.microsoft.com/ja-jp/library/yh598w02.aspx
179 :
NAME IS NULL
2016/02/25(木) 21:48:51.65 ID:???
どうもです。

最初に私が思ってたより話が長くなってしまいましたが、>>140 の処理が
一番いいようです。

作りたいのはWindowsフォームソフトなので、このスタイルのまま続け
たいと思います。

皆様、色々とありがとうございました。
また分からないことがあった時に教えてください。
180 :
NAME IS NULL
2016/02/25(木) 22:47:55.71 ID:???
>>177
挙動もわからず last_insert_rowid を持ち出した人だとすると相当…
181 :
NAME IS NULL
2016/02/26(金) 00:12:23.36 ID:???
>>180
元質問者のことだが。
182 :
NAME IS NULL
2016/02/26(金) 00:24:37.07 ID:???
最初の質問内容 「最後のレコードを削除する」から、
どのような想定をするかは、人によるでしょう

1トランザクション内の障害時ロールバックを想定したり、
あるいは単純に「いらなくなったので消したい」を想定したり

私は last_insert_rowid がどう使えるものなのか興味があったので。
183 :
NAME IS NULL
2016/02/26(金) 01:07:10.54 ID:???
小さなエスパー回答大きなお世話
184 :
NAME IS NULL
2016/02/26(金) 13:26:41.03 ID:???
まあ良いではないか
ちょうど良い暇つぶしにはなってる」
185 :
NAME IS NULL
2016/02/26(金) 18:33:12.87 ID:HEn2/SFy
■PostgreSQL 8.4

■テーブルデータ(テーブル名「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で
いけるでしょうか?

よろしくお願いします
186 :
NAME IS NULL
2016/02/26(金) 19:17:14.32 ID:???
where datai is not null and
data2 is not null and
data3 is not null;
187 :
NAME IS NULL
2016/02/26(金) 20:12:41.15 ID:???
でもこれ、カラム数がもっと多い場合でもis not NULLを羅列するしかないの?
188 :
NAME IS NULL
2016/02/26(金) 20:26:25.75 ID:???
一瞬javaのスレかと思った
189 :
NAME IS NULL
2016/02/26(金) 20:28:44.90 ID:???
間違えた
C#?か 
190 :
185
2016/02/26(金) 20:47:35.03 ID:???
>>186
is not null で繋げれば書けますよね

自分がやった時には、思った結果が出なかったので、
根本的に間違っているのかと思ったのですが、
もう少し確認してみます

ありがとうございます
191 :
NAME IS NULL
2016/02/26(金) 20:56:19.31 ID:???
>>185
たとえばdata1〜data3がすべて数値型なら、data1 + data2 + data3 is not null ということもできるけれど。
192 :
NAME IS NULL
2016/02/26(金) 21:02:01.25 ID:???
data1とかdata2な増えていく場合は
プログラムにやらせればいいんでないかい
193 :
NAME IS NULL
2016/02/27(土) 02:05:15.81 ID:???
まあ設計はスレ違いなんだが
そもそもdata1,2,3と横並びでデータ持ってる事が妥当かあやしいな
194 :
NAME IS NULL
2016/02/27(土) 06:35:49.14 ID:???
>>185
もう解決したみたいだけど、ちょっと質問が曖昧かな
a) data1〜data3 が「全てnull」「以外のid」
b) data1〜data3 が「全てnull以外」「のid」
の2通りに解釈できる
195 :
NAME IS NULL
2016/02/28(日) 06:15:44.39 ID:???
>>194
なんだこの馬鹿
196 :
NAME IS NULL
2016/02/28(日) 07:22:44.18 ID:???
別に馬鹿でもなかろ
197 :
NAME IS NULL
2016/02/28(日) 08:09:38.87 ID:???
馬鹿だと思うよ
198 :
NAME IS NULL
2016/02/28(日) 08:11:33.67 ID:???
199 :
NAME IS NULL
2016/02/28(日) 08:14:25.92 ID:???
馬鹿としか書けない奴がまともだったためしはないから
200 :
NAME IS NULL
2016/02/28(日) 08:21:14.12 ID:???
馬鹿と言われて反応する奴が本物だと思うよ
201 :
NAME IS NULL
2016/02/28(日) 09:59:47.95 ID:???
悔しくてしょうがないことはわかった
あえて誰とは言わないけど ()
202 :
NAME IS NULL
2016/02/28(日) 13:20:38.82 ID:???
ちゃんと要件定義しろって話だな。
例を見る限りでは全てがNULLの行を除外っぽく見えるけど。
一部NULLのケースは明示されてないしな。
203 :
NAME IS NULL
2016/02/28(日) 13:43:46.12 ID:+D81EDqY
そもそもNULLに何かしらの意味を持たせる設計をするから、IS NULL、IS NOT NULLの条件が必要なってしまう。

NULLは値がないという意味しかないのに、NULLとときはこういうデータだとか決めてしまうからSQLが意味不明になる。
204 :
NAME IS NULL
2016/02/28(日) 13:44:50.90 ID:???
確かにサンプル示すときは、説明文で不十分なところも
補完できるように示して貰えるといいよね
205 :
NAME IS NULL
2016/02/28(日) 15:59:17.66 ID:PzeYPH0U
■PostgreSQL 8.4

■テーブルデータ(テーブル名「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で
いけるでしょうか?

よろしくお願いします
206 :
NAME IS NULL
2016/02/28(日) 16:10:26.98 ID:PzeYPH0U
>>205は、誤って書き込んでしまいました
失礼しました

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

自分が詰まってるところを
正確に説明できず、すみませんでした

よろしくお願いします
207 :
NAME IS NULL
2016/02/28(日) 16:27:53.47 ID:???
自分が書いたSQLを正確にここに晒してみなさいよ。勿論テーブルやカラム名はテスト用のもので良いからさ
208 :
NAME IS NULL
2016/02/28(日) 17:02:30.85 ID:???
>>206
すべてがnot NULLのレコードを抽出するという意味になっている。
209 :
NAME IS NULL
2016/02/28(日) 17:23:24.00 ID:???
>>206
> 以下のように、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
でもいけるかもしれない
210 :
NAME IS NULL
2016/02/28(日) 21:32:47.05 ID:PzeYPH0U
>>209
( )に対してnotが書けることを知りませんでした

参考にさせて頂きます
ありがとうございます
211 :
NAME IS NULL
2016/02/28(日) 21:46:49.08 ID:???
>>195 は出てきて謝ろう
完全に >>194 の勘違いされてたぞ
212 :
NAME IS NULL
2016/02/28(日) 23:01:33.29 ID:???
>>206
andじゃなくてorにしないと。
いずれかがnot NULLであればいいんだから。
213 :
NAME IS NULL
2016/02/29(月) 12:11:27.73 ID:???
not (
data1 is null
and data2 is null
and data3 is null)

なんでこんな書き方するんだよw 普通に OR でいいだろ…
214 :
NAME IS NULL
2016/02/29(月) 12:53:35.55 ID:???
「data1〜data3が全てnullのものは抽出しない」を素直に書けばandで書くことになる
215 :
NAME IS NULL
2016/02/29(月) 14:50:50.31 ID:WeDl2jvv
DBにはメールアドレスが格納されています。

[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です。
216 :
NAME IS NULL
2016/02/29(月) 15:34:15.77 ID:???
select domain,count(*) from (select regexp_replace (mailaddress,'^.*@', '') as domain from t) d group by domain;

こんなんでは?
217 :
NAME IS NULL
2016/02/29(月) 20:22:18.85 ID:???
>>213
ドモルガン則な
大学のとき習った懐かしい
218 :
NAME IS NULL
2016/02/29(月) 20:55:12.66 ID:???
>>213
data1, data2, data3 のいずれかが null でない id と書いてあれば or で書くけど?
219 :
NAME IS NULL
2016/02/29(月) 21:00:57.12 ID:???
>>215
> 上記のデータの場合は次のような結果になるようにしたいです。
> 2.example.com 2
> [email protected] 3
> [email protected] 1
それ、@ の前も要るんか?
要るなら、
> [email protected] 3
でなくて
> [email protected] 3
となる理由を書いてくれ
220 :
NAME IS NULL
2016/03/03(木) 23:59:24.93 ID:???
本人が何も書かないとよくわからないな

「ドメイン別にメールアドレスが何件あるか調べたい」
とあるんだから、結果は書き間違いだと思う。
221 :
NAME IS NULL
2016/03/08(火) 00:13:14.55 ID:???
roleに付与されたroleの確認って。
SELECT * FROM role_role_privs;でオッケー?
222 :
NAME IS NULL
2016/03/08(火) 00:14:29.45 ID:???
書く場所間違えました。すみませぬ。
223 :
NAME IS NULL
2016/03/10(木) 19:58:49.20 ID:???
むーかしのバージョンにはあった気がするんですけど
SQLServerにユーザー定義定数ってありませんでしたっけ?

#define ZERO 0  または  const int ZERO = 0;

をSQLServerのデータベースの中で定義して、T-SQLから使えるようにするみたいなやつ
224 :
NAME IS NULL
2016/03/10(木) 20:17:59.54 ID:???
SQLServerのスレで聞けよ
225 :
NAME IS NULL
2016/03/17(木) 20:47:37.60 ID:daAJuKPv
【質問テンプレ】
・DBMS名とバージョン
SQL Server 2012

・テーブルデータ
+-ID-+-NAME-+
| 1 | TARO |
+----+------+
| 1 + HIRO +
+----+------+

・欲しい結果
+-ID-+-NAME-------+
| 1 | TARO, HIRO |
+----+------------+

・説明
上記のようなことは可能なのでしょうか?
226 :
NAME IS NULL
2016/03/17(木) 21:03:46.26 ID:???
sqlserver group concat でぐぐるとどうにかしてる例が出てくるかと。
227 :
NAME IS NULL
2016/03/18(金) 01:42:36.51 ID:9IE7sIpB
>>225
T-SQLなんだから素直にロジックで処理すれば?
228 :
NAME IS NULL
2016/03/21(月) 12:49:37.79 ID:???
>>225
できる。SQLでできる。
idで結合するだけでできる。
229 :
NAME IS NULL
2016/03/21(月) 15:45:51.66 ID:eTEBxCqy
同じテーブルを結合すればできるけど、なんでそんなことしなきゃいけないの?

SELECT文いっぱつでどうにかしようとするのは保守がたいへんだから止めてほしいわ。
230 :
NAME IS NULL
2016/03/21(月) 16:13:52.32 ID:YsgcliQ9
保守が大変←基本的にSQLが書けない奴の言い訳

まあ、この場合は処理的に無駄だからやめた方がいいけど
231 :
NAME IS NULL
2016/03/21(月) 16:47:35.77 ID:???
いやホント保守しきれなくてそのSQL捨てて0から作りなおすことまであるわw
232 :
NAME IS NULL
2016/03/21(月) 17:18:09.54 ID:???
>>229
>同じテーブルを結合すればできるけど、なんでそんなことしなきゃいけないの?

>SELECT文いっぱつでどうにかしようとするのは保守がたいへんだから止めてほしいわ。

あくまで1案だよ。

ロジックでどうにかする案しか出ていないから、SQLでも結果が出るという案を出しただけ。
お前が保守できようができまいがどうでもいい。
233 :
NAME IS NULL
2016/03/21(月) 17:25:49.26 ID:eTEBxCqy
>>232
保守だけでなく単体テストも面倒だろ。

仕様変更のたびにSQLを変える必要があるプログラムは愚作。
234 :
NAME IS NULL
2016/03/21(月) 17:58:10.36 ID:YsgcliQ9
>>233
SQLのテストをすれば良い
SQLだけ変えれば良い

どう転んでも開発保守にかかる工数は
SQL < 自前ロジック
なんだが
235 :
NAME IS NULL
2016/03/21(月) 17:59:00.69 ID:???
なんでもSQL一発で解決したくなる病ってあるよね、一時的な熱病みたいなものかもだけど
236 :
NAME IS NULL
2016/03/21(月) 18:42:44.26 ID:???
ケースごとに考える必要がありそうなネタなんだけどなぁ。
何でも漢字で書いてたり、全部ひらがなで、とか、それらを混ぜる割合とか。読み手にもよるだろ。
夜露死苦レベルなら笑うしかないが。
237 :
NAME IS NULL
2016/03/21(月) 18:47:25.61 ID:???
>>225
>【質問テンプレ】
>・DBMS名とバージョン
>SQL Server 2012

>・テーブルデータ
>+-ID-+-NAME-+
>| 1 | TARO |
>+----+------+
>| 1 + HIRO +
>+----+------+

>・欲しい結果
>+-ID-+-NAME-------+
>| 1 | TARO, HIRO |
>+----+------------+

>・説明
>上記のようなことは可能なのでしょうか?

上の問に、保守性云々が出てくる理由が分からない。
結果がとれるかどうか聞いてるだけの日本語にしか見えない。

保守性がどうとかと言ってるのは、一回限りのデータ参照でも、毎回毎回今後を考えたプログラム組むのかな?
238 :
NAME IS NULL
2016/03/21(月) 19:03:29.95 ID:mvoD5ONw
>>234
ふだんSQLのテストをまともにしてないのが丸わかりだな。
239 :
NAME IS NULL
2016/03/21(月) 19:06:59.38 ID:mvoD5ONw
>>237
分かりにくいSELECT文を考えるより、SQL ServerならSQLバッチを書いた方が早いし、間違いがない。
240 :
NAME IS NULL
2016/03/21(月) 19:26:45.08 ID:YsgcliQ9
>>238
俺もお前がSQLが苦手でコンプレックスを持ってる事が丸わかっちゃった
SQLが分かってれば、そもそも無駄だからやるべきでないこのケースで
「保守がたいへんだから」なんてセリフ絶対出てこないもんね
241 :
NAME IS NULL
2016/03/21(月) 19:33:54.34 ID:???
>>239
この問に対して、君の答えはSQLバッチでもできるよってことを言いたいんだね。

あと君の意見あんま参考になんない。理由はSQLが分かり辛いとかって、各人が判断することだからね。ぼくはSQLが分かり易いって人がいたら、君の論理は破綻するよ。
ぼくはこの程度のSQLであれば、分かり辛いと思う要素がないから、SQLでやっちゃうかなぁ笑
プログラムの実行権限とかもあるしね。笑
242 :
NAME IS NULL
2016/03/21(月) 19:50:04.75 ID:mvoD5ONw
苦手とかそういう問題ではない。

SQLだけでどうにかしようとするやつは、SQLがDBMSでどう処理されるか考えていない傾向がある。

一つのSQLでやろうとする考え方がクセになるとDB設計もおかしくなるし、常に負荷の高いSQLを書いて、対処不能の性能問題を発生させる可能性が高い人間になる。

複雑な問い合わせはアプリケーション仕様、作った人間の意図も分かりにくい。

他のセッションが更新中の可能性があるなら、SQL一発で取得しないといけないが、そうでないなら複雑な問い合わせを書くのは、SQL自体に間違いを埋め込みやすくなり、間違いにも気づかない。

本人に自信があっても他人は信用しない。
243 :
NAME IS NULL
2016/03/21(月) 19:52:01.13 ID:mvoD5ONw
>>241
そもそもあの質問に対して結合でやれという回答は危険なんだよ。
244 :
NAME IS NULL
2016/03/21(月) 19:54:50.17 ID:mvoD5ONw
>>241
キミは自分中心だから、どんなSQLを書こうがかまわないということだろうけど、では他人がひどいSQLを書いたとき、どう反応するのかな?
245 :
NAME IS NULL
2016/03/21(月) 20:01:08.96 ID:???
SQL で、ロジックで、って言ってる人たちが想定してるコードってどんなんなんだろう。
246 :
NAME IS NULL
2016/03/21(月) 20:02:21.66 ID:YsgcliQ9
>>242
> 考えていない傾向がある。
> 性能問題を発生させる可能性が高い人間になる。
煮えきらんやつだなあ
ハッキリ断言出来ないならそんな長文書くなよw
247 :
NAME IS NULL
2016/03/21(月) 20:06:41.02 ID:mvoD5ONw
>>246
自分がどう思うかだけしか考えてないと自分で言っているわけか。
248 :
NAME IS NULL
2016/03/21(月) 20:08:34.46 ID:mvoD5ONw
>>245
俺は自己結合とT-SQLのカーソルを使用したバッチを想定して言っている。
249 :
NAME IS NULL
2016/03/21(月) 20:12:44.06 ID:mvoD5ONw
SQLの単体テストのデータ作りがたいへんなのが分からないのはプログラマ経験が乏しいのだろうな。

検索条件に引っかからないデータパターンがどれほどできるか想定できないのだから。
250 :
NAME IS NULL
2016/03/21(月) 20:13:27.60 ID:YsgcliQ9
>>247
お前何も分かってないのな
自分の意見を言いたい時は自分の立ち位置をハッキリさせて誤解されないように断言しろ
後々の保険を考えてそんな語尾を濁した言い方してても誰にも伝わらんぞ
251 :
NAME IS NULL
2016/03/21(月) 20:15:01.07 ID:YsgcliQ9
>>249
むしろプログラミングスキルが貧弱だからその程度の条件の組合せで苦労するんだよ
252 :
NAME IS NULL
2016/03/21(月) 20:15:31.10 ID:mvoD5ONw
>>250
批判しかできないのか?
253 :
NAME IS NULL
2016/03/21(月) 20:16:02.69 ID:mvoD5ONw
>>251
テストの話だが?
254 :
NAME IS NULL
2016/03/21(月) 20:16:27.00 ID:YsgcliQ9
>>252
何言ってんの急にw
255 :
NAME IS NULL
2016/03/21(月) 20:18:03.80 ID:mvoD5ONw
>>251
おまえは常に自分がやることを前提にものを言っている。

誰もおまえにやれとは言ってない。
256 :
NAME IS NULL
2016/03/21(月) 20:22:32.95 ID:YsgcliQ9
>>255
またまた何言ってんの?
誰がやろうとプログラムで書こうとテストの条件は変わらんのだぞ
257 :
NAME IS NULL
2016/03/21(月) 20:22:53.56 ID:mvoD5ONw
>>254
おまえさ、勝手に質問に対して前提条件を付けたり、説明もない脳内想定で話をしてるけど、大丈夫か?
258 :
NAME IS NULL
2016/03/21(月) 20:25:42.11 ID:YsgcliQ9
>>257
いやいや俺の方がちんぷんかんぷんなんですが?
何言ってんの急に?
259 :
NAME IS NULL
2016/03/21(月) 20:26:36.22 ID:mvoD5ONw
>>256
おいおい、テスト仕様を考えたことないのかよw

誰が考えても、誰がやっても同じにはならないし、そもそもテストしないやつだっているんだよ。

おまえはおまえがやることしか答えてない。

俺にはおまえがどんな立場で仕事をしているかよく分かるよ。
260 :
NAME IS NULL
2016/03/21(月) 20:29:55.63 ID:YsgcliQ9
>>259
プログラムでロジック書いたらテストしないやつがいてもいいって言いたいのか?
何言ってんのお前?
261 :
NAME IS NULL
2016/03/21(月) 20:39:10.84 ID:???
>>248
>>229と何が違うの?

>そもそもあの質問に対して結合でやれという回答は危険なんだよ。
262 :
NAME IS NULL
2016/03/21(月) 20:47:26.68 ID:???
>>244
ぼくが言いたいのは、あくまで結果をとるための方法が2通りあるってこと。君がオススメするSQLバッチとSQLで結合したやり方ね。

で、君はSQLでの方法はNGって言いたいのかな。結合だと危険、酷いSQLになるってことを懸念しているようだし。君の懸念事項は、今後システム運用することを前提にしているように見えるけど、そんな前提はどこにも書いていないよ。

何度もで申し訳ないけど、方法として何があるか問われているだけ。
263 :
NAME IS NULL
2016/03/21(月) 20:51:04.36 ID:???
とりあえずここはSQL質疑応答スレだから、SQLで出来る事をそう回答する事に問題はないだろ
まずそのSQL晒せや

そのSQL文がどんなものかも出てないのにどうこう言ってもしょうがない
そのSQLみてから、SQLでやるべきかどうかとか、そのSQLの保守性とか、言いたければ言えば良いんじゃね
本来のこのスレの守備範囲ではないとは思うが

ちなみにカンマ区切りの文字列へ連結するの、昔再帰SQLで書いてみた事あるけど
元の質問だけだと、要件が不明すぎて俺には回答できないがな
264 :
NAME IS NULL
2016/03/21(月) 21:52:32.30 ID:???
>>248
具体的にはどんなのなのかなーと。

「今回の案件?」で、一体どんな「メンテに困る」ようなコードが書けるのか見てみたいな、と。
できれば SQL 単体、ロジック単体、混合のそれぞれのケースを。
265 :
NAME IS NULL
2016/03/21(月) 22:52:43.33 ID:mvoD5ONw
【質問テンプレ】
・DBMS名とバージョン
SQL Server 2012

・テーブルデータ
+-ID-+-NAME-+
| 1 | TARO |
+----+------+
| 1 + HIRO +
+----+------+

・欲しい結果
+-ID-+-NAME-------+
| 1 | TARO, HIRO |
+----+------------+

・説明
上記のようなことは可能なのでしょうか?
266 :
NAME IS NULL
2016/03/21(月) 22:55:21.24 ID:mvoD5ONw
>>265
SELECT '1', 'TARO, HIRO';
267 :
NAME IS NULL
2016/03/22(火) 00:05:04.40 ID:???
一括で処理しなければ取得できない(もしくは分割することで多大な苦労をすることになる)ものもよくあるわけで、
それを無視して保守のために分割すべきというのは暴論にすぎないね。
268 :
NAME IS NULL
2016/03/22(火) 00:07:16.38 ID:???
ログも見ずに書いたから、そんなことわかってるわボケと思われてはいけないと思ってログを見たら

> 他のセッションが更新中の可能性があるなら、SQL一発で取得しないといけないが、そうでないなら複雑な問い合わせを書くのは、SQL自体に間違いを埋め込みやすくなり、間違いにも気づかない。

…こりゃだめだ。
269 :
NAME IS NULL
2016/03/22(火) 00:12:54.31 ID:???
ああ、こりゃ確かに困るね。w
でもメンテ以前にレビューを通らないだろ。
270 :
NAME IS NULL
2016/03/22(火) 00:16:05.20 ID:???
こんなこと堂々と吐いてるやつの職場が、レビューできてるとは到底思えないね
271 :
NAME IS NULL
2016/03/22(火) 00:33:13.38 ID:???
必要以上に難しく書く必要はないが、必要ならそれが難しいものだろうがそうするべきで、
それはSQLだろうがロジックだろうが変わらないということを理解できていないのかもしれない。
272 :
269
2016/03/22(火) 00:36:10.72 ID:???
ああ、失礼。
269 は 266 宛てな。
273 :
NAME IS NULL
2016/03/22(火) 09:15:43.02 ID:XCbF2Frf
>>271
必要になる時点で設計がおかしい。
274 :
NAME IS NULL
2016/03/22(火) 09:18:47.85 ID:XCbF2Frf
>>267
あのね、DBの使い方がおかしいんだよ。

ここにはDB設計に意見が言える人間はいないの?
275 :
NAME IS NULL
2016/03/22(火) 09:31:07.82 ID:XCbF2Frf
スナップショット、一時表、フラッシュバック問い合わせ等々を使うことも考えられるし、特定の検索用のテーブルを作ることもありだ。
276 :
NAME IS NULL
2016/03/22(火) 12:54:44.56 ID:???
状況がわからんと最適なDB設計なんてできないからこの手のスレでは明らかにおかしな設計でないと設計についてとやかく言わない
って言うのが普通だと思っていたが...
277 :
NAME IS NULL
2016/03/22(火) 12:54:50.45 ID:???
>>274
ここDB設計スレじゃないよ
278 :
NAME IS NULL
2016/03/22(火) 13:15:29.25 ID:???
>>277
文句は代案とセットじゃないとただの犬の遠吠えだから
279 :
NAME IS NULL
2016/03/22(火) 13:29:41.70 ID:7yveUErx
という訳でここは>>274によるおかしくないDB設計が提示されるのを待とうではないか
代案とセットじゃないとただの犬の遠吠えらしいからな
280 :
NAME IS NULL
2016/03/22(火) 14:30:48.25 ID:???
>>278
そんな大げさな話じゃないんだけどなぁ。大丈夫かい?

設計はこっちで。
DB設計を語るスレ 9
http://echo.2ch.net/test/read.cgi/db/1444733172/
281 :
NAME IS NULL
2016/03/23(水) 20:29:52.59 ID:Y1xGecwA
               【TPP断固反対(嘘)】   自由ホランチョ党   【スタンフォード(嘘)】



              安倍首相がスタンフォード大前で「嘘つき安倍は帰れ!」と抗議を受ける
                     ダウンロード&関連動画>>


  安倍総理、麻生副総理も経歴詐称? 海外留学の経歴が削除されていた! 「学歴詐称」は公職選挙法違反


                 【日本の金正恩】      安倍寛信      【安倍晋三の兄】

   復活した電力会社の原発広告に文化人や芸能人がまたぞろ登場して原発をPR! 500万円の高額ギャラも    勝間和代 三橋貴明 佐藤優
       三菱商事の核ミサイル担当重役は安倍晋三の実兄、安倍寛信 三菱重工の重役でもあるらしい
     これがフクイチで核弾頭ミサイルを製造していた疑惑がある 書けばツイッターで速攻削除されている
                 ネットにおける言論統制は、非公然で陰湿に進んでいるようです
                 https://twitter.com/toka iamada/status/664017453324726272


                                  山本太郎

                           先ず真のテロリズムと戦うべき!
汚染物質をバラ撒き、国民を無理心中へと巻き込む政治家、経済団体等をテロ指定、資産凍結するのが筋ではないか!


                             【だってお金欲しいもん〜】

               今朝、辺野古で新基地建設に反対するママの会メンバーに対して、
            機動隊員が「お前たちには汚い血が流れている」などと暴言を吐いたそうです。
       自分のやっていることを「だってお金欲しいもん〜」「俺の写真を待ち受けにしろ」とも (顔写真)
               https://twitter.com/MothersNoWar/status/690357793702940672
282 :
NAME IS NULL
2016/03/24(木) 16:43:09.85 ID:vxfdo0VQ
まともなプロジェクトだとDBAが必ずSQLのチェックする。

こういうSQLを書かないといけないとDBAに相談すれば、設計も検討するし、アドバイスもする。

プロジェクトとして一番困るのはプログラマとして入って、凄まじいSQLを書いてすぐ去っていく人間。
283 :
NAME IS NULL
2016/03/24(木) 21:34:58.48 ID:???
パフォーマンスチューニングとしてプログラマが書いたSQL見る事はあるけど
基本ブログラマのSQLチェックとかDBAの仕事じゃない
プログラムのレビューでやっとけよ
284 :
NAME IS NULL
2016/03/24(木) 23:00:07.21 ID:/tnpx12k
>>283
だからダメなんだろうが。

DBAは発行されるSQLを把握していなければ、性能問題であとで苦しむ。

インフラ側みたいなDBAしかいないか、アプリ開発側の自称DB、SQL得意が勝手にDB設計、SQLを書くからおかしくなる。
285 :
NAME IS NULL
2016/03/24(木) 23:07:11.31 ID:/tnpx12k
オラクル社の功罪も大きいよな。

自分たちが分からないからと言って開発から逃げるような領域しか教えないんだから。

実際、開発経験がないから適切なDB利用マニュアルも書けないし、知識がないからデータモデリングのアドレスもない。
286 :
NAME IS NULL
2016/03/25(金) 00:24:53.08 ID:???
根本的な設計部分は発行されるクエリによらないはずだが。
チューニングできるDBAがいるべきなのは異論の余地はないけど。
287 :
NAME IS NULL
2016/03/25(金) 01:05:12.55 ID:D147JQzi
PHPとMySQLでデータベース検索システムを作っています。
数値と文字が混合したデータ(例えばA001)を扱いたい場合はデータ型を何に設定すればいいのでしょうか。
288 :
NAME IS NULL
2016/03/25(金) 01:17:24.15 ID:7sLwcV7e
>>287
文字型
289 :
NAME IS NULL
2016/03/25(金) 11:04:47.08 ID:???
>>284
> DBAは発行されるSQLを把握していなければ、性能問題であとで苦しむ。
その発行されるSQLというのは、開発プロセスのどの段階でFixするんだ?

詳細設計工程とかいうのが区切られてて、その終了時か?
実装工程とかいうのが区切られてて、その終了時か?
DBAひとりあたり、何人のプログラマの面倒を見るんだ?
290 :
NAME IS NULL
2016/03/25(金) 11:16:44.37 ID:???
5,6000行の動的SQL書いて去っていったのを見た時は
こいつの頭ん中どうなってんだ?と関心したけどメンテつらすぎる
291 :
NAME IS NULL
2016/03/25(金) 11:21:00.74 ID:WvUm2VO+
>>289
複雑な問い合わせを書いて着た段階で説明を求めるだけでいいだろ。
292 :
NAME IS NULL
2016/03/25(金) 11:25:14.24 ID:WvUm2VO+
>>289
おまえインフラしかやらないようなDBAだろ?

DBAは最初から最後までプログラマと協力してやるのが理想的。

発行されるSQLを見ずにDBMSを調整しても無駄。
293 :
NAME IS NULL
2016/03/25(金) 11:30:28.62 ID:???
そこらの野良PGにSQL書かせちゃだめ
インターフェースを定義したうえでストアド化し、ストアドの中はPGに触らせるな
294 :
NAME IS NULL
2016/03/25(金) 12:56:41.81 ID:VBVskd/y
5000行のSQLてちょっと想像がつかんな
何したらSQLだけでそんなに長くなるん?
295 :
NAME IS NULL
2016/03/25(金) 13:09:47.34 ID:???
DBAって本来、運用系の役職じゃないのか?
296 :
NAME IS NULL
2016/03/25(金) 14:46:42.33 ID:???
だから、
>>291
> 複雑な問い合わせを書いて着た
というのは、開発プロセスのどの段階の話なんだと聞いてる。

>>292
> おまえインフラしかやらないようなDBAだろ?
いや、俺はプログラマだが。

> DBAは最初から最後までプログラマと協力
「最初」というのは開発プロセスのどの段階で、
「最後」というのは開発プロセス(+運用プロセス)のどの段階なんだ?

> 発行されるSQLを見ずにDBMSを調整しても無駄。
問題があるクエリの内容を見るのは、別にプログラマと協力せずともよいが。
297 :
NAME IS NULL
2016/03/25(金) 14:53:17.92 ID:???
それと、「複雑」というのがどの程度の複雑さなのかわからないが、
複雑だから問題が発生するとは限らないし、
複雑でないから問題は発生しないとも限らない。

問題があるかどうかは、
* スロークエリ発生
* スローレスポンス(Webアプリの場合)
* 低キャッシュヒット率
* 不要なseq scan発生
* ロック、待ち
* 使用されないindex
などを監視する必要がある。

あとは、RDBMSに応じて、HOT使用率(PostgreSQL)とかそのての情報を統計情報から調べる必要がある。

それらを、Muninとかでグラフ化したり、Logwatchでレポートしたり。
298 :
NAME IS NULL
2016/03/25(金) 16:57:41.30 ID:???
複雑なクエリはだめと書いてる人が同じ人だとすると、自己結合した時点で複雑すぎてメンテできないって人だよね。
299 :
NAME IS NULL
2016/03/25(金) 19:09:42.11 ID:MSYuOkWn
プログラマーに相手にされない無能DBAの愚痴に付き合ってあげるお前らの優しさ
300 :
NAME IS NULL
2016/03/25(金) 19:34:20.42 ID:pxjOVYaI
>>297
それをできてから確認するのか?
遅すぎる。
301 :
NAME IS NULL
2016/03/25(金) 19:42:37.11 ID:???
>>300
自分が知ってる単語並べてるだけでいっぱいいっぱいなんだからいちいち突っ込んでやるなよ
302 :
NAME IS NULL
2016/03/25(金) 22:47:10.83 ID:???
>>300
理解できない人か

>>301
ワオ。おつかれさまです!
303 :
NAME IS NULL
2016/03/25(金) 23:15:00.85 ID:WvUm2VO+
>>297
複雑な問い合わせで問題がない場合はない。

とりあえずいまはよくても将来、問題になる無駄に処理コストの高いSQLは排除しておく必要がある。

一時的なものならかまわないが、そうでないなら、設計がおかしいのだから、設計を見直すべき。
304 :
NAME IS NULL
2016/03/25(金) 23:32:24.60 ID:???
SQLite
テーブル名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回で終わらせたいのです
305 :
NAME IS NULL
2016/03/25(金) 23:41:59.32 ID:WvUm2VO+
>>304
union all

足りないカラムはNULLか'未取得'とでもSELECT句に指定しておけ。

ただし、こういうのはあまりお勧めしない。
306 :
NAME IS NULL
2016/03/25(金) 23:44:09.08 ID:WvUm2VO+
他にも列指定に条件を付けて列選択できるけど、お勧めしない。
307 :
NAME IS NULL
2016/03/25(金) 23:45:44.31 ID:WvUm2VO+
どういう理由でそうしたいのか言ってくれないと、全部やめろと本当は言いたい。
308 :
NAME IS NULL
2016/03/26(土) 02:04:12.26 ID:7VvpbPCa
>>288
初歩的な質問にも関わらず、ありがとうございます
309 :
NAME IS NULL
2016/03/26(土) 03:08:17.44 ID:???
ageがNULLになってればいいんなら、UNIONしないでもCASE式でも使えば良いだけじゃないのか

違う項目数じゃないとダメだって言うなら、2個の結果セットが必要だから
SQL文としては2回やるしかないんじゃね

環境によっては複数のSQLを1回で渡して複数の結果セットを1回で受け取れるかもしれんけど
まあ何がしたくてそんな事をしたいのかわからんと何とも言えんな
310 :
NAME IS NULL
2016/03/26(土) 03:18:34.86 ID:???
>>303
馬鹿ブログラマほど、設計が悪いとか言い出すんだよな

お前のとこではプログラマへのSQL指導までDBAの仕事なんだな
まあがんばれや
311 :
NAME IS NULL
2016/03/26(土) 06:42:46.95 ID:???
テーブル全体のdatatime2の列、すべてのレコードに対して+3時間とか処理を入れたいのですができますか?
312 :
NAME IS NULL
2016/03/26(土) 07:15:32.67 ID:???
>>305
いきなりunionだとかageと型が異なる'未取得'を指定するって、DBAならではの何か理由があってのことなのかな。
よければ理由を教えて欲しい。

>>309
> ageがNULLになってればいいんなら、UNIONしないでもCASE式でも使えば良いだけじゃないのか
まったくもってそのとおりだと思うけど、DBA様の回答が気になるところ。
313 :
NAME IS NULL
2016/03/26(土) 07:20:02.26 ID:???
>>311
datetime2 ってことはSQLServerなのかな。
update テーブル set 列 = dateadd(hour, 3, 列);

参考:https://msdn.microsoft.com/ja-jp/library/ms186819(v=sql.120).aspx
314 :
NAME IS NULL
2016/03/26(土) 07:27:00.53 ID:hsf+0Rn0
>>312
俺が言った回答を別人が同じことを言ってるな。

正確にはunion allにしとけよ。
実際には重複しないが、重複排除処理が走る可能性があるから。

俺がおまえが馬鹿にしてる人間だよ。
315 :
NAME IS NULL
2016/03/26(土) 07:28:41.46 ID:hsf+0Rn0
>>311
そんなの質問することか?
316 :
NAME IS NULL
2016/03/26(土) 07:36:45.81 ID:eI6+AUug
いいか?unionじゃなくてunion allだぞ、やっぱdbaすげーなー
317 :
NAME IS NULL
2016/03/26(土) 07:38:57.20 ID:???
>>314
>>305ですでにunion allと書かれてるわけで、それをunionに変えろという意図は全然ないよ。
unionを使うという発想がおかしいといっている。
318 :
NAME IS NULL
2016/03/26(土) 07:43:01.96 ID:hsf+0Rn0
>>309
SELECT句のCASEはあまり勧めない。

SQL文そのものに条件分岐を書くべきではない。

とあるフレームワーク使って、動的に変更できないと思い込んでこうする人がいるんだよね。

まあこういうフレームは個人的にあまり好きではない。

実際に発行されるSQLがぱっと見わからないから、可読性に問題がある。
319 :
NAME IS NULL
2016/03/26(土) 07:45:27.19 ID:hsf+0Rn0
>>316
union allの回答を最初にしたのは、おまえがいうdba様の俺だぞw
320 :
NAME IS NULL
2016/03/26(土) 07:51:58.99 ID:hsf+0Rn0
union allだとコストが若干上がるかもしれないが、コストより可読性を俺は優先する。
321 :
NAME IS NULL
2016/03/26(土) 08:51:22.96 ID:???
>>315
ゴタクはいらねーから、わかんねーならすっこんでろ
322 :
NAME IS NULL
2016/03/26(土) 08:53:36.69 ID:???
>>313
ありがとうございます!
323 :
NAME IS NULL
2016/03/26(土) 09:51:42.64 ID:???
・DBMS名とバージョン
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だけで「欲しい結果」で示したような表が取れるならそれに越したことはないという次第で質問しました
324 :
304
2016/03/26(土) 10:57:48.94 ID:???
javascriptとphp使ってます。
クリックするとajaxでサーバからデータを取得する。
具体的に書きます。

ページを開いた時に
・全てのid,nameの一覧を表示したい
・クリックした時に年齢(age)を取得して表示したい(クリックした箇所のみ年齢を表示したい)

レコードの量が多くなるのと必要なidとnameの該当する人のageだけを表示させたいので
ageだけはページを開いた時に取得せず、
名前(name)をクリックした時にその都度取得して表示するようにしたいんです。一度idとnameだけを全部取得してから
なのでページを開いた時にデフォルトでid=1のageが表示がしたいというわけです。
325 :
304
2016/03/26(土) 10:59:16.63 ID:???
>一度idとnameだけを全部取得してから

ミス。
ここ文章書いている時の消し忘れなので削除して読んでください
326 :
NAME IS NULL
2016/03/26(土) 11:21:09.02 ID:???
もう回答あったろ。それじゃあダメなのか、それとも理解できなかったのかくらい書いたらどうだい?

>ageだけはページを開いた時に取得せず、

1回で取得したいって最初に言っていたのと違うし。
327 :
NAME IS NULL
2016/03/26(土) 12:47:55.89 ID:n84GU1et
dba出番だぞ
328 :
NAME IS NULL
2016/03/26(土) 14:11:27.72 ID:wrqpigF3
>>327
俺はPM、PL、SE、PGでかつDBAというよりDBエンジニアだ。
329 :
NAME IS NULL
2016/03/26(土) 14:19:03.96 ID:???
>>320
union all のほうが速いよ
重複判定をすっとばせるから
330 :
NAME IS NULL
2016/03/26(土) 16:55:00.46 ID:???
>>323
>>5 といいたいところだけど、
予想するに、Calcのピボットテーブル使うのが一番近そう。技術的にも環境的にも。
331 :
NAME IS NULL
2016/03/26(土) 16:57:34.73 ID:???
>>324
id=1のageをデフォルトで表示させたいという要求を、
クリックハンドラで使うことになるであろう関数をロード時に呼び出すことで満たせばよいわけで。
332 :
NAME IS NULL
2016/03/26(土) 21:08:56.51 ID:eI6+AUug
>>328
いや自己紹介はいいんだよw質問に答えてやれw
333 :
NAME IS NULL
2016/03/26(土) 22:41:44.77 ID:mwQ0NV9b
設計、方式スレじゃないだろw

宿題か個人作品に付き合う必要はない。

自分で考えろよ。

俺は気まぐれに応える程度で、やばそうなやつは指摘しているだけ。

変なクセがついて、あちこちで変なSQLを書かれたら迷惑だからな。
334 :
NAME IS NULL
2016/03/26(土) 22:53:49.63 ID:???
言い訳考えるほうが回答するより大変だろうに。おつかれさま。
335 :
NAME IS NULL
2016/03/27(日) 00:38:58.82 ID:ZAl/m3zR
相談しろと言ってみたり自分で考えろと言ってみたり難儀なdbaだな
336 :
NAME IS NULL
2016/03/27(日) 04:26:51.36 ID:???
dbaって何の略?
337 :
NAME IS NULL
2016/03/27(日) 09:40:23.69 ID:???
DBA 【 DataBase Administrator 】
338 :
NAME IS NULL
2016/03/27(日) 14:33:58.18 ID:???
アクセスの拡張子かとw
339 :
NAME IS NULL
2016/03/27(日) 19:38:53.10 ID:???
毎日、データ格納してるテーブルが肥大化してきたので1ヶ月以上前のデータをアーカイブテーブルに分けたいのですが、手順とかどう検索したら良いですか?
340 :
NAME IS NULL
2016/03/28(月) 02:38:43.77 ID:Yr8T7iBH
>>334
他人の批評をしているおまえは何なの?
341 :
NAME IS NULL
2016/03/28(月) 02:40:06.63 ID:Yr8T7iBH
>>339
どういうふうにデータを持っているのか説明してくれないとなんとも言えない。
342 :
NAME IS NULL
2016/03/28(月) 13:01:39.16 ID:???
>>318
> SELECT句のCASEはあまり勧めない。
>
> SQL文そのものに条件分岐を書くべきではない。

こんな「俺が嫌いだからダメ」レベルの話をされても困惑するわ
343 :
NAME IS NULL
2016/03/28(月) 13:03:36.53 ID:???
>>303
で、そのDBAさんは、開発プロセスのどこから関わり初めて、どこまでつきあうんですか?
それと、一人のDBAは何人のプログラマを担当するんですか?
344 :
NAME IS NULL
2016/03/28(月) 13:04:43.93 ID:???
>>340
回答してる人
345 :
NAME IS NULL
2016/03/28(月) 13:20:08.69 ID:???
>>339
手順も糞もあるかよ。

INSERT INTO hoge_archive SELECT * FROM hoge WHERE hoge_date < '一ヶ月前の日付';
DELETE FROM hoge WHERE hoge_date < '一ヶ月前の日付';
346 :
NAME IS NULL
2016/03/28(月) 13:28:33.86 ID:???
>>324
> レコードの量が多くなるのと必要なidとnameの該当する人のageだけを表示させたいので
通信時間が深刻になるほどのデータ量(取得後)だとするなら、それはUX的にやるべきではない。
大抵はHTTPのレスポンスはgzip圧縮されているので、少々データが増えたくらいは問題ない。

> ageだけはページを開いた時に取得せず、
> 名前(name)をクリックした時にその都度取得して表示するようにしたいんです。一度idとnameだけを全部取得してから
最初から、id,name,ageを取得しておけば、Ajaxも不要。
347 :
NAME IS NULL
2016/03/28(月) 14:00:19.72 ID:???
DBAって、導入・メンテナンス・保守する人のことでしょ
348 :
NAME IS NULL
2016/03/28(月) 14:21:19.00 ID:???
ソートが不要ならunionじゃなくてunion allがいいよ、ということも知らないようなプログラマがいるなら、
DBAが後から網羅的にコードを読んで指摘するんじゃなくて、そいつを教育した方が早いのでは。
349 :
NAME IS NULL
2016/03/28(月) 14:25:16.08 ID:???
× ソートが不要
○ 重複の除去
350 :
NAME IS NULL
2016/03/28(月) 14:40:24.89 ID:vRoW12QA
重複排除になる場合、またグループ化されるとき、内部処理の都合上、ソートされるが、SQLの定義ではORDER BY指定しないと並び順は保証しないからな。
351 :
NAME IS NULL
2016/03/28(月) 14:45:14.94 ID:vRoW12QA
プログラマはデータベース利用者で、データベースを理解したうえで使用しなくてはいけない。

以下はあるサイトの引用

情報資源およびデータベースを計画・設計・構築・運用・管理する業務に従事し、次の役割を果たす。

データ管理者(DA)として、情報システム全体のデータ資源を管理する。データベース管理者(DBA)として、基幹データベースの構築と維持を行う。個別システム開発の各工程(計画・分析・設計・運用・保守)において、データベース関連の技術支援を行う。

(「情報処理推進機構:情報処理技術者試験センター:情報処理技術者試験制度:制度の概要」から引用)
352 :
NAME IS NULL
2016/03/28(月) 15:16:04.19 ID:???
ORMとか使われると大変でしょうが、DBAさん頑張ってくださいね
353 :
NAME IS NULL
2016/03/28(月) 15:18:51.98 ID:???
書かれたクエリ(コード)を見てからじゃ、変更の工数が多すぎる。
設計段階でSQL書かせて、それをレビューせねば。
354 :
NAME IS NULL
2016/03/28(月) 15:23:46.77 ID:vRoW12QA
>>352
O/Rマッパーのせいで変なSQLを書かれる傾向があるから嫌だね。

結局、アプリケーションからクソSQLを隠しているだけになりかねない。

ストアドでも汚いSQLを隠すためにストアド化するやつもいるからな。
355 :
NAME IS NULL
2016/03/28(月) 15:27:36.83 ID:???
>>348
今のところそういう人はここに出てきてないから安心だね
356 :
NAME IS NULL
2016/03/28(月) 16:42:34.87 ID:???
>>355
君のことなんだが。
357 :
NAME IS NULL
2016/03/28(月) 16:45:27.70 ID:???
>>354
プルリクあったら、全コードDBAがレビューすんの?
358 :
NAME IS NULL
2016/03/28(月) 16:54:25.18 ID:vRoW12QA
レビューってチェックとは違うからな。
359 :
NAME IS NULL
2016/03/28(月) 16:57:02.65 ID:???
そろそろ別にスレ立てるかなんかしてどっか行ってくれ
360 :
NAME IS NULL
2016/03/28(月) 17:06:20.27 ID:???
>>333
> 変なクセがついて、あちこちで変なSQLを書かれたら迷惑だからな。
そうだな

消えろ、お前が
361 :
NAME IS NULL
2016/03/28(月) 17:32:30.78 ID:???
DBAは設定ファイルのパラメータでもいじってろ
362 :
NAME IS NULL
2016/03/28(月) 18:09:54.01 ID:???
「ここ数日このスレにレスしてる奴らの中で、俺様が一番できる」と勘違いする奴がたまにでてきて居座る。

この現象に何か名前がついてませんかね。
363 :
NAME IS NULL
2016/03/28(月) 18:22:13.97 ID:???
>>356
このスレって俺とあなたしかいないの?ならあなたの自演が相当すごいってことに
364 :
NAME IS NULL
2016/03/28(月) 18:23:49.53 ID:???
>>362
ミサワ病
または
日課の乳首いじりしてたら突然ポロっと取れて病院行ってきた病
365 :
NAME IS NULL
2016/03/28(月) 18:32:52.76 ID:???
>>362
一人で始められるお山の大将とその取り巻きごっこ
366 :
NAME IS NULL
2016/03/28(月) 18:33:37.11 ID:W6YzWt9c
閑話休題

それではひきつづき「俺様が一番できる」をお楽しみください
367 :
NAME IS NULL
2016/03/28(月) 18:34:54.65 ID:???
>>363
「そういう人」はひとりいるじゃん。
それがわからないってことは、つまり君がそうとしか考えられない。
368 :
NAME IS NULL
2016/03/28(月) 18:38:18.37 ID:???
>>367
安価つけなよ
369 :
NAME IS NULL
2016/03/28(月) 21:30:52.33 ID:???
>>345
うおおお ありがとうございます!
調べててもパーティションだかパンティだかそんな内容しかでてこなくて困ってました。
これで寝れます
370 :
NAME IS NULL
2016/03/28(月) 21:41:02.42 ID:Yr8T7iBH
>>369
自作自演っぽいなw
371 :
323
2016/03/29(火) 09:52:52.90 ID:???
>>330
解決しました アドバイスありがとうございました
372 :
NAME IS NULL
2016/03/29(火) 10:34:45.13 ID:???
>>368
ID:hsf+0Rn0 だよ。
いちいち間違いを指摘するのも時間の無駄なんで指摘しないが、こいつの駄目さ
かげんがわかんないなら君も同レベル。
373 :
NAME IS NULL
2016/03/29(火) 11:08:07.43 ID:???
SQLServerスレが見つからないので、こちらで質問します。
他の端末で修正中のダーティデータが紛れてもいいから、とり急ぎの登録商品の一覧を

SELECT コード,品名
FROM 商品マスタ WITH (NOLOCK) WHERE 〜 ORDER BY 〜

という風に一覧取得したうえで、各レコードごとに、それがダーティデータ(ロックされている行)かどうか判別したいのですが
どうやったらいいじょうか。

気持ち的に

SELECT コード,品名,(case when この行がロックされているか then 1 else 0 end) as ダーティフラグ
FROM 〜

にしたいのですが
374 :
NAME IS NULL
2016/03/29(火) 12:52:10.03 ID:???
>>372
>>312が俺
375 :
NAME IS NULL
2016/03/29(火) 12:55:26.17 ID:???
>>374
DBA様以外の俺らが喧嘩しても意味なかったな。
謝るよ。
376 :
NAME IS NULL
2016/03/29(火) 12:56:46.02 ID:???
>>373
Microsoft SQL Server 総合スレ 10
http://echo.2ch.net/test/read.cgi/db/1385363382/
377 :
NAME IS NULL
2016/03/29(火) 13:16:09.98 ID:???
>>371
よかった。おめでとう
378 :
NAME IS NULL
2016/03/29(火) 16:38:18.72 ID:???
>>373
RDBMSの更新時に発生するロックのことなら、それは大抵一瞬なのでそんなこと画面に表示する意味ない。

そうではなくて、
1. 誰かがある商品の編集を開始する(ということをマークする)
2. 編集中は他ユーザは参照のみで編集はできない
という制限をかけるための「ロック」なら、別途「編集中フラグ」などで管理する必要がある。
379 :
NAME IS NULL
2016/03/29(火) 16:49:05.01 ID:???
最初に表示するときにロックかけてselectするつもりなんじゃね?
380 :
NAME IS NULL
2016/03/29(火) 16:52:55.87 ID:???
>>373
その書き方だと、uncommitedなデータを意図的に読み出したいということにもなるんだけど
あえてそういうトランザクション分離レベルを指定しているのか、
それとも他端末のトランザクション中はとにかくダーティデータが混ざってしまうと勘違いしているのかどちら?
381 :
NAME IS NULL
2016/03/29(火) 17:02:49.18 ID:???
>>379
その発想はなかった
382 :
NAME IS NULL
2016/03/29(火) 17:04:12.93 ID:sfT27TYg
>>373
そもそもロックされてるデータがSELECT時に分かって編集中と表示しても、そのときのロックの状態しか分からないのでは意味がない。

編集中ではないものが次の瞬間、ロックされてたりもするだろうし。
383 :
NAME IS NULL
2016/03/29(火) 17:09:40.31 ID:sfT27TYg
いったん対象レコードをSELECTして、1レコードずつロックして、ロックできるかできないかで判定はできるだろうけど、アホな設計だな。

そんなことするなら、昔のSQL ServerみたいにSELECTしただけでロックする設定で運用しろよ。
384 :
NAME IS NULL
2016/03/29(火) 17:35:37.11 ID:???
で、画面開きっぱなしで何時間もロックし続けると
385 :
NAME IS NULL
2016/03/29(火) 18:13:47.31 ID:???
特に妙案はなさそうならばアプローチを変えて

あらかじめ商品マスタテーブルにロックフラグ(Boolean型)を追加したうえで
ロックする側(トランザクションで括った中)で、ロックフラグを
まず、商品マスタテーブル
ロックフラグ
386 :
NAME IS NULL
2016/03/29(火) 18:15:46.03 ID:???
書きかけでボタン押してしまいました、すみません。

ロックする側(トランザクションで括った中)で

・BEGIN TRANS直後にロックフラグを立てる
・COMMIT直前にロックフラグを戻す
・何かトラブルあってROLLBACKしたら、ロックフラグは勝手に戻る

参照側はダーティなロックフラグを読み取って、ロックされてるかどうか見る

んで大丈夫ですかね
387 :
NAME IS NULL
2016/03/29(火) 18:27:47.11 ID:???
もう根本的に駄目
388 :
NAME IS NULL
2016/03/29(火) 19:46:42.60 ID:???
そもそも何をしたいのかいみふ
389 :
NAME IS NULL
2016/03/29(火) 22:20:39.74 ID:???
何をしたいか全くわからんが
自分でロックフラグを操作する気なら、ダーティリードしちゃ駄目
ロックフラグ操作が正しく取得できないから、自分でフラグ操作する意味がなくなる
390 :
NAME IS NULL
2016/03/29(火) 22:22:39.80 ID:???
なんとなく思ったが
いわゆる楽観的ロックで良いんじゃないかと
391 :
NAME IS NULL
2016/03/30(水) 07:11:29.15 ID:???
・数人が分担してマスターを編集

・編集中は排他的ロック
(お手つき判定は編集開始時点にやりたい)

・編集中の半端な状態でもレコード内容の確認はしたいが
 半端な状態(ダーティリード)であることは知りたい

・編集者のマシンがいきなり再起動しちゃっても
 「強制フラグ倒し」みたいな別処理をしないでいたい 

こんな要件です。
392 :
NAME IS NULL
2016/03/30(水) 07:13:48.27 ID:???
総レコード数が1000件として
10人が別々のレコードを編集してたとき(排他ロック)
参照端末から全件抽出な操作したとき

・排他ロック分を除いた 990件 だけが出てくるのではNG
・編集中かどうかが分からない状態で 1000件 抜けてきてもNG
393 :
NAME IS NULL
2016/03/30(水) 07:35:00.15 ID:???
COMMIしないかぎりフラグの変更が他のセッションに見える保証はないんだから
ダーティリードで排他制御なんて一般的には無理。
394 :
NAME IS NULL
2016/03/30(水) 07:41:48.05 ID:9ZUEATtw
>>391
> ・編集者のマシンがいきなり再起動しちゃっても
>  「強制フラグ倒し」みたいな別処理をしないでいたい 
これがやりたければ編集開始時に別テーブルにロックレコード作るのが楽だと思うけど
その上で排他ロックとかread uncommittedとかせずに

> ・編集中の半端な状態でもレコード内容の確認はしたいが
編集中のプロセスは一項目毎に変更をコミットするとか
ロールバックしたい時はロックテーブルに保存された値を戻すのがいいのかな

何のためにこんなややこしい事をする必要があるのかいまいち分からんけど…
395 :
NAME IS NULL
2016/03/30(水) 09:35:21.44 ID:???
>>393
軽く試した限りだと、参照側が WITH (NOLOCK) 付けておけば直ちに変更が見えたのですが
確かに、それは「たまたま」であって、サーバーが保障してるわけじゃないですよねぇ

>>394
別テーブルにロックレコード作るとして
編集者のマシンが異常停止すると、それ残ったままになってしまいませんか?
起動時に自マシンのロックレコードの残骸を自動削除するような処理はやりたくありません。
(PCが壊れて起動できなくなった場合に、シス管がロックレコードを強制削除するような保守するのは避けたい)
396 :
NAME IS NULL
2016/03/30(水) 10:36:29.26 ID:???
>>395
> (PCが壊れて起動できなくなった場合に、シス管がロックレコードを強制削除するような保守
以外のやり方はないのか?

SQL Serverのことはよく知らないが、編集中のセッションIDだかプロセスIDだかを保存しといて、
つぎに誰かがロックを獲得しようとしたときに、そのセッションだかプロセスが存在するかどうか
チェックして、なければDELETEするとか。
397 :
NAME IS NULL
2016/03/30(水) 12:19:08.48 ID:uLjgqC6J
>>395
なんだよロック残したいのかと思ったよw
398 :
NAME IS NULL
2016/03/30(水) 12:52:41.11 ID:???
どんだけ読解力ないんだよ
399 :
NAME IS NULL
2016/03/30(水) 13:59:54.57 ID:???
データベースの「ロック」「「トランザクション(レベル)」「ダーティリード」と
機能要件の「編集中ロック」「変更途中の中途半端な状態」をごっちゃにするな。

「変更途中の中途半端な状態」と「ダーティリード」については、以下のことをよく考える必要がある。

以下、時系列:
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など存在しないというケース。
400 :
NAME IS NULL
2016/03/30(水) 14:11:48.02 ID:???
そんなボロいPC使って作業すなよ w
401 :
NAME IS NULL
2016/03/30(水) 14:13:22.06 ID:???
内容Bが欲しいのでなく、「そのレコードはUser1が弄ってる最中」、というステータスが欲しいのですが
まだ伝わらないですか?
402 :
NAME IS NULL
2016/03/30(水) 14:22:20.82 ID:???
>>401
そんなの最初からわかってるわ。
お前が「ダーティリード」と特に明記してるから、その意図を明確にしようとしてるだけだ。
403 :
NAME IS NULL
2016/03/30(水) 14:25:03.57 ID:???
もう相手しなくていいんじゃないかな
404 :
NAME IS NULL
2016/03/30(水) 15:10:06.97 ID:???
>>401
横からだが
そのステータスをを、DBのロック機構によって判断しようとしてるんだけど
>>402はそれは機能要件だろうと言ってる
つまりDBのロック機能を使うんじゃなくて、自分でフラグ管理して
ダーティリードするなって話
405 :
NAME IS NULL
2016/03/30(水) 16:03:43.31 ID:???
俺の>>378,396がガン無視されてるんですけど。
406 :
NAME IS NULL
2016/03/30(水) 16:30:05.51 ID:???
>>391
> ・編集中の半端な状態でもレコード内容の確認はしたいが
> 半端な状態(ダーティリード)であることは知りたい

編集前の状態ではだめなんですか
407 :
NAME IS NULL
2016/03/30(水) 19:39:01.73 ID:9ZUEATtw
実は一般的な>>390で全く問題ないのに

「編集画面を開いたら対象レコードをロックしなければいけない」
という強い勘違いのせいで

話が面倒な事になってるだけの気がしてきた
408 :
NAME IS NULL
2016/03/30(水) 20:19:30.02 ID:???
>>395
> (PCが壊れて起動できなくなった場合に、シス管がロックレコードを強制削除するような保守するのは避けたい)
どんなアプリ使おうとしてるのか知らんけど、PCがダウンしたのか担当者がロックしたまま帰宅しちゃったのかを区別する仕組みがいることはわかるよな?
よくやる手は
30分に1回サーバーにアクセスしないと脅しを入れといて30分越えてたら問答無用でロック無効にする
とか
サーバー側のプログラムとクライアントが定期的に通信してて通信が途絶えたらロック解除する
とかかな

あと、お前の要件だとダーティリードとかは忘れた方がいい
409 :
NAME IS NULL
2016/03/30(水) 23:08:41.16 ID:???
・DBMS名とバージョン
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件

どうしてなのでしょうか?
410 :
NAME IS NULL
2016/03/30(水) 23:26:22.18 ID:???
まだpostgres95使ってんのかよ、と思ったw
411 :
NAME IS NULL
2016/03/31(木) 00:21:27.86 ID:???
>>409
何とか見つけることができました。
select * from suuji
where suuji = to_number(to_char(to_date('20150510','YYYYMMDD')-5,'YYYYMMDD'),'99999999');

こんなにキャストしなければいけないのでしょうか・・・
to_numberで日付を直接することはできそうにないのでこうなるの?
412 :
NAME IS NULL
2016/03/31(木) 00:46:09.39 ID:???
>>409
suujiじゃねーんだよ、numとかにしろや
413 :
NAME IS NULL
2016/03/31(木) 01:06:05.98 ID:???
>>409
to_char(num,'FM99999999')

date型にしてないのは何か理由があるって事でいいのかな。
414 :
NAME IS NULL
2016/03/31(木) 01:06:23.57 ID:???
あ、numにしちゃった。suujiで。
415 :
NAME IS NULL
2016/03/31(木) 03:34:46.70 ID:???
なんでそもそも項目を数値型にしてんの?
416 :
NAME IS NULL
2016/04/02(土) 23:09:48.78 ID:???
■DBMS:SQLServer 2008

商品マスタ(商品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毎の販売金額を取得する方法はございますでしょうか?
417 :
NAME IS NULL
2016/04/02(土) 23:21:05.63 ID:???
>>416の続き

現状は、
店舗CD IN ('000000', 指定店舗CD) AND 販売地域 IN ('000', 指定販売地域)で取得 ⇒
取得した行配列を優先順位の通りにソート ⇒ 
ループで回して商品コードが重複する場合に優先度が低いものを削除

という流れで行っているのですが、ループで回して削除する箇所で時間が掛かっております。
SQLで取得することで時間を減らせれればと考えております。

宜しくお願いいします。
418 :
NAME IS NULL
2016/04/03(日) 00:20:11.82 ID:???
試してないけど、こんなんでいけるんじゃね?

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になったんで省略。パターンは同じ。)
419 :
NAME IS NULL
2016/04/03(日) 00:42:07.03 ID:???
(店舗CD = '指定店舗CD' or 店舗CD = '000000')
and (販売地域 = '指定販売地域' or 販売地域 = '000')

max(店舗CD + 販売地域)をとればいいと思う
420 :
416
2016/04/03(日) 00:53:37.56 ID:???
>>418
ありがとうございます
無事いけました。
SQLは長くはなりますが、パターン部分は流用できるのでプログラムソース上は思ったより
コンパクトに出来ました。

なるほど"UNION ALL"で優先順位通り連結すればいけますね
AND NOT EXISTSの連結で綺麗にパターン化できますし

データファイルをオンラインで配布する関係でレコード数減らすために、
こういうデータ設計になってるのですが、その後の処理で困っていたので助かりました。

どうもありがとうございました。
421 :
416
2016/04/03(日) 00:59:01.68 ID:???
>>419
どうもありがとうございます。
なるほど、連結+MAXは盲点でした
文字列長固定なので、連結した後にMAXでもいけますね

こちらについても試してみます

色んな発想が得られて感謝してます。
422 :
NAME IS NULL
2016/04/03(日) 02:07:06.88 ID:l98rC8er
なんでこういうSQLになっているのかコメントを残すようにしてね。

それと各SELECT文にORDER BYを入れておいた方が処理順を把握できる。

処理途中で何か問題があったときにどこまで処理したか追跡しやすくなってテスト、運用が楽になる。
423 :
416
2016/04/03(日) 02:44:16.19 ID:???
>>422
アドバイスありがとうございます

他のソースでこういうSQLはしていないので、
修正前の取得方法と今回の修正後の取得方法について
第3者が分かるように理由込みでコメント残しておきました

ORDER BYの件参考になります。
検索結果画面等で表示順が絡む箇所でしかORDER BYを使ってなかったと思います。
動くことに重視しがちで、デバッグ等や運用についての意識が薄かったのでその辺り意識していきます。
424 :
NAME IS NULL
2016/04/11(月) 15:43:31.61 ID:???
SQLServerですが、

SELECT *
FROM 売上
WHERE 商品コード IN ('A','B','C')
AND 日付 Between '2015/01/01' and '2015/12/31'

なSQL文の処理速度を上げたい場合、どのようなインデックスを貼るといいですか。
425 :
NAME IS NULL
2016/04/11(月) 16:08:26.66 ID:???
日付にはればいいんじゃねーの
426 :
NAME IS NULL
2016/04/11(月) 16:47:46.81 ID:???
>>425
稼働して1年以内なら全く意味なし
2年経って選択率1/2になるが、table scanが選択されるかもしれない
10年くらい稼働すると意味がでてくるかもレベル
427 :
NAME IS NULL
2016/04/11(月) 16:54:21.79 ID:???
20年近くのデータがあって
レコード件数は1000万件ちょっとです

SELECT のところは実際には SUM ったりするわけですが
レスポンスを向上させる良い手段はないかと思い
428 :
NAME IS NULL
2016/04/11(月) 16:57:05.42 ID:???
>>427
とりあえずチューニングアドバイザーに聞いてみる
429 :
NAME IS NULL
2016/04/11(月) 17:14:52.22 ID:???
特に複雑なことをする必要もないと思うけど、それでもそのクエリが問題になるのなら
パーティショニングかマテリアライズドビューか式インデックスあたりを検討してもいいかもね。
430 :
NAME IS NULL
2016/04/11(月) 17:42:20.54 ID:???
>>427
> 20年近くのデータがあって
> レコード件数は1000万件ちょっとです
先に言え
まぁ、1000万件くらいだったらたいしたことない場合もあるが

> SELECT のところは実際には SUM ったりするわけですが
先に言え

> レスポンスを向上させる良い手段はないかと思い
過去のデータを毎回再計算する必要が本当にあるかどうか考える
また、生データを毎回SUMする必要があるのか考える
例えば、mothlyで商品コード毎のサマリを事前にしておくとか
431 :
NAME IS NULL
2016/04/11(月) 18:03:58.99 ID:???
年月で集計しても500万件にしか減らないんですよ
平均すると、月に2回しか売れてない商品だらけみたいで
432 :
NAME IS NULL
2016/04/11(月) 18:13:25.14 ID:???
>>431
それならどうしたって遅くなるわな
433 :
NAME IS NULL
2016/04/11(月) 18:31:49.14 ID:???
20年近くのデータ期間で1000万件なのに、年月で集計すると500万件?
どゆこと?
434 :
NAME IS NULL
2016/04/11(月) 18:45:07.74 ID:???
> 年月で集計しても500万件にしか減らないんですよ
> 平均すると、月に2回しか売れてない商品だらけみたいで

ちょっとよくわからんな
年500万件だとすると、月40万件ちょい
取り扱い品目が20万以上あるということか?
435 :
NAME IS NULL
2016/04/11(月) 19:03:32.12 ID:???
select * from 注文 -- 1000万
select * from 注文 group by 商品, 注文年月 -- 500万
436 :
NAME IS NULL
2016/04/11(月) 19:18:17.25 ID:???
商品の入れ替わりもすごく激しいのかもしれないなぁ。
端折りすぎでしょ。
437 :
NAME IS NULL
2016/04/11(月) 21:38:54.95 ID:???
>>434
はい、ずばりそのとおり
商品登録は30万件ほどです
438 :
NAME IS NULL
2016/04/11(月) 21:42:40.23 ID:???
なら商品コードのindexが優先されるようなクエリを試してみるのがいいんじゃね?
INやめて商品コード毎のクエリに分割してみるとか。
439 :
NAME IS NULL
2016/04/12(火) 02:44:01.02 ID:???
そのテーブル主キー(候補キー)はないのか?
実際に早くしたいSQLはどれなんだ?
440 :
NAME IS NULL
2016/04/12(火) 03:41:18.33 ID:???
>>437
> はい、ずばりそのとおり
クイズはいいからずばり仕様を明確にしていただけませんかね
441 :
NAME IS NULL
2016/04/12(火) 07:48:25.36 ID:???
俺だったら品番別データにする
フィールドに前年度売上とか当月売上とかを作って持たせるそうすればデータ件数は激減すると思う
442 :
NAME IS NULL
2016/04/12(火) 18:56:07.21 ID:???
以下のような指名、給料、月があるテーブルから、各月の一番給料高い人を抽出したいのですが、どうすれば良いのでしょうか。

指名 給料  月&#160;
AAA 250000 1&#160;
BBB 350000 1&#160;
CCC 300000 1&#160;
AAA 150000 2&#160;
BBB 280000 2&#160;
CCC 400000 2&#160;
AAA 300000 3&#160;
BBB 150000 3&#160;
CCC 200000 3&#160;

求める結果
指名 給料  月&#160;
BBB 350000 1&#160;
CCC 400000 2&#160;
AAA 300000 3&#160;
443 :
NAME IS NULL
2016/04/12(火) 19:20:31.11 ID:???
444 :
NAME IS NULL
2016/04/12(火) 20:01:57.45 ID:???
>>443
join使わずにできませんか?
445 :
NAME IS NULL
2016/04/12(火) 20:39:29.70 ID:???
>>444
join使うのが嫌な理由は?
446 :
NAME IS NULL
2016/04/12(火) 22:39:33.71 ID:???
>>444
よくある質問とその回答なんですよ。
447 :
NAME IS NULL
2016/04/13(水) 00:04:12.75 ID:???
SQLSERVERならROW_NUMBER() OVER 〜 使えばできるが。
448 :
NAME IS NULL
2016/04/13(水) 00:34:45.71 ID:???
>>445
複雑になっていくと可読性が悪い気がしまして。
>>446
王道的な書き方なんですね

>>447
サンプリングして頂けませんでしょうか!
449 :
NAME IS NULL
2016/04/13(水) 00:44:10.37 ID:???
>>448
join複雑と思うならSQL 触るのやめた方がいい
450 :
NAME IS NULL
2016/04/13(水) 01:03:33.49 ID:???
>>448
SQLSERVERなんですか。
451 :
NAME IS NULL
2016/04/13(水) 01:44:09.01 ID:???
join前提でテーブル設計しないとすごいものが出来上がる気が
452 :
NAME IS NULL
2016/04/13(水) 02:48:48.03 ID:???
超がつくほどの初心者にとってはjoinがたまらなく複雑に見えることもあるだろうけれど
それが気のせいだったと気づくのにさほど時間はかからないかと

ただ、初心者でもないのにjoinは複雑過ぎて保守できないなんていう人もごくまれにいるようなので
そうはならないでねと
453 :
NAME IS NULL
2016/04/13(水) 07:14:37.61 ID:???
joinがいやならストアドでも作れば
454 :
NAME IS NULL
2016/04/13(水) 14:54:14.98 ID:???
>>442
こちらjoinを使い
>>4で対応は出来ましたが、

求める結果
最高給料者 給料 最低給料者 給料 月
BBB 350000 AAA 250000 1
CCC 400000 AAA 150000 2
AAA 300000 BBB 150000 3

このように出すにはどうすればよいですか?
455 :
NAME IS NULL
2016/04/13(水) 15:06:47.66 ID:???
さぶくえり
456 :
NAME IS NULL
2016/04/13(水) 15:23:03.04 ID:???
>>454
maxができたんだから…(・ω・`)
457 :
NAME IS NULL
2016/04/13(水) 16:07:37.76 ID:sVoHcofV
検索中に他のセッションが更新しないデータなら、T-SQLのバッチでもなんでもいいだろ。
458 :
NAME IS NULL
2016/04/13(水) 16:40:42.43 ID:???
最高給料者と最低給料者をどう分けますか?
459 :
NAME IS NULL
2016/04/13(水) 17:00:12.48 ID:???
最高と最低で同じ額の人が複数いたらどうすんの?
460 :
NAME IS NULL
2016/04/13(水) 17:02:04.09 ID:58GQfTRG
>>458
どう分けるってカラム名のこと?
461 :
NAME IS NULL
2016/04/13(水) 17:03:07.09 ID:58GQfTRG
風俗店で働いているのかな。
462 :
NAME IS NULL
2016/04/13(水) 17:08:38.96 ID:58GQfTRG
いま調べたら、SQL ServerでもSELECT句でサブクエリが使えるようだね。

いろいろやり方はあるけど、一つ一つ段階を踏んで考えていかないと、間違ったSQLを作って、間違いに気付かない状況になるよ。
463 :
NAME IS NULL
2016/04/21(木) 23:57:45.76 ID:???
環境:Access、またはSQL Server(LocalDB)

やりたいこと:
 長いテキスト型のフィールド[MEMO]が含まれるテーブルA(5000レコード程度)と、
短いテキスト型のフィールド[KEYWORD]が含まれるテーブルB(50レコード)があります。
 テーブルA.MEMO の文字列に含まれている、テーブルB.KEYWORDの文字列を検索して、
含まれる文字列(=テーブルB.KEYWORD)をリスト化したいと考えています。
 ただし、テーブルA.MEMOには、テーブルB.KEYWORD内の複数の文字列が含まれている
場合と、全く含まれていない場合があり、複数含まれている場合、テーブルA.MEMOに
最初に現れる文字列のみリスト化する(テーブルB.KEYWORDで最初に見つかった文字列、
ではない)という条件になっていて、うまいこと処理する手段が思いつかずにいます。

 このような場合、どんなSQLを組めば良いのでしょうか?
464 :
NAME IS NULL
2016/04/22(金) 00:19:41.69 ID:???
https://technet.microsoft.com/ja-jp/library/ms190184(v=sql.105).aspx
これを使って工夫することになるかなーと。
465 :
NAME IS NULL
2016/04/22(金) 04:18:08.10 ID:???
>>463
いちおう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なら行けるかもしれん
466 :
NAME IS NULL
2016/04/22(金) 10:20:56.23 ID:???
お恥ずかしい質問ですが…
ある列の何文字目のみを一致した文字がある場合、その文字に書き換えるっていうのはどうすればいいでしょうか?

123123123
の三文字目(3)を2に書き換えるということです。
467 :
NAME IS NULL
2016/04/22(金) 10:35:28.27 ID:???
何のdbよ
468 :
NAME IS NULL
2016/04/22(金) 10:38:27.19 ID:???
>>467
oracleです。
469 :
NAME IS NULL
2016/04/22(金) 10:41:01.50 ID:???
お前はまず>>1読んで質問側の要件満たせ
470 :
NAME IS NULL
2016/04/22(金) 10:43:50.04 ID:???
あ、テンプレあったんですね。失礼しました。
471 :
NAME IS NULL
2016/04/22(金) 10:49:52.78 ID:???
update テーブル
set フィールド1 = substr(フィールド1,1,2) + replace( substr(フィールド1,3,1),3,2 ) + substr(フィールド1,4)
where substr(フィールド1,3) = 3;

正規表現でやっちまうのがええんやろうけどね
472 :
NAME IS NULL
2016/04/22(金) 10:53:10.94 ID:???
>>1
環境 oracle 11.2
内容は>>466
です。ただ、数字はランダムなので…
473 :
NAME IS NULL
2016/04/22(金) 11:05:13.15 ID:???
>>ただ、数字はランダムなので…
条件出しきれてねーじゃねーかちゃんと書け
474 :
NAME IS NULL
2016/04/22(金) 17:02:10.57 ID:???
SQLServerだけど
たった数千レコードの更新に、アホみたいに時間がかかると思ったら
ロックエスカレーションなどという、お節介な機能が作動しやがるのか

デフォはAUTOで、積極的にエスカレートしていくんだよね?
速攻で無効にしてやったよ
475 :
NAME IS NULL
2016/04/22(金) 23:01:44.46 ID:???
ここはお前の日記帳
476 :
NAME IS NULL
2016/04/22(金) 23:59:23.40 ID:???
>>474
くゎしく
477 :
NAME IS NULL
2016/04/23(土) 22:49:07.85 ID:???
一応MySQL想定。

特に重要な意味を持つカラムというわけではないけれど、
AUTO_INCREMENTを指定して、レコードに通し番号をつけて管理を便利にするとする。

このカラム名を、複数のテーブルで同じ(あるいは同じような)名前にしたいとき、
どういう名前にするのが定番?
プログラミング界隈で変数名を i にしておけば、大体どの言語でもループだろう、みたいな。

今は仮に id としてるけど、これで知らない人が見ても、そう思うのかどうか分からなくて。
あと何らかの理由で id が使えない場合、第二候補は何がある?
478 :
NAME IS NULL
2016/04/24(日) 09:02:28.81 ID:???
単にidと言われても何のidなんやらさっぱり判りませんけど w
479 :
NAME IS NULL
2016/04/24(日) 10:57:38.59 ID:???
テーブル名が「なんちゃら」として
idだと、なんちゃら.id になるけど
なんちゃらidだと、なんちゃら.なんちゃらid になって冗長に思える
480 :
NAME IS NULL
2016/04/24(日) 11:05:07.74 ID:???
その上で、テーブル名にプロジェクトを示すプリフィクスがあったりするとさあ大変
481 :
NAME IS NULL
2016/04/24(日) 11:05:48.25 ID:???
スキーマの名前もかぶってたりしてな
482 :
NAME IS NULL
2016/04/24(日) 11:17:01.59 ID:???
先生、階層化がしたいです……
483 :
NAME IS NULL
2016/04/24(日) 11:51:24.03 ID:???
強いてあげるならやっぱりidになるかと。
O/RM界隈なんかの影響が強いかもしれないけどね。
484 :
NAME IS NULL
2016/04/24(日) 12:24:49.31 ID:???
ありがとう、
妥協かもしれないけど、そのままidで行くよ。
485 :
NAME IS NULL
2016/04/24(日) 16:27:50.96 ID:EHzEirzO
ただのIDはよくない。

テーブルの結合構文を想像しろ。

テーブル別名つけていると、id = id となって同じ意味のidに見えてしまう。
486 :
NAME IS NULL
2016/04/24(日) 16:34:49.55 ID:???
ただのIDが良くないというより、
正確には、同名を付けることが良くない?

同じ機能を持つものに、同じような名前をつけるって考え方は正しくとも、
全く同じ名前だとデメリットが大きいのかな。

あ、もちろん無機質な名前、短い名前は被りやすいというのは前提で。
487 :
NAME IS NULL
2016/04/24(日) 16:38:11.59 ID:EHzEirzO
record_idだったらまだ悪くはないと思うよ。
488 :
NAME IS NULL
2016/04/24(日) 16:41:20.97 ID:EHzEirzO
同じ意味のカラムに違う名前を付けるやつもいるからな。

業務として言葉が違うなら、そうなるのは当然だけど、そうじゃないのにカラム名が違うとか、やめてほしいわ。
489 :
NAME IS NULL
2016/04/24(日) 16:52:53.32 ID:???
JOINでidとidを使うやつはいないと思うけど
同じ名前なら USING(id) とか使えるやつもある
490 :
NAME IS NULL
2016/04/24(日) 16:57:32.89 ID:EHzEirzO
>>489
それはidに限った話ではないだろうが。
491 :
NAME IS NULL
2016/04/24(日) 17:00:10.86 ID:???
>>487
> record_idだったらまだ悪くはないと思うよ。
ほとんど意味のない命名にしか見えないが...
492 :
NAME IS NULL
2016/04/24(日) 17:47:23.74 ID:???
DB設計を語るスレが寂しそうにこちらを見ている
493 :
NAME IS NULL
2016/04/24(日) 18:06:25.13 ID:???
いろんなテーブルに同名カラムidがあるのは許されないが、その名前がrecord_idであるなら悪くは無いという理論。
これは語るスレでしっかり語って欲しいところ。
494 :
NAME IS NULL
2016/04/24(日) 19:46:00.39 ID:???
>>493
> これは語るスレでしっかり語って欲しいところ。
いらんわ
495 :
NAME IS NULL
2016/04/24(日) 20:14:28.97 ID:???
例えば社員テーブルのIDと部署テーブルのIDを両方record_idという名前にしたら
どの社員がどの部署に所属するかというテーブルはどう作る?
496 :
NAME IS NULL
2016/04/24(日) 20:25:08.09 ID:???
>>495
create table 所属 (
社員 int references 社員テーブル(record_id),
所属 int references 所属テーブル(reaord_id)
);
497 :
496
2016/04/24(日) 20:27:11.14 ID:???
typo
所属テーブル(reaord_id) ⇒ 所属テーブル(record_id)
498 :
NAME IS NULL
2016/04/24(日) 20:58:57.64 ID:???
まあ結局>>496みたいな設計が気持ち悪いと思うかどうかだけだろう
499 :
496
2016/04/24(日) 21:31:31.86 ID:???
>>498 の気持ちいい設計ってどんなの?
500 :
NAME IS NULL
2016/04/25(月) 12:03:04.06 ID:???
設計というより設計工程に入る前に決めておくべき命名規則の問題だな

個人的には多少冗長になっても「foo.foo_id」とかにしたい気はする
アプリ側のミスを減らすために冗長でも分かりやすい方を取りたい

けど、この手の半ば好みの問題的な話は正解を公の場で決めようとすると
不毛な宗教論争に陥りがちなので、チーム内で話し合って決定するか
あるいは部署や全社で共通のルールがあるならそれに従おうってことで
何にせよ一度採用した命名規則は明文化して全員で墨守するのが重要だよな
501 :
NAME IS NULL
2016/04/25(月) 12:18:10.60 ID:QbznyTMw
DB専門チームがやらないと本当はうまくいかない。

しかしなぜかDBAは開発が分からないことを理由にしているのか、テーブル名、カラム名を開発者に決めさせることがよくある。
502 :
NAME IS NULL
2016/04/25(月) 18:45:44.87 ID:???
スレタイ読めない奴がこれだけいるんだから
そら上手くいかないのも分る
503 :
NAME IS NULL
2016/04/25(月) 21:20:42.42 ID:???
>>500
あらゆるカラムにテーブル名をつけるって規則なら見たことがある
そしてそのテーブル名はイニシャルだか何だかを繋いだ謎の文字列
504 :
NAME IS NULL
2016/04/25(月) 21:31:24.09 ID:SbNuU5CK
やっぱりこういうどうでもいい話だと盛り上がるね
自転車乗り場のなんとかですかねw
505 :
NAME IS NULL
2016/04/25(月) 22:21:41.87 ID:???
学術的、技術的な裏づけがなくても語れるからな
506 :
NAME IS NULL
2016/04/25(月) 23:05:19.15 ID:???
そして白痴でも吐ける愚痴と皮肉だらけになるまでがテンプレ
507 :
NAME IS NULL
2016/04/26(火) 03:00:22.54 ID:???
DB設計を語るスレ 9 [転載禁止](c)2ch.net
http://echo.2ch.net/test/read.cgi/db/1444733172/
508 :
NAME IS NULL
2016/04/26(火) 07:07:51.82 ID:???
>>503
SELECT * する前提でフィールド名が重複しないように、だな
腐りきってる
509 :
NAME IS NULL
2016/04/26(火) 07:28:05.43 ID:HcQi1tAz
select * がいかんつーのはバインド変数使うpl/sqlやpro*cの話やで
select * 自体に何の罪もない
510 :
NAME IS NULL
2016/04/26(火) 14:07:41.48 ID:gStihLhi
>>508
テーブル名修飾をしないのは、ほぼありえない。
511 :
NAME IS NULL
2016/04/26(火) 14:24:30.73 ID:???
甘いな
JOINしまくった挙げ句に、さらっと SELECT * なプログラマーは未だに生息してる
512 :
NAME IS NULL
2016/04/26(火) 14:26:26.75 ID:???
ORMってそんな感じじゃないの?
しらんけど
513 :
NAME IS NULL
2016/04/26(火) 14:34:09.83 ID:gStihLhi
>>512
ORマッピングのことくらい調べてもの言えよ。
514 :
NAME IS NULL
2016/04/26(火) 14:36:32.32 ID:gStihLhi
>>511
SQLをまともに勉強したことがないやつがいるのか。

それは恐ろしいな。
515 :
NAME IS NULL
2016/04/26(火) 14:57:53.21 ID:???
>>513
ORMって全カラム持ってくるのが基本じゃないの?
しらんけど
516 :
NAME IS NULL
2016/04/26(火) 15:29:49.61 ID:gStihLhi
>>515
何言ってんのw
517 :
NAME IS NULL
2016/04/26(火) 15:44:20.91 ID:???
>>516
お前こそ何言ってんだかw
518 :
NAME IS NULL
2016/04/26(火) 15:54:03.02 ID:gStihLhi
ORマッピングを知らないのに、ORマッピングはこうだと語り、最後にORマッピングは知らないと言い放つ、変なやつ。
519 :
NAME IS NULL
2016/04/26(火) 16:10:11.54 ID:???
うぜーわ
よそでやれよ
520 :
NAME IS NULL
2016/04/26(火) 16:25:17.36 ID:???
>>511
それでも別に問題ないが?
521 :
NAME IS NULL
2016/04/26(火) 16:33:42.54 ID:???
こんなところで暇つぶしするのやめてくれよ
522 :
NAME IS NULL
2016/04/26(火) 16:45:40.32 ID:???
なんか>>485あたりから変な奴がいるからな
一人なのか複数なのかわからんが
523 :
NAME IS NULL
2016/04/26(火) 16:52:25.00 ID:gStihLhi
>>522
このスレは俺のスレッドだと言いたいわけか。
524 :
NAME IS NULL
2016/04/26(火) 16:57:04.46 ID:???
>>523
変なこと言う奴にそれ変だっていうと、このスレが俺のものになるのか?
どういうロジックだよ。
525 :
NAME IS NULL
2016/04/26(火) 17:04:34.63 ID:???
お前ら全員スレチなんだけど
526 :
NAME IS NULL
2016/04/26(火) 17:06:33.37 ID:???
それぞれのサイトで決められた命名規則ルールに従いなさい
それだけでしょ
527 :
NAME IS NULL
2016/04/26(火) 17:20:58.87 ID:???
という思考停止
528 :
NAME IS NULL
2016/04/26(火) 21:29:05.22 ID:???
>>511 みたいな奴は思考停止してくれてた方がマシ
529 :
NAME IS NULL
2016/04/26(火) 23:23:00.96 ID:gStihLhi
そもそもプログラム内のSQLでSELECT * はまずありえないだろ。
530 :
NAME IS NULL
2016/04/26(火) 23:38:14.49 ID:???
ありえないと断言できるほどに根拠はないな
経験則ではそうかもしれないが
531 :
NAME IS NULL
2016/04/26(火) 23:52:14.27 ID:???
ありえないとするには何らかの前提が必要だな。
その前提書かないことには変なこと書いてる人のままになるかと。
そしてそれは不本意でしょ?
532 :
NAME IS NULL
2016/04/27(水) 00:07:19.36 ID:???
select * 使いまくってたな
でもそれを受け取るホスト言語でバインド変数を自動生成する仕組みも作ってた
533 :
NAME IS NULL
2016/04/27(水) 00:58:00.39 ID:???
ストアド使わないの?
534 :
NAME IS NULL
2016/04/27(水) 01:14:40.29 ID:???
select *
使っちゃマズい状況なら使わない
使っても問題ない状況なら使う
そんだけ
535 :
NAME IS NULL
2016/04/27(水) 01:34:36.42 ID:xBVjkvde
まともプロジェクトならSQLのコーディング規約でSELECT * は禁止だし、

オラクルマスターでも結合を伴う場合は、テーブル名(別名).* にすると指導している。

このスレは初心者すぎるんだよ。
536 :
NAME IS NULL
2016/04/27(水) 02:10:45.73 ID:???
select * が禁止でテーブル名.*ならOKなんてプロジェクト見た事ないわ
537 :
NAME IS NULL
2016/04/27(水) 02:50:14.92 ID:???
もうこれネタだろ。それも面白くないほうの。
538 :
NAME IS NULL
2016/04/27(水) 10:11:45.42 ID:???
要するに

> オラクルマスターでも結合を伴う場合は、テーブル名(別名).* にすると指導している。

というのが唯一のよりどころな奴が暴れてると
539 :
NAME IS NULL
2016/04/27(水) 10:55:33.27 ID:???
SELECT *にしとけば、テーブルの定義が変わってもサーバサイドのコードを変更することなく
クライアントにまで変更された内容が伝わる、というメリットもある
540 :
NAME IS NULL
2016/04/27(水) 10:58:14.89 ID:???
え?SELECT * は普通に結構使うだろ

…EXISTSでな!


まあこの話はそろそろ終わりでいいだろ、質疑応答スレであって議論スレではないんだから
541 :
NAME IS NULL
2016/04/27(水) 11:41:47.95 ID:???
先ず隗より始めよ
542 :
NAME IS NULL
2016/04/27(水) 20:28:53.18 ID:???
あのさ
Oracleのテーブルに、SQLを格納したいんだけどさ、
シングルクォーテーション、ダブルクォーテーションが含まれている状態でInsertすることってできるの?
543 :
NAME IS NULL
2016/04/27(水) 20:32:50.87 ID:???
>>542
バイナリファイルですら突っ込めるのに何を言ってるんだよ...
544 :
NAME IS NULL
2016/04/27(水) 22:18:57.25 ID:???
>>542
プレースホルダ使おう、以上
545 :
NAME IS NULL
2016/04/28(木) 09:51:05.88 ID:???
何もねえよ
546 :
NAME IS NULL
2016/04/28(木) 10:00:54.96 ID:???
テーブルの存在確認をしたい場合、C#を使ってMySQLに対してcmd2文字列なら上手く行くのですが、cmd1だとエラーしました。
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文というのはどのデータベースに対しても同じように実行出来ると思っていたのですが、それは間違いですか?
547 :
NAME IS NULL
2016/04/28(木) 10:19:36.68 ID:???
ソフトでSQLにも方言がある。エラーならそこに原因書いてあるだろ。なんか使ってんじゃねーの
548 :
NAME IS NULL
2016/04/28(木) 10:23:23.23 ID:???
「SELECT 1 ELSE SELECT 0」こんなん通る?
549 :
NAME IS NULL
2016/04/28(木) 13:14:48.26 ID:???
>>546
SQLの規格への準拠度合いがデータベースによってまちまち。
それに加えて、それぞれに独自拡張がある。
550 :
NAME IS NULL
2016/04/28(木) 13:32:17.98 ID:???
>>547>>548>>549
詳しい説明ありがとうございました。
テーブルを作る、削除する、データを追加する、検索する
程度の簡単なSQLが実行出来ればいいのですが、それくらいの範囲でも
各社でコマンドが違いますか?
551 :
NAME IS NULL
2016/04/28(木) 13:38:00.85 ID:???
>>550
そのくらいなら方言じゃなくて標準語使えばいい。よっぽどじゃなきゃ標準語できる。
そこに無理矢理方言使うから他のDBで動かなくなる
552 :
NAME IS NULL
2016/04/28(木) 14:06:40.06 ID:???
なるほど。
そのsqlの標準語はどういう規格で決まっていますか?ググるキーワードを教えて下さい。
553 :
NAME IS NULL
2016/04/28(木) 14:18:23.35 ID:???
>>548
よく見ろ、SQL標準に入ってるCASE構文だ
554 :
NAME IS NULL
2016/04/28(木) 14:19:51.42 ID:???
>>552
まずSQLで検索しなよ
555 :
NAME IS NULL
2016/04/28(木) 14:24:17.58 ID:???
>>552
『SQL92/99標準リファレンスブック』みたいな本買えばいいよ
556 :
NAME IS NULL
2016/04/28(木) 14:34:49.21 ID:???
>>555
ありがとうございました。
さっそく買います。
557 :
NAME IS NULL
2016/04/28(木) 14:40:02.73 ID:???
俺はSQLポケットリファレンス使ってる。
各関数のページにどのDBで使えるか書いてあるの意外と重宝
558 :
NAME IS NULL
2016/04/28(木) 14:43:46.44 ID:???
>>553
ただのif文じゃね?
559 :
NAME IS NULL
2016/04/28(木) 15:04:45.49 ID:???
>>558
前半のはIFで後半のはCASEだな、自分もよく見てなかったよ、お恥ずかしい
560 :
NAME IS NULL
2016/04/30(土) 13:42:21.23 ID:???
dbo.tableに
col1, col2, col3の列がある時
col1, col3のみ取り出したい。
ただしcol3でdistinct したいんです。
全部文字型データです。
561 :
NAME IS NULL
2016/04/30(土) 13:53:53.00 ID:???
ひとつのcol3の値に対してcol1の値は複数存在するのか?
存在しないならcol1も入れてdistinctすればいい。
存在するならどっちのcol1の値を取り出すのか決めろ。
562 :
NAME IS NULL
2016/04/30(土) 14:09:32.46 ID:???
>>561
col1は複数存在します。
distinctでは最初に見つけた行以外を消したいです。
563 :
NAME IS NULL
2016/04/30(土) 14:11:42.63 ID:???
プログラム側なりサブクエリなりで余計なもの排除するのは?
564 :
NAME IS NULL
2016/04/30(土) 14:25:16.91 ID:???
sqlで一発で決めたいんです
よろしく
565 :
NAME IS NULL
2016/04/30(土) 14:35:55.28 ID:???
>>562
レコードに「最初」って概念はないからそれは無理。要はどれでもいいってことだな?
なら最小のcol1を選ぶことにして

select min(col1), col3 ... group by col3
566 :
NAME IS NULL
2016/04/30(土) 16:12:58.22 ID:WJU7LjMT
そもそもSQLでやることじゃないだろ。
567 :
NAME IS NULL
2016/04/30(土) 16:13:44.96 ID:???
ありがとうございました。
select min(col1), col3 from table group by col3
で、出来ました。distinctと言うのを使わなくても出来るのですね。
もし、同じ条件で、col1, col2, col3を取り出すにはどうすれば良いでしょうか。
568 :
NAME IS NULL
2016/04/30(土) 16:16:48.67 ID:???
>>567
そうなると >>4 となる。理屈は考えて
569 :
NAME IS NULL
2016/04/30(土) 16:30:14.59 ID:???
>>568
ありがとうございました。うまくいきました。
取得する列が一個増えるだけで、SQLの記述がガラッと変わるんですね。
不思議です。
570 :
NAME IS NULL
2016/04/30(土) 17:17:27.94 ID:WJU7LjMT
そもそも何をやりたいのか説明できない自分を恥じろよ。
571 :
NAME IS NULL
2016/04/30(土) 17:19:17.24 ID:WJU7LjMT
>>569
order byもどうせいるんだろ?

グループ化するとソートされるから気づかないんだろうが。
572 :
NAME IS NULL
2016/04/30(土) 18:40:13.93 ID:???
>>571
いかにもSQLでやるべきことに対して>>566と書いたことは恥じなくていいのだろうか
573 :
NAME IS NULL
2016/04/30(土) 19:59:26.59 ID:WJU7LjMT
無理しないで
574 :
NAME IS NULL
2016/05/01(日) 11:35:19.32 ID:???
>>569
そう言う場合、大概はテーブル設計が間違ってる
>>4のやり方なら、項目数で書き方が変わる事はない
575 :
NAME IS NULL
2016/05/01(日) 13:36:23.38 ID:41MU92iy
col3が親テーブルのカラムで、col1が子テーブルのカラムの方がいいデータモデルなのかもしれないが、このスレはとにかくSQLでどうにかしろと言うやつしかいない。

だからクソデータモデルとクソSQLのシステムばっかりできるんだよ。
576 :
NAME IS NULL
2016/05/01(日) 13:49:54.37 ID:???
>col3が親テーブルのカラムで、col1が子テーブルのカラムの方がいいデータモデルなのかもしれないが、

それちょっとテーブル定義書いてみろよw
577 :
NAME IS NULL
2016/05/01(日) 13:54:18.97 ID:41MU92iy
求めたい結果からそういうふうにデータを持つ手もあると言ってることが理解できないなら絵でも書いてみろよ。
578 :
NAME IS NULL
2016/05/01(日) 14:07:31.63 ID:???
そもそも設計はスレ違いなんでよそでやってください
579 :
NAME IS NULL
2016/05/01(日) 14:15:21.52 ID:???
んじゃ俺が書いてやるw

create table oya {
col3 primary key
}

create table ko {
col1 primary key,
col3 not null references oya(col3)
}
580 :
NAME IS NULL
2016/05/01(日) 14:17:32.75 ID:???
間違った、子はこうだな。

create table ko {
col1 not null,
col3 not null,
primary key(col1,col3)
foreign key (col3) references oya(col3)
}
581 :
NAME IS NULL
2016/05/01(日) 14:17:57.33 ID:???
mysqlのboolean型はsql serverのbit型だそうですが、両dbで名前が違っていると使いづらです。
582 :
NAME IS NULL
2016/05/01(日) 14:51:38.12 ID:41MU92iy
>>581
オラクル社とマイクロソフトにお手紙でも書いてください。
583 :
NAME IS NULL
2016/05/01(日) 17:40:00.74 ID:???
>>574
>>567 から >>4 になるに当たってがらっとかわったわけで、それは別に設計が間違えていたわけじゃない
584 :
NAME IS NULL
2016/05/01(日) 17:43:55.39 ID:???
>>579
書くまでも無く、クエリになんらよい変化をもたらしませんでしたな
585 :
NAME IS NULL
2016/05/01(日) 17:46:10.73 ID:41MU92iy
ここに質問にくるやつは、そもそもデータを示さないから、応えようがないよな。
586 :
NAME IS NULL
2016/05/01(日) 17:52:58.13 ID:41MU92iy
>>584
実際にそれだけのテーブルを作るわけじゃないだろうが。

グールプ化のSQLも重複排除なんて言ってたけど、ただのSQL初心者じゃん。

自分の求めたいことを説明できない時点で、自分自身が分かってないんだから、順序立てて考えろと言いたい。
587 :
NAME IS NULL
2016/05/01(日) 18:19:51.51 ID:???
>>586
いや、あなたもいまいち説明できてないよ。
>>575 によると、テーブルを分割するとデータモデルは正しくなり、SQLも形を変えるように読める。
しかし結果は変わらなかった。それどころかもともとのテーブルが>>579のような形である可能性は十二分にある。
588 :
NAME IS NULL
2016/05/01(日) 18:20:23.09 ID:???
つまり、>>575の意図がまるで明確じゃないということ。
589 :
NAME IS NULL
2016/05/01(日) 19:58:05.44 ID:41MU92iy
簡略した例と考えるのが普通だけどな。
590 :
NAME IS NULL
2016/05/01(日) 20:10:38.73 ID:???
いいから>>575で言ってた「いいデータモデル」を具体的に説明してみなよ。
まぁ、「そのくらい自分で考えろ」と逃げてもいいけどさ。
591 :
NAME IS NULL
2016/05/01(日) 20:26:21.37 ID:???
設計はスレ違いなんでよそでやってください
592 :
NAME IS NULL
2016/05/01(日) 21:18:01.18 ID:???
質問者が満足していることだけは確かなのでスレとしてはよい結果である
593 :
NAME IS NULL
2016/05/02(月) 11:32:13.16 ID:???
sql勉強中なんですがどんなsql文が書けるようになったら一人前ですか?
こういう状況でこんな処理がすぐに出来れば一人前と言うような課題を出して下さい。
594 :
NAME IS NULL
2016/05/02(月) 11:44:38.60 ID:???
DB設計するほうが勉強になるんじゃねーかな逆引き的な意味で
595 :
NAME IS NULL
2016/05/02(月) 14:03:49.35 ID:???
>>593
知識だけなら
高度情報処理(データベース)
ぐらいを取れればいいんじゃね
596 :
NAME IS NULL
2016/05/02(月) 15:57:03.63 ID:???
>>595
全然足りない
597 :
NAME IS NULL
2016/05/02(月) 16:18:27.82 ID:???
データベーススペシャリストって、クエリをバリバリ書けるようになるような知識要求されてたっけ?
もっと上位の設計とか運用が重視されてた気がするが
598 :
NAME IS NULL
2016/05/02(月) 16:25:13.07 ID:???
>>597
やりたいことがわかってて設計がまともにできてれば SQL ぐらい普通に書けるでしょ
超絶技巧の SQL なんて書けなくてもいいし
599 :
NAME IS NULL
2016/05/02(月) 16:29:12.56 ID:???
ぶっちゃけ5000行位のクエリメンテしてくれって言われた時は絶望した
600 :
NAME IS NULL
2016/05/02(月) 16:46:06.25 ID:???
>>598
お前の「普通」はレベルが低すぎる
601 :
NAME IS NULL
2016/05/02(月) 16:51:23.90 ID:???
>>597
例えば分析関数みたいに勉強しないと絶対に書けないものとか、
データベース毎の実行計画の確認方法とか、統計情報の見方とか
そういうの勉強しないとわからんでしょ

それを普通といってるのか、普通を超えてるのかしらないけど
602 :
NAME IS NULL
2016/05/02(月) 17:11:30.55 ID:???
>>598
普通にSQLを書きたければ、普通にそれを書けるような勉強・努力・経験が必要というあたりまえのこと。
603 :
NAME IS NULL
2016/05/02(月) 17:15:57.86 ID:???
>>600
こう言うアホは実務の邪魔にしかならん
604 :
NAME IS NULL
2016/05/02(月) 17:17:48.63 ID:???
>>602
その前提の設計とかは情報処理程度でまずはいいだろ
って話
605 :
NAME IS NULL
2016/05/02(月) 17:40:02.59 ID:???
>>599
やばいな
606 :
NAME IS NULL
2016/05/02(月) 18:05:23.73 ID:???
>>604
設計の話じゃなくてクエリの話なんだが
607 :
NAME IS NULL
2016/05/02(月) 18:06:13.70 ID:???
>>604
あと、お前多分データベーススペシャリストの内容知らんだろうから調べとけ
608 :
NAME IS NULL
2016/05/02(月) 18:16:33.54 ID:???
まぁ、どういうクエリを書くかというのを前提とした設計、という考え方もあることだし
609 :
NAME IS NULL
2016/05/02(月) 18:24:01.24 ID:???
WITHとか使うと、超絶技巧とか言われちゃうんだろうか
610 :
NAME IS NULL
2016/05/02(月) 18:30:05.29 ID:???
>>606
設計がまともにできたら
って書いてあるんだが
日本語も理解できないのかよ w

>>607
持ってますけどなにか?
611 :
NAME IS NULL
2016/05/02(月) 18:33:30.18 ID:???
>>609
お前にとっては with が超絶技巧なのか
612 :
NAME IS NULL
2016/05/02(月) 19:05:01.39 ID:???
>>593
OracleのSQL基礎の問題集でも買ってすらすら解けるようならまあいいんじゃない?
再帰問い合わせがないとかCASEがないとかEXISTSがないとか
いろいろ難はあるけどまずは基礎ってことで
613 :
NAME IS NULL
2016/05/02(月) 19:11:13.84 ID:qxw3T0B9
下手にSQLに詳しいと入れ物の設計がおかしいのにSQLでどうにかしてしまうので、あとで手に負えなくなる。
614 :
NAME IS NULL
2016/05/02(月) 21:09:02.67 ID:???
MySQLでテーブルにカラムが無い場合に限りカラムを追加したいのですが、
この例を見て
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;
エラーします。どこが間違っていますか?
615 :
NAME IS NULL
2016/05/02(月) 21:58:19.48 ID:qxw3T0B9
>>614
そもそもそんなやり方でいきなりテーブル定義を変更してはいけません。
616 :
NAME IS NULL
2016/05/02(月) 21:58:25.30 ID:???
>>614
DBMSのバージョンと出力されているエラーメッセージぐらいは書こう
話はそれからだ
617 :
NAME IS NULL
2016/05/02(月) 22:00:49.81 ID:???
>>615
urlの例は間違いということですか?
618 :
NAME IS NULL
2016/05/02(月) 22:01:24.35 ID:???
>>616
sqlにエラーがあります
619 :
NAME IS NULL
2016/05/02(月) 22:01:52.37 ID:qxw3T0B9
>>614
MySQLはよく分からないけと、それって共有ロックがかかってる状態で、テーブル定義を変更しようとしてるからじゃないの?
620 :
NAME IS NULL
2016/05/02(月) 22:02:02.71 ID:???
mysql5.6
621 :
NAME IS NULL
2016/05/02(月) 22:05:34.61 ID:qxw3T0B9
まあなんで、分解して問題箇所を特定しようとしないのかが分からん。
622 :
NAME IS NULL
2016/05/02(月) 22:09:32.21 ID:???
>>621
分解しても特定できなかったのです
623 :
NAME IS NULL
2016/05/02(月) 22:20:48.76 ID:qxw3T0B9
>>622
まずそのSELECT文は正しいのか?
624 :
NAME IS NULL
2016/05/02(月) 22:34:44.10 ID:qxw3T0B9
ALTER TABLE文は正しいの?
625 :
NAME IS NULL
2016/05/02(月) 22:38:15.98 ID:qxw3T0B9
INFORMATIONAL_SCHEMA is global for all databases, do not forget to filter onTABLE_SCHEMA=DATABASE().&#160;DATABASE()returns the name of the currently selected database.
626 :
NAME IS NULL
2016/05/02(月) 22:41:02.33 ID:aUzf9M0e
なんで回答者を装おって質問返ししとんねんw
627 :
NAME IS NULL
2016/05/03(火) 09:44:26.40 ID:???
>>614
sakilaって何だよ
文字列ならちゃんと囲め
628 :
NAME IS NULL
2016/05/03(火) 10:44:39.78 ID:???
>>626
ちょっと何言ってっかわかんないっすね
629 :
NAME IS NULL
2016/05/03(火) 10:44:40.34 ID:???
誰か出来る人いないの
630 :
NAME IS NULL
2016/05/03(火) 12:36:52.84 ID:CwXNjZUS
MySQL 総合 Part25 [転載禁止]&#169;2ch.net
http://echo.2ch.net/test/read.cgi/db/1424001054/
631 :
NAME IS NULL
2016/05/06(金) 10:47:32.70 ID:???
>>610
妥当な設計ができるようになる知識と、妥当なクエリを書く知識は別物だって言ってるんだが。

> 持ってますけどなにか?
お前は、データベーススペシャリストで扱うレベルのクエリしか書かないのか?
だとしたら、それで十分だと思うのも無理はない。
632 :
NAME IS NULL
2016/05/06(金) 11:19:52.13 ID:uq34uOVX
妥当なクエリというものが正しくインデックスを使用するクエリという意味であるならば
設計の知識とクエリを書く知識との間にはおそらく深く濃密で淫靡な関係があるんやで
633 :
NAME IS NULL
2016/05/06(金) 11:20:00.44 ID:???
>>631
> 妥当な設計ができるようになる知識と、妥当なクエリを書く知識は別物だって言ってるんだが。
誰も同じと言ってる奴はいないんだが、誰と戦ってるんだ?

> お前は、データベーススペシャリストで扱うレベルのクエリしか書かないのか?
実務ならね

> だとしたら、それで十分だと思うのも無理はない。
意味不明な勝利宣言乙 w
634 :
NAME IS NULL
2016/05/06(金) 14:18:30.55 ID:???
妥当な設計ができるようになる知識と、妥当なクエリを書く知識と、対人コミュニケーション能力は別物ですからね
635 :
NAME IS NULL
2016/05/06(金) 15:25:37.82 ID:zcqKFhJ2
>>634
その3つが揃わないとまともなものはできないけどな。
636 :
NAME IS NULL
2016/05/06(金) 15:34:39.28 ID:???
ああ、だから世の中のたいていのシステムは・・・
637 :
NAME IS NULL
2016/05/06(金) 20:58:17.29 ID:uq34uOVX
>>634
関係ある言ってんのに意地っぱりなやつやな
638 :
NAME IS NULL
2016/05/07(土) 10:36:30.67 ID:???
・DBMS名とバージョン
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
でした。

よろしくお願いします。
639 :
NAME IS NULL
2016/05/07(土) 10:47:16.27 ID:yfxTR66q
>>638
そんな構文聞いたことがない。

あほくさ。
640 :
NAME IS NULL
2016/05/07(土) 10:57:56.87 ID:???
>>638
自己解決しました。 CREATE で UNIQUE 指定したらできました。
641 :
NAME IS NULL
2016/05/07(土) 13:38:47.65 ID:yfxTR66q
それクソSQLだから、忘れないように。
642 :
NAME IS NULL
2016/05/08(日) 16:29:51.36 ID:???
・DBMS名とバージョン
 MS SQL Server(LocalDB)

 漢字、カタカナ、ひらがな、数字、記号のいずれか1文字が入ったカラム[Character]を持つテーブル"Table1"(40万件ほど格納)があります。
[Character]に入っている文字漢字、カタカナ、ひらがな、数字、記号が、それぞれ何個あるか確認したいのですが、
どのようなクエリにすれば良いでしょうか?
643 :
NAME IS NULL
2016/05/08(日) 16:36:26.41 ID:mxeFBByy
select col from hoge --where col like '%[A-Z][0-9]%' --英大文字に数字が連結している --where col like '%[^A-Z][a-z]%' --1文字目が英大文字でなく、2文字目以降が英小文字 --where col like '%[ぁ-ん]%' --ひらがなを含む --where col like '%[ァ-ン]%' --全角カタカナを含む --where col like '%[亜-龠]%' --漢字を含む


文字コードによって違うかどうかはしらない。
644 :
NAME IS NULL
2016/05/08(日) 16:46:56.61 ID:???
一文字、だろ?
645 :
NAME IS NULL
2016/05/08(日) 16:53:00.85 ID:mxeFBByy
わざわざ正確書く必要ないだろ、不勉強の初心者に。
646 :
NAME IS NULL
2016/05/08(日) 16:54:36.42 ID:mxeFBByy
だいたいそのテーブルは文字を管理しているテーブルだと思われるから、運用しているやつに聞けよって感じだよな。
647 :
NAME IS NULL
2016/05/08(日) 16:57:23.62 ID:???
文字コードによって違うかどうかを知らないなんて不勉強過ぎない
648 :
NAME IS NULL
2016/05/08(日) 17:00:31.83 ID:mxeFBByy
>>647 は日本語が不自由のようです。
649 :
NAME IS NULL
2016/05/08(日) 17:07:52.00 ID:???
どこを指してるのかわからんが、不勉強なことは否定しないんだな。
正確書いてみなよ
650 :
NAME IS NULL
2016/05/08(日) 17:10:43.13 ID:mxeFBByy
>>649
おまえは不勉強ではないと書いているけどなw
651 :
NAME IS NULL
2016/05/08(日) 17:12:11.82 ID:mxeFBByy
すぎない。
すぎないか。
652 :
NAME IS NULL
2016/05/08(日) 17:14:19.86 ID:mxeFBByy
すぎる。
すぎない。

よく「か」を忘れるやつがいるけど、仕事してんの?
653 :
NAME IS NULL
2016/05/08(日) 17:15:51.27 ID:???
>>650
それはどうも。

>>651
一般的な口語表現ですよ。ネットスラングですらない。

どうせ正確なクエリを書きはしないんでしょう?
俺は状況を限定しなければ書けないけれど、
>>645 の段階で正確に書こうと思えば書けるという含みを持たせてるんだから
どうせなら書いてほしい。
654 :
NAME IS NULL
2016/05/08(日) 17:17:36.33 ID:mxeFBByy
おまえが答えろよw

俺はSQL Serverの専門家ではない。
655 :
NAME IS NULL
2016/05/08(日) 17:19:13.47 ID:???
じゃあ
> わざわざ正確書く必要ないだろ、不勉強の初心者に。
じゃなくて
正確には書けないって言っとけばいいんだよ。俺みたいに。
656 :
NAME IS NULL
2016/05/08(日) 17:20:10.39 ID:mxeFBByy
DB設計スレとSQLスレは、回答すると批判する性格の悪いやつがよくいるから困るわ。
657 :
NAME IS NULL
2016/05/08(日) 17:21:03.41 ID:mxeFBByy
>>655
ヒントを与えてやっただけだろうが。

いきなり正解を書いて相手のためになるのか?
658 :
NAME IS NULL
2016/05/08(日) 17:22:54.41 ID:mxeFBByy
質問に対して完璧な答えなんか書けるわけがない。

このスレを否定することになるぞ。

まあ、このスレは俺は嫌いなんだが。
659 :
NAME IS NULL
2016/05/08(日) 18:53:18.42 ID:???
>>642
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

という感じで増やす。
660 :
NAME IS NULL
2016/05/08(日) 19:49:16.07 ID:???
文字種判定は、まじめにやるなら文字種の定義からやらんとダメだからなぁ

適当な文字との大小範囲比較でやる方法が示されてるけど
SQL ServerならSQL CLRで.NETの正規表現クラス使うって方法もあるかもしれん
LocalDBで使えるかどうか知らんが
それだとUnicodeのブロックでIsHiraganaとかIsKatakanaとかあるぞ
661 :
NAME IS NULL
2016/05/09(月) 11:05:38.14 ID:???
>>656
> DB設計スレとSQLスレは、回答すると批判する性格の悪いやつがよくいるから困るわ。
正しくない回答したんだろ
662 :
NAME IS NULL
2016/05/09(月) 11:27:35.93 ID:???
正しい批判に、むきになって正しくない反論する奴がたまにいるから困るわ
663 :
NAME IS NULL
2016/05/09(月) 11:39:41.66 ID:???
>>643は、
* 「1文字」という条件を読めてない
* 「それぞれ何個あるか確認したい」を実現できていない
* 文字種別毎に複数回のクエリを発行する(と読める)
と言う意味で、もうダメダメ。

こういうレベルのゴミレスしといて、俺様偉いするから叩かれるんだよ。
664 :
NAME IS NULL
2016/05/09(月) 11:44:50.11 ID:???
ここって答えそのもの教えるスレなん
665 :
NAME IS NULL
2016/05/09(月) 11:46:50.39 ID:???
>>664
自分がレスしたいようにすればいい
666 :
NAME IS NULL
2016/05/09(月) 11:55:25.11 ID:???
単発で見当違いな回答しても、そうは叩かれないが、それを自己弁護するレスを重ねると叩かれる
667 :
NAME IS NULL
2016/05/09(月) 13:40:40.63 ID:???
なかなか 質問のレスがつかない時に、適当な回答載せとくと
添削してまともな回答する人が増えるからなw
668 :
NAME IS NULL
2016/05/09(月) 14:05:59.99 ID:???
答えを教えるな(本人のためにならない的な意味で)っていう奴たまに見るけど、
その答えが正しいか確認したりするとそれすなわち答えなんで、それ教えた方が楽なんだよ
669 :
NAME IS NULL
2016/05/09(月) 14:41:11.47 ID:???
学校じゃないんだから、淡々と質疑応答すればいい
気に入らないなら、回答する義務はないんだし
670 :
NAME IS NULL
2016/05/09(月) 14:42:53.67 ID:???
自分の回答にけちつけるなって話みたいですよ
671 :
NAME IS NULL
2016/05/09(月) 15:05:28.59 ID:???
そういう奴は 荒らしでしょ
672 :
NAME IS NULL
2016/05/09(月) 15:17:35.49 ID:bsfml+jJ
評論家気取りは嫌われる。
673 :
NAME IS NULL
2016/05/09(月) 15:19:52.24 ID:bsfml+jJ
そもそもSQLの問題じゃないことをSQLで答えさせる質問者がいるからおかしくなる。
674 :
NAME IS NULL
2016/05/09(月) 15:27:08.00 ID:???
そういう質問者がいたかどうかしらないが、いたとしたらただ単にスルーすればいいだけの話
675 :
NAME IS NULL
2016/05/09(月) 15:45:36.07 ID:???
>>673
例えばこのスレでいうとどの質問?
676 :
NAME IS NULL
2016/05/09(月) 15:56:30.96 ID:???
>>633
> 誰と戦ってるんだ?
お前とだけど。

> 実務ならね
あっそ。
レベル低すぎだわ。
677 :
NAME IS NULL
2016/05/09(月) 16:08:45.21 ID:???
>>656
どちらのスレも、主にお前がトリガーになって荒れるんだが
678 :
NAME IS NULL
2016/05/09(月) 16:20:21.17 ID:bsfml+jJ
自分中心すぎる。
679 :
NAME IS NULL
2016/05/09(月) 18:32:48.79 ID:???
dbを操作する時に専用のマネージメントツールでクエリを発行して操作する場合と、phpその他のプログラムからクエリ文字列を送信して操作する場合とで、クエリの書き方は全く同じで良いですか?
つまり前者の方法で成功したクエリ文字列をコピペしてphpなどの文字列に埋め込めば良いのかどうか?
文字列を囲むシングルやダブルのクオーテーションとかの置換など必要ですか?
680 :
NAME IS NULL
2016/05/09(月) 18:38:51.94 ID:bsfml+jJ
>>679
PHPなどのスレで聞いてください。

SQLの話ではないので。
681 :
NAME IS NULL
2016/05/09(月) 18:46:32.25 ID:???
>>677
同意

>>680
珍しく同意
682 :
NAME IS NULL
2016/05/09(月) 18:51:31.19 ID:???
くだらない議論をする暇があるなら答えてやれよ
683 :
NAME IS NULL
2016/05/10(火) 12:21:48.42 ID:txEc0BOi
答えられる質問しろよ
684 :
NAME IS NULL
2016/05/10(火) 13:29:48.97 ID:???
>>679
> クエリの書き方は全く同じで良いですか?
それで良いが、よりよい方法がある(プリペアードクエリ)

> 文字列を囲むシングルやダブルのクオーテーションとかの置換など必要ですか?
置換は不要。
ただし、エスケープは必要になる場合がある。
685 :
NAME IS NULL
2016/05/10(火) 13:36:58.97 ID:???
何で接続してるかにもよるだろうけど
日付の書き方とか、項目名[]で囲まなきゃとかちょろちょろあるわな
686 :
NAME IS NULL
2016/05/11(水) 16:07:53.35 ID:???
あるか?
687 :
NAME IS NULL
2016/05/11(水) 16:41:16.63 ID:???
>>685
とりあえず全部の
テーブル名、
データベース名、
カラム名を[]で囲ってさらに""で囲っておけばいい
688 :
NAME IS NULL
2016/05/11(水) 16:45:31.80 ID:???
何のDBだったかなあ…俺も直だと通るSQLが通らなくて
日付のところいじった記憶あるな…DB2だったかなあ
689 :
NAME IS NULL
2016/05/11(水) 17:15:12.38 ID:???
1回実行すればエラーになるかどうかわかるんだから、やってみればええやん
690 :
NAME IS NULL
2016/05/11(水) 20:13:33.75 ID:???
>>676
> 意味不明な勝利宣言乙 w
691 :
NAME IS NULL
2016/05/12(木) 05:27:41.67 ID:HmbS4CfD
データモデル・DB論理・物理設計スレ
http://echo.2ch.net/test/read.cgi/db/1462998353/
692 :
NAME IS NULL
2016/05/12(木) 05:29:24.40 ID:HmbS4CfD
SQL初心者質問スレ [無断転載禁止]&#169;2ch.net
http://echo.2ch.net/test/read.cgi/db/1462998547/
693 :
NAME IS NULL
2016/05/12(木) 10:34:32.24 ID:???
>>690
実務でデータベーススペシャリストレベルのクエリ/知識で事足りてるなんてレベル低すぎだろ。
何が意味不明なんだか。
694 :
NAME IS NULL
2016/05/12(木) 11:24:31.79 ID:???
俺のカッコいいクエリスゲーだろ
ってか w
695 :
NAME IS NULL
2016/05/12(木) 11:51:10.46 ID:???
カッコいいクエリ書くとレベルが高いという認識なのね。
696 :
NAME IS NULL
2016/05/12(木) 13:13:34.27 ID:???
常に知識をフル活用したクエリを書かないといけない病ですか
697 :
NAME IS NULL
2016/05/12(木) 13:50:40.34 ID:???
他のプログラムだと見た目を気にするけど
SQLで気にしたことはないなあ
不格好でも性能さえ良ければ良いという感じ
698 :
NAME IS NULL
2016/05/12(木) 14:03:19.44 ID:???
>>696
> 常に知識をフル活用したクエリを書かないといけない病ですか
何が得意なのかしらないけど、コーディングが得意でかなりの知識を持っていたとして、
いつでも知識をフル活用しないとコードが書けないんですか?
699 :
NAME IS NULL
2016/05/12(木) 17:04:11.85 ID:???
>>697
大文字小文字適当なやつとか、余分なスペース一切無しで改行一切なしの数千文字とか見たら、考えが変わるかもよ
700 :
NAME IS NULL
2016/05/12(木) 17:23:54.67 ID:???
謎のスレたて
データモデル・DB論理・物理設計スレ → DB設計を語るスレ
SQL初心者質問スレ → このスレ
でいいじゃん
701 :
NAME IS NULL
2016/05/12(木) 19:41:05.20 ID:???
>>698
なんで俺あてなんだろう。しかもなんか話変わってるし。
とりあえず >>693 と話しててくださいな
702 :
NAME IS NULL
2016/05/12(木) 23:18:25.61 ID:HmbS4CfD
まあ普通、シンプルなSQLで済まないようなシステムならデータモデルがおかしいんだよ。
703 :
NAME IS NULL
2016/05/13(金) 00:02:07.43 ID:???
まあストアドでも使っとけばいいんじゃないですか
704 :
NAME IS NULL
2016/05/13(金) 10:40:00.28 ID:???
>>702
まぁまぁ妥当な設計になってるのは当然のこととして、クエリがシンプルで済むかどうかは要件によるだろ
705 :
NAME IS NULL
2016/05/13(金) 10:51:29.84 ID:???
ちょっと複雑な場合はクライアントコードで頑張ることにすれば、クエリはいつでもシンプル
706 :
NAME IS NULL
2016/05/13(金) 12:57:50.58 ID:???
>>704
実務でややこしい SQL なんてめったにお目にかからんけどな
707 :
NAME IS NULL
2016/05/13(金) 13:06:32.36 ID:???
>>706
お前もういい加減にしとけ
708 :
NAME IS NULL
2016/05/13(金) 13:31:08.43 ID:???
クロス集計とか複雑になりがち
709 :
NAME IS NULL
2016/05/13(金) 13:33:15.73 ID:???
自分の視野が世界の全て
710 :
NAME IS NULL
2016/05/13(金) 13:42:56.90 ID:???
複雑な要求をシンプルなSQLで済ますためには、正規化を崩したり、計算・集計結果を
保存しておいたりなどの対処が必要になる。

シンプルなデータ構造で複雑なSQLを書くのか、
シンプルではないデータ構造でシンプルなSQLを書くのか

という選択となる。

複雑な要求を、シンプルなデータ構造とシンプルなSQLで実現できることはまれ。

高度な機能、例えば再帰クエリサポートや分析関数サポート、ランダムサンプリング機能
などがRDBMSに実装されていれば、SQLがシンプルになる場合もある。
711 :
NAME IS NULL
2016/05/13(金) 14:10:20.52 ID:???
ややこしいの基準は人によって違うからね
712 :
NAME IS NULL
2016/05/13(金) 14:22:26.51 ID:???
>>711
例えば、こういう例だとどうでしょう。

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は複雑なものになると思います。
713 :
NAME IS NULL
2016/05/13(金) 14:30:32.53 ID:???
お前らいい加減にしろよ
714 :
NAME IS NULL
2016/05/13(金) 14:45:26.20 ID:???
変にSQLをこねくり回すより
アプリでやった方がやりやすそうだし
後のメンテナンスも楽だろう
715 :
NAME IS NULL
2016/05/13(金) 14:58:09.06 ID:???
ちょっと複雑なクエリを「こねくり回している」と見る奴もいれば、その程度は普通だと見る奴もいる
716 :
NAME IS NULL
2016/05/13(金) 15:03:52.95 ID:???
>>714
あー、こういうメンタリズム持ってる奴が、全件取得してコードであれこれやってるのか
717 :
NAME IS NULL
2016/05/13(金) 15:18:55.64 ID:???
>>714
こういう奴が、insert/updateの前にテーブルをロックして、コードで妥当性を確認したりするんだよ
718 :
NAME IS NULL
2016/05/13(金) 15:42:48.40 ID:???
712の質問に模範解答書いて
719 :
NAME IS NULL
2016/05/13(金) 16:32:26.85 ID:???
これ、クエリで解決できる問題なのか・・・?
720 :
NAME IS NULL
2016/05/13(金) 16:51:07.85 ID:???
>>712
自分で例を出すといてあれなんですが、ちょっと難しすぎました。
少し考えたんですが、私には無理でした。すみません。

重なりが最高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
721 :
NAME IS NULL
2016/05/13(金) 17:01:58.50 ID:???
重なりってのは完全に内包されるような事もあるのか?
重複の開始と終了の基準は?特に複数の重複がある場合

idは何らかの順序で振られてる保障があるのか?

まあSQLだけで出来なくはないだろうけど
それがシンプルかどうかはしらん
722 :
NAME IS NULL
2016/05/13(金) 17:32:11.87 ID:???
あの例に、あまり時間を取るのはお勧めしませんが・・・

>>721
> 重なりってのは完全に内包されるような事もあるのか?
はい。

> 重複の開始と終了の基準は?特に複数の重複がある場合
hogeテーブルが、どこかの部屋の誰かの入出・退出記録だとしたとき、
同時に二人以上存在した時間。

> idは何らかの順序で振られてる保障があるのか?
PK以外特に何もありません。
723 :
711
2016/05/13(金) 18:32:34.17 ID:???
>>712
たぶん誰かと勘違いしてるけど、まぁいいや。

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 つかってください。
724 :
711
2016/05/13(金) 18:39:24.90 ID:???
補足。開始と終了が逆転したレコードがないなら >>720 と同じ結果になるかと。
725 :
NAME IS NULL
2016/05/13(金) 19:12:20.29 ID:???
>>723
重なりが2つまでなら、ちょっと簡単すぎたかも。
726 :
NAME IS NULL
2016/05/13(金) 19:21:32.04 ID:???
>>707
まだいたのかよ 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

となる

> 要求:全データの重複部分を抽出する
は満たしてるけどこの余計なレコードは大抵要らないよね
でも俺の頭だと消す方法わからん...
727 :
NAME IS NULL
2016/05/13(金) 19:27:05.92 ID:???
>>716-717
で、君ならどうするの?
まさか煽ってるだけじゃないよね?
728 :
711
2016/05/13(金) 19:43:50.85 ID:???
>>726
ほぼ同じかもしれんがコストは違うよ
まぁいいけど
729 :
NAME IS NULL
2016/05/13(金) 21:38:30.94 ID:???
>>722
だから重なりの開始、終了ってのはいつの事を指してるんだ
たとえば、日付は同じだとして
1時〜5時
2時〜6時
3時〜7時
ってデータがあったら、どんな結果が欲しいんだよ
そこに
0時〜9時
ってデータもあったら、どんな結果になればいいんだよ
730 :
NAME IS NULL
2016/05/13(金) 21:53:05.81 ID:???
>>729
>>722 じゃないけど

> 1時〜5時
> 2時〜6時
> 3時〜7時
⇒ 2時〜6時

> そこに
> 0時〜9時
⇒1時〜7時

じゃね?
731 :
NAME IS NULL
2016/05/14(土) 08:09:52.84 ID:wCMs+ZVV
>>716
それはDBMS側がやっているのか、アプリケーションがやっているのかの違いで、DBMSに処理を任せすぎると性能問題の対処が難しくなる。
732 :
NAME IS NULL
2016/05/14(土) 08:53:03.15 ID:???
データ処理で DBMS を越える性能のルーチン作れる奴がどれだけいるんだよ w
733 :
NAME IS NULL
2016/05/14(土) 12:21:12.49 ID:wCMs+ZVV
>>732
汎用性と特化の違いが分からないのか?

DBMSの処理が最適とは限らない。

しかもSQLで何もかもやらせるのは、仕様変更があった場合、工数を増大させ、性能問題、リソース問題を引き起こすリスクがある。

なかにはSQLのテストはしないなんてプロジェクトもあるから、SQL検証用のテストデータ作り、テストで苦労するSQLを書くやつがいるんだよな。
734 :
NAME IS NULL
2016/05/14(土) 12:27:22.23 ID:wCMs+ZVV
言い忘れた。

仕様変更でSQLを変更すると、もとの仕様からも大きく外れたものになってしまうこともある。

SQLはちょっとしたミスでまったく意味が変わってしまうから、本当にリスクが高いんだよ。

よほどSQLに詳しくて、実データにも詳しくない限り、安易なSQLの変更は危険。
735 :
NAME IS NULL
2016/05/14(土) 12:32:45.30 ID:???
優秀な奴が複雑で正しいSQL書いたとして、
そいつがその後プロジェクトに残るとは限らないからな
そこがメンテする度に、すでにやめた会社から連絡が来て
対応することになるのかな?
SQLに限った話ではないけどね
736 :
NAME IS NULL
2016/05/14(土) 13:01:20.80 ID:???
>>733-734
何を言ってるのか知らんけど
だから
> 全件取得してコードであれこれ
やれってか?
極端な例出す奴はバカの法則 w
737 :
NAME IS NULL
2016/05/14(土) 14:29:03.25 ID:???
なんで全件取得するんだよ。必要なデータだけ取得すりゃいいだろ。アホか?
738 :
NAME IS NULL
2016/05/14(土) 16:23:52.68 ID:???
最近弄り始めた初心者だけど、質問いいかな。
DBはMySQL 5.5を、利用するプログラムはPHP5.6を一応の前提としておく。


例えば「会社」「部」「課」「係」「社員」のような、
上下が関連付けられた5つのテーブルがあるとする。

会社は部を、部は課を、課は係を、係は社員を、それぞれ "0個以上" 持つ。
逆に複数の会社に所属する部というような、上位のデータを複数持つことはない。
また、部に直属の社員というような、上位の部署を持たないとうなレコードも存在しない。

それぞれのテーブルは、自分の1つ上位のテーブル(課から部など)のプライマリキーを参照できる。
2つ上のテーブル(課から会社など)や、自分の下(課から社員など)は直接的に参照は出来ない。


さて、ここで質問なのだけれど、
(1)
このような、1つ上位のテーブルだけを参照するという設計は一般的なのか。

(2)
特定の係に所属する社員を一覧表示したいという文脈で、
その係の最上位にある会社の名前も取得したいというとき、どうするのが無難か。

とりあえず社員テーブルを取得する際に、課・部・会社テーブルも外部結合で一緒に引っ張っているが、
クエリを2回に分けて、会社名は会社名で取得したほうがいいのかとか。
739 :
NAME IS NULL
2016/05/14(土) 16:50:51.30 ID:???
>>738
どういう要件かいまいち分からないんだけど、

最初から係の数だけ社員テーブルを作ってしまった方が良くない?
740 :
NAME IS NULL
2016/05/14(土) 16:51:52.62 ID:???
>>738

(1)
それが一般的ってことでいい。
もし「社員」に1つ上位の「係」とその上の「課」の両方を持たせた場合、「社員」→「係」→「課」の
推移的従属が存在するから第3正規形ではない。

(2)
パフォーマンス的に問題なければそのクエリでいい(外部結合はいらんと思うが)。
問題になるようであれば、クエリの実行に比べて組織変更の頻度が非常に小さいことを前提に
(1)を崩してJOINのコストを削減したりする。
741 :
NAME IS NULL
2016/05/14(土) 18:08:13.18 ID:???
>>737
知らんがな
>>716 に聞けよ
742 :
NAME IS NULL
2016/05/14(土) 21:28:53.84 ID:???
趣味でサバクラ通信のあるのゲーム作ってます

・キャラクタテーブル
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 =?);
みたいな事がやりたいです。

素直にテーブル構造変えるべきでしょうか(ヽ´ω`)
743 :
NAME IS NULL
2016/05/14(土) 21:36:50.74 ID:???
テンプレ読んでなかった、>>742はmysql Ver 14.14 Distrib 5.1.73です
744 :
NAME IS NULL
2016/05/14(土) 21:46:18.44 ID:???
char_idとuser_idが何のidでどうなってるのかわからん
キャラクタテーブルのuser_idで検索するだけじゃないのか?

そのselectから想像するなら
INのサブクエリをchar_a,b,cのunionにすれば行けんじゃね
char_a,b,cでそれぞれjoinしても行けるかもしれんな

まあテーブル構造見直すほうがよさそうだけど、設計はスレ違いだし
745 :
NAME IS NULL
2016/05/14(土) 21:48:57.11 ID:???
自己解決、ちょっと気持ち悪いですが以下で出来ました

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 =?;
746 :
NAME IS NULL
2016/05/14(土) 21:51:32.36 ID:???
>>744
すみません、そうですよね…

・パーティーテーブル
id  ←シーケンシャル
user_id
char_a ←
char_b ←
char_c ←それぞれがchar_id

でした。
ご指摘の通りjoinで出来ました。
失礼しました。

扱う要素が多くてリレーションかなり複雑になってるので、
できれば再設計はしたくなかったのでこれで行こうと思います…
お騒がせしましたー
747 :
738
2016/05/15(日) 11:53:53.97 ID:???
お礼遅くなった。
アドバイスありがとう。

>>739
本データとは別に検索用テーブルを作るってことじゃなく
最初から係別に格納するってことか。
なるほどそういう考え方もあるのか…

>>740
外部結合は要らないってことは、内部結合ってこと?
ちょっと今日は休日なので試せないんだけど、
係に所属する社員が0のときに会社名引っ張ってこれなさそうと思ってしまった。

……が、それは多分レアケースなんだから、
そのとき改めてクエリ発酵すりゃいいのか・
748 :
NAME IS NULL
2016/05/15(日) 13:32:10.78 ID:???
>>738の書き方じゃ、所属する社員が0のときに会社名のみ取得したいなんてわからんがな。
749 :
NAME IS NULL
2016/05/15(日) 14:26:25.55 ID:???
話題の某巨大データでMySQLデータベースを学びたい。
テーブル設計してみた。
アドバイスやら、共同で出来る人求む。

http://59ch.net にすべての定義分載せた
750 :
NAME IS NULL
2016/05/16(月) 00:01:17.01 ID:ZvSt0PFw
JOINを使わずに結合させる方法ってあります?
顧客の要望でSQL知っている人で、JOINが使えんらしい。
意味わからんがピリオド使う系を使わずに結合させる方法があればいいんだよなぁ
751 :
NAME IS NULL
2016/05/16(月) 00:12:29.99 ID:???
JOIN使えないのにSQL知ってるって言い切るかぁ
単純に一つのテーブルからデータ出すのだけは出来るって事?
752 :
NAME IS NULL
2016/05/16(月) 00:13:05.89 ID:???
>>750
使えるようになれって言う
753 :
NAME IS NULL
2016/05/16(月) 00:32:25.34 ID:???
>>750
下手に抜け道を探そうとしない方がいいよ。
754 :
NAME IS NULL
2016/05/16(月) 02:18:02.82 ID:???
>>750
ビューを作ってそこだけ触らせる
755 :
NAME IS NULL
2016/05/16(月) 09:31:26.93 ID:???
ピリオド使う系ってのが意味不明だが
FROMにテーブル書いてWHEREで結合条件書けば解決とかいうオチじゃないか
756 :
712
2016/05/16(月) 10:46:24.07 ID:???
モヤモヤしてる人がいるかもしれないので、>>712をもう少し明確にしておきます。
重ねて言いますが、これは私が回答を知っていて書いたものでは無く、

>>702
> まあ普通、シンプルなSQLで済まないようなシステムならデータモデルがおかしいんだよ。
に反論するためのお題です。
要するに、要求がシンプルでない場合は、シンプルなSQLではすまない、ということの例です。

>>712は、ある部屋への入退出記録だとすると、知りたいのは、「複数人在室している期間」です。
言い換えれば、「一人しかいない期間、ではない期間」です。
SQLでそこそこ頑張れば取得できると思ったんですが、少なくとも私には無理そうです。

ただ、回答があるかどうかもわからないため、この問題に時間を使うのはお勧めしません。
757 :
712
2016/05/16(月) 10:58:12.75 ID:???
>>733
> DBMSの処理が最適とは限らない。
逆にDB側で処理させるのが最適の場合もありますね。

多少複雑なクエリを書けば一つのクエリで終わるのに、クエリを何段階にも分け、クライアントコードの
データ構造をいじくり回し、ループして何回もクエリを発行する、というようなコードになるかもしれません。

今回の議論の問題は、「複雑な」とか「多少複雑な」の基準が個々人で異なるため、なかなか議論が
かみ合わない所にあると感じています。
758 :
NAME IS NULL
2016/05/16(月) 11:48:53.50 ID:???
>>738
> 特定の係に所属する社員を一覧表示したいという文脈で、
なら、
> クエリを2回に分けて、会社名は会社名で取得したほうがいいのかとか。
こっちがいいんじゃないの?
係→課→部→会社ってjoinするの無駄なんだけど
759 :
NAME IS NULL
2016/05/16(月) 13:05:21.98 ID:???
てか、特定の係に所属する社員を一覧表示する文脈で会社名を取得したいというのがわからん
760 :
NAME IS NULL
2016/05/16(月) 13:15:34.63 ID:???
>>758
なにが無駄なんだ?
joinすれば1回のクエリ発行ですむのに、わざわざ2回クエリ発行するのは無駄じゃないのか?
つかjoinなしで係から会社まで3層あるならクエリ4回必要だが

>>759
順次上のグループをたどって最上位まで表示したいって事だろ
それは別におかしな話でもないけど
会社組織に例えてるから、会社が一つしかないだろって先入観もちすぎじゃね
761 :
NAME IS NULL
2016/05/16(月) 13:50:26.83 ID:???
>>760
> なにが無駄なんだ?
社員数分、同じ処理で会社名を取得するのが無駄

> つかjoinなしで係から会社まで3層あるならクエリ4回必要だが
会社名を取得するときにjoinしないとは言ってない
社員一覧を取得する時に、毎レコード4階層分処理するのが無駄と言ってるだけ

> 会社組織に例えてるから、会社が一つしかないだろって先入観もちすぎじゃね
特定の係に所属していれば、会社は一つ
762 :
NAME IS NULL
2016/05/16(月) 13:57:10.45 ID:???
ひょっとして、特定って異なる会社の複数の係ってことか?
だとしたら、全部joinしてもいいかもな
763 :
NAME IS NULL
2016/05/16(月) 14:41:28.40 ID:???
>>761
1:nのリレーションで、1側のテーブルを必ずn回読み込む処理が実行されるとか思ってるんだろうか
さすがにそんなアホなオプティマイザしかないDBMSは少ないと思うが

今回の例でクエリ分ける事にメリットがあるとしたら
回線が細いときに伝送量を減らせるぐらいしか思いつかないが
今時の回線事情考えるとそこまで気にする事はないだろうし
764 :
NAME IS NULL
2016/05/16(月) 14:48:43.22 ID:???
>>763
> 1:nのリレーションで、1側のテーブルを必ずn回読み込む処理が実行されるとか思ってるんだろうか
> さすがにそんなアホなオプティマイザしかないDBMSは少ないと思うが
ちょっと何を言っているのかわかないが、今回のケースでは、最終結果が社員100人だとしたら、
係・課・部・会社テーブルのlook upは合計400回必要で、そのうちのいくつかはnested loopになるかもしれん
さらには、lookupの結果で会社テーブルを再度取得する必要がある

「特定の係」というのが一つの係の場合は、そのnested loopを含む400回の処理結果は、
一つの会社名にすぎない
765 :
NAME IS NULL
2016/05/16(月) 15:10:16.26 ID:???
どの関係性も下位から上部への検索だから、内部ではループは発生せずindex scan*400回とかになるのでは
その結果が一つになるのがわかってるのなら、400回のindex scanは不要とも言える
766 :
NAME IS NULL
2016/05/16(月) 15:19:29.64 ID:???
>>765
そうか、そうだね、ループは発生しないね
767 :
NAME IS NULL
2016/05/16(月) 15:28:06.07 ID:???
社員の一覧の列に会社名を出すならjoinが素直でいいかと。
768 :
NAME IS NULL
2016/05/16(月) 15:34:55.04 ID:???
回線だけは圧迫するけどな
速度が重視される場合には、JOIN的なことをクライアント側でやる
769 :
NAME IS NULL
2016/05/16(月) 15:43:48.98 ID:???
それはチューニングの段階の話だよね
770 :
NAME IS NULL
2016/05/16(月) 15:45:03.11 ID:???
400回のindex scanくらいたいしたことない
1000件のデータ取得&1個のマスター取得なら1000回のindex scanが発生するんだし

だが、いろんなところで
join 係 using (係id)
join 課 using (課id)
join 部 using (部id)
join 会社 using (会社id)
が氾濫するなら、正規化崩しを考えた方がいいかもね
771 :
NAME IS NULL
2016/05/16(月) 15:48:13.13 ID:???
hash join じゃなくて index scan が発生するもんなの?
772 :
NAME IS NULL
2016/05/16(月) 16:04:36.01 ID:???
するでしょ
773 :
NAME IS NULL
2016/05/16(月) 16:12:04.19 ID:???
どう崩すつもりかわからないけど、 view じゃだめなの
774 :
NAME IS NULL
2016/05/16(月) 16:28:30.11 ID:???
>>773
> どう崩すつもりかわからないけど
係が決まれば一意に会社が決まって、社員を検索するときによく会社も絡めて検索する
場合が多いなら、社員テーブルに会社idを入れるとか
775 :
NAME IS NULL
2016/05/16(月) 16:29:34.33 ID:???
性能的に問題が無ければビューで良いんじゃね
776 :
NAME IS NULL
2016/05/16(月) 17:16:50.35 ID:???
ツリー構造的なでーたなので、経路列挙パターンというのもありかも
777 :
NAME IS NULL
2016/05/16(月) 18:15:36.42 ID:???
ビュー最強
778 :
NAME IS NULL
2016/05/16(月) 18:32:09.44 ID:???
でも、SUMとか使ってたら注意な
779 :
NAME IS NULL
2016/05/16(月) 20:33:02.74 ID:ZoNDbMXd
すぐSQLいじって対処しようとするやつは、テストしないから要注意。
780 :
NAME IS NULL
2016/05/17(火) 11:27:04.88 ID:???
設計スレじゃないので恐縮なんだけど、

>>740
> もし「社員」に1つ上位の「係」とその上の「課」の両方を持たせた場合、「社員」→「係」→「課」の
> 推移的従属が存在するから第3正規形ではない。
これって本当に推移的関数従属?
社員が複数の部や課に属さないという前提の場合、社員が決まれば課は一意に決まる。
部も会社も同様。つまり、係からたどる必要はないと言う意味で、推移的ではない気がする。
781 :
NAME IS NULL
2016/05/17(火) 17:28:44.51 ID:???
>>780
係と課と両方あれば情報が重複するのはあきらかなんだから
用語の定義についてどうこう言いたいなら然るべきスレでやってくれ
782 :
NAME IS NULL
2016/05/17(火) 17:59:26.57 ID:???
>>781
「社員」→「係」→「課」というのが本当に推移的従属なのかが知りたいだけだから。
783 :
NAME IS NULL
2016/05/17(火) 18:09:35.59 ID:???
>>782
そうだからもう来るな
784 :
NAME IS NULL
2016/05/17(火) 18:45:55.10 ID:???
設計は設計スレで
>>738が元凶
785 :
NAME IS NULL
2016/05/18(水) 11:58:44.85 ID:???
テーブル hoge に AとBがあるんだけど
Aにユニークを付け忘れちゃったのでこっそり修正したいです

Aが重複していたら、Bが1番大きいのを残してあとは削除
というクエリーを作りたいんだけど、
1番大きいのを残してあとは削除 のところがうまく書けない
786 :
NAME IS NULL
2016/05/18(水) 13:38:02.75 ID:???
Bの一番大きい値を指定したとき1件になるの?
787 :
NAME IS NULL
2016/05/18(水) 14:09:52.42 ID:???
>>786
Bも同じだったらどれか適当に
788 :
NAME IS NULL
2016/05/18(水) 14:12:36.22 ID:???
TOP 1 を not existすればええんでねえの?
789 :
NAME IS NULL
2016/05/18(水) 14:47:10.48 ID:???
delete from hoge where (a, b) not in (select a, max(b) from hoge group by a)
790 :
NAME IS NULL
2016/05/18(水) 14:48:30.17 ID:???
あ、aもbも同じだったら残るか
791 :
NAME IS NULL
2016/05/18(水) 18:10:43.59 ID:???
複数項目の組み合わせでinのチェック出来るのは標準的なSQLなのか?
792 :
NAME IS NULL
2016/05/18(水) 18:14:08.06 ID:???
AもBも同じレコードがあるなら、他に項目がないと行を特定できないから
どちらかだけ消すとか無理じゃね
A,max(B)を別テーブルにinsertして、元テーブル全て消して作り直しじゃね
793 :
NAME IS NULL
2016/05/18(水) 19:21:00.95 ID:???
>>789,>>791
これができるのはOracleだけだったような
794 :
NAME IS NULL
2016/05/18(水) 20:27:09.80 ID:???
>>793
Postgresql でもできるっぽい
http://blog.fusic.co.jp/archives/1765/
795 :
NAME IS NULL
2016/05/18(水) 20:39:13.18 ID:???
>>793
当時自分がメインで使ってたsqlserverだとそれが使えなくてモヤモヤモヤモヤした結果、
もういいやとexists使うクセがついた。
796 :
NAME IS NULL
2016/05/19(木) 11:10:15.16 ID:???
>>792
limit 1 でdeleteすればどっちらか消すのはできますい
797 :
NAME IS NULL
2016/05/19(木) 11:29:50.07 ID:???
長さが不確定な文字列を入れる場合は、
とりあえずNVARCHAR(MAX)にしておけばいいのか?
798 :
NAME IS NULL
2016/05/19(木) 18:14:20.65 ID:???
>>796
deleteにlimitとかtopとか使えたっけ?
できるなら、1行指定でループまわすとかすれば可能かもしれんな
799 :
NAME IS NULL
2016/05/20(金) 01:21:34.54 ID:???
>>797
不確定でも最大値くらいは確定させよう
800 :
NAME IS NULL
2016/05/20(金) 08:02:56.36 ID:???
>>791
MySQL もできた気がする。
801 :
NAME IS NULL
2016/05/20(金) 09:28:04.13 ID:???
>>799
分からない場合もあるだろ。
802 :
NAME IS NULL
2016/05/20(金) 11:42:27.56 ID:???
>>801
全くサイズ制限なくデータの入る型をもつDBMS実装は見た事ない
事実上無制限とか言うのは見たことあるけどな
まあ普通は上限決めとくもんだ

とりあえずって言うなら、そのDBMSで使える一番サイズの広い型使えばいいんじゃね
まあnvarchar(max)かclobだと思うけど、その場合でもサイズ制限が無いわけではないし
803 :
NAME IS NULL
2016/05/20(金) 15:32:10.94 ID:???
>>802
> 全くサイズ制限なくデータの入る型をもつDBMS実装は見た事ない
つ text型@PostgreSQL

> まあ普通は上限決めとくもんだ
PostgreSQLでは文字列はtextがデファクトだがな
804 :
NAME IS NULL
2016/05/20(金) 17:45:49.12 ID:???
DB側で最大長チェックしてもらうような状況も起こらないもんね。textバンザイ。
805 :
NAME IS NULL
2016/05/20(金) 17:48:52.13 ID:???
長さチェックして欲しければ、そういう型使えばいいし
806 :
NAME IS NULL
2016/05/20(金) 17:56:00.22 ID:???
> > 全くサイズ制限なくデータの入る型をもつDBMS実装は見た事ない
> つ text型@PostgreSQL

でもこのやり取りには首を傾げざるを得ないな。
9.5で無制限になったのかと思ったけどそうでもないようだし。
807 :
NAME IS NULL
2016/05/20(金) 18:08:08.06 ID:???
無限じゃないから制限ありと言いたいのかな
808 :
NAME IS NULL
2016/05/20(金) 18:08:56.33 ID:???
いや、1GBまでじゃないの?
809 :
NAME IS NULL
2016/05/20(金) 18:18:43.50 ID:???
それはカラムの制限で型の制限じゃないんだが、まあそれを制限ありというのならそうともいえる
ただ、大抵はtextの説明は「制限なし可変長」だけどな
810 :
NAME IS NULL
2016/05/20(金) 18:20:43.42 ID:???
扱う文字列が数GB以上とかそういう話なら、そもそもデータベース内で管理するのはどうなのって思う
811 :
NAME IS NULL
2016/05/20(金) 19:09:25.11 ID:???
どのカラムもせいぜい100文字以内のデータしか入れないのに、全カラムを長さ制限の無しの属性にするとやはりパフォーマンスは落ちますか?
812 :
NAME IS NULL
2016/05/20(金) 20:24:28.41 ID:???
>>801
なら自分で決めて仕様書に書いとけばいい
上限決めてないと限界値テストもされないからいざその手のデータが来た時に他の場所で死んじゃうとかのバグはかなり多い
813 :
NAME IS NULL
2016/05/21(土) 01:16:18.96 ID:cPaShX53
>>811
長さ制限って何のことを言っているのか?

でかいデータ型なら言うまでもなく分かるだろ?
814 :
NAME IS NULL
2016/05/21(土) 02:49:38.86 ID:???
>>811
DBMSの実装によるので何とも言えんわ
特定のDBMSの話なら、該当するスレで聞け
815 :
NAME IS NULL
2016/05/21(土) 11:08:19.71 ID:sqyLzqrf
日本マイクロソフト人事本部シニアマネージャー(名ばかり管理職)の西川昌邦(さいかわまさくに)は犯罪者にして殺人犯だ!!
「あなたのような従業員は会社のパフォーマンスにとってマイナスなので早く死んでください」
などと自殺教唆を公然と行った!! その結果人が死んだ!!
丁寧に言えば何を言ってもいいというものではない!!これはヤクザや借金取りが脅迫をする時に
「いついつまでに金一億円をお振り込みください。命が惜しければ間違った判断をなされないことを期待します」
と発言するのと同じレベルだ!!
しかもそれを注意してやったら、「世間はわれわれの味方だ。文句があるなら訴えてきたらよろしい。メールを電番を公開したければ
どうぞご自由に。世論はわれわれを賛辞するするメールを送付するだろう」
などとイカ様気取りも大概にしろという発言を行った!!
抗議先 日本マイクロソフト人事本部 西川昌邦
メール:masaikaw●microsoft.com
(●を@に置き換えて)
電話:09025411718
816 :
NAME IS NULL
2016/05/22(日) 00:33:04.73 ID:???
普通のプログラミングだと「分割は正義」みたいなところあるけど
SQLの場合、そうはいかない場合が多いじゃん?
どういう基準で妥協してる?
817 :
NAME IS NULL
2016/05/22(日) 00:39:50.32 ID:???
>>816
そういうのはDB設計を語るスレでやってくれ
818 :
NAME IS NULL
2016/05/22(日) 02:50:03.65 ID:???
クエリについても設計スレなのか
ありがとう
819 :
NAME IS NULL
2016/05/22(日) 05:38:09.72 ID:???
テーブル分割と勘違いしたんじゃないの。
820 :
NAME IS NULL
2016/05/22(日) 10:17:37.83 ID:???
文字列長制限のないカラムの話が続いていたからな
気持ちは分かる
821 :
NAME IS NULL
2016/05/23(月) 17:20:45.84 ID:???
>>812
> 上限決めてないと限界値テストもされないから
いやするでしょ。
しないのは、お前が悪い。
822 :
NAME IS NULL
2016/05/23(月) 19:32:24.41 ID:???
>>821
上限わからんのにどうやってテストするつもりなんだよ w
823 :
NAME IS NULL
2016/05/23(月) 19:54:33.53 ID:???
>>822
システム上の制約があるんだからそこの境界チェックをしなさいよという話では。
824 :
NAME IS NULL
2016/05/23(月) 19:58:57.82 ID:???
HDDの容量一杯、とか?
825 :
NAME IS NULL
2016/05/23(月) 20:26:44.87 ID:???
上の話なら1GBとか。
826 :
NAME IS NULL
2016/05/23(月) 20:29:48.29 ID:???
俺はアプリ側で制限かけるからDB側の制限に引っかかった場合のテストってやらないけど。
827 :
NAME IS NULL
2016/05/23(月) 21:11:12.29 ID:???
システムの制限って
今時のDBMSだと実データをファイルに保存したりする機能があったりして
その場合たとえばNTFSのファイル上限の16T弱まで入ることになるはずだが

もしアプリ上で上限きめてなければ、そんなのもちゃんとチェックするのかね
828 :
NAME IS NULL
2016/05/24(火) 00:11:41.97 ID:???
MSDNみると、nvarchar(max)で 2^31-1 バイト (2 GB)、1文字2バイト換算+2バイト入るとな。
まあ、そんなに1レコードにぶち込んでどうすんのよという気はする。「普通の使い方するなら気にするな」って事でしょ。

>>827
Windows Server 2012、Win8以降は実装上256TiB。
829 :
NAME IS NULL
2016/05/24(火) 10:15:29.42 ID:???
>>822
> 上限わからんのにどうやってテストするつもりなんだよ w
お前が作るアプリは、あらゆる場所で何も制限がないのか?
保存先に制限がなくても、他の場所にはあるはずだが。
830 :
NAME IS NULL
2016/05/24(火) 12:14:41.25 ID:???
案件理解、システム設計の理解から始めよう
何もわからないままテストケースなんて作れないから
831 :
NAME IS NULL
2016/05/24(火) 13:17:09.79 ID:???
PostgreSQLでtextデフォで使ってると、ほんと以前はいらん神経使ってたことに気づく
832 :
NAME IS NULL
2016/05/24(火) 14:10:52.99 ID:???
そういえば最近はSQLiteしか触ってないから文字列はtextで長さは特に指定しないけど
長さを予め指定するって面倒だよな、サロゲートペアもあるし
833 :
NAME IS NULL
2016/05/24(火) 15:42:38.67 ID:???
RDBMSのテストしたい奴が多いみたいだな

RDBMSの仕様としてサイズが決められているなら、その上限まで正しく保存できるか
どうかというのはRDBMSのテストに他ならない。
834 :
NAME IS NULL
2016/05/24(火) 18:13:14.00 ID:???
DB仕様の上限めいっぱいまで使い切れるハードとソフトと仕事とか、うらやましいね。



……ごめん、多分仕事はうらやましいとは思えない
835 :
NAME IS NULL
2016/05/24(火) 18:40:04.24 ID:???
「名前の列はnvarcharの何桁にする?」
「16あれば十分かな」
「いや16だと危険かも。32にしとこう」
「俺、日本で一番名前が長い人調べるわ」
「まてまて、ユーザが日本人だけだっていつ決まった」
「nvarchar(max)にしとこうぜ」
836 :
NAME IS NULL
2016/05/24(火) 20:36:32.96 ID:???
>>833
テストすべきって言ってる人ひとりじゃないの?
837 :
NAME IS NULL
2016/05/24(火) 21:57:38.70 ID:???
個人で開発してるなら好きにすれば良いと思う
さすがに会社のプロジェクトでnvarchar(max)使ってるのは見た事ない
838 :
NAME IS NULL
2016/05/24(火) 22:30:30.06 ID:???
>>829
>>801 から読み直せ
839 :
NAME IS NULL
2016/05/24(火) 23:32:11.62 ID:???
DB上はnvarchar(max)はたまに見るけど
普通はアプリ側で入力制限があるから実際にDBMSのテストするようなことはないけど
840 :
NAME IS NULL
2016/05/25(水) 10:18:41.56 ID:???
>>837
視野が狭いね
841 :
NAME IS NULL
2016/05/25(水) 11:38:26.64 ID:???
スレ違いの話題しかないな。
842 :
NAME IS NULL
2016/05/25(水) 12:50:43.86 ID:???
>>839
まあまともなソフトならどこかで上限を設定してるわな
残念ながら >>801 はそう言うことが理解できてないみたいだが
843 :
NAME IS NULL
2016/05/25(水) 12:56:54.42 ID:hsVpZiWL
まともなソフトの特徴
ユーザーに意味のない制約を課さない
844 :
NAME IS NULL
2016/05/25(水) 13:15:14.84 ID:???
path varchar(1024)とかaddress nvarchar(512)とかdescription nvarchar(1024)とかの値が妥当かどうかなんて考慮は激しくどうでもいい
845 :
NAME IS NULL
2016/05/25(水) 13:17:56.53 ID:???
スレ違いの話はそろそろ止めるか
ふさわしいスレに移動して続けるか
どちらかにして
846 :
NAME IS NULL
2016/05/25(水) 13:25:10.77 ID:???
ここ1ヶ月でスレに合致した質問&レスが何個だと思ってんだ
もうここはこういうスレだということを受け止めた方がいい
847 :
NAME IS NULL
2016/05/25(水) 13:28:21.49 ID:???
歯止めがないと、次スレからSLIPありになってしまうだろう
848 :
NAME IS NULL
2016/05/25(水) 13:44:54.21 ID:???
下手に上限決めたりすると、こんなことになるという例。

> Mediumで独自ドメインを使ったサイトの記事が、正常にブックマークできない問題を改善しました

> はてなブックマークはデータベースの構造上、ブックマークできるURLの最大文字数が
> 255文字に設定されています。

少なすぎでしょ。
849 :
NAME IS NULL
2016/05/25(水) 13:46:48.54 ID:???
このスレも設計スレも過疎スレなんだから、いっそのこと統合しろ
850 :
NAME IS NULL
2016/05/25(水) 13:53:06.91 ID:???
次スレタイトルは雑談スレにしよう
851 :
NAME IS NULL
2016/05/25(水) 18:46:13.85 ID:???
>>848
それは上限を決める事に問題があったわけではなく
決めた上限の数値に問題があっただけだが
852 :
NAME IS NULL
2016/05/25(水) 19:17:47.66 ID:???
>>843
それ以前に仕様通りに動くこと

できてない奴がいっぱいいるけど...
853 :
NAME IS NULL
2016/05/25(水) 19:21:06.54 ID:???
>>848
おバカさんwww
854 :
NAME IS NULL
2016/05/25(水) 21:04:23.55 ID:???
次スレの件ですが

http://echo.2ch.net/test/read.cgi/db/1056957157/

ここが雑談スレとして使われています。
まもなく埋まりそうです。
もしもここに次が立つ様ならここに移りましょうか?
855 :
NAME IS NULL
2016/05/26(木) 10:51:31.21 ID:???
>>851
> それは上限を決める事に問題があったわけではなく
> 決めた上限の数値に問題があっただけだが
いや、その通りのことを書いてるんだけど
856 :
NAME IS NULL
2016/05/26(木) 12:12:37.05 ID:???
1行目を見ると>>851の言うとおりだと思うし
最後の行を見ると>>855の言うとおりだと思うし
どっちにも取れる
857 :
NAME IS NULL
2016/05/26(木) 12:30:21.47 ID:LpVjiQ57
元々存在する上限を取り入れる→正しい設計
元々存在しない上限を決める→正しい馬鹿w
858 :
NAME IS NULL
2016/05/26(木) 12:46:53.55 ID:???
>>856
つまりよくない文章ってことだな
859 :
NAME IS NULL
2016/05/26(木) 12:50:47.73 ID:???
おそらく>>835みたいな無駄なやりとりをしたあとで、結局255文字とかいう中途半端な値にしたんだろうろ
860 :
NAME IS NULL
2016/05/26(木) 13:00:09.20 ID:???
URL で 256バイト(文字ではない)の制限があるようなシステムもあるからなぁ
URL エンコードもあるから日本語が含まれると結構簡単に越えちゃう...
861 :
NAME IS NULL
2016/05/26(木) 13:23:13.06 ID:???
スレ違いな話題をいつまでもやめない馬鹿どもは、どうやれば駆逐できるのか
862 :
NAME IS NULL
2016/05/26(木) 14:13:35.10 ID:???
この状況が変わらない限り次スレ不要という事で
863 :
NAME IS NULL
2016/05/26(木) 14:31:16.54 ID:???
次スレ

SQL初心者質問スレ [無断転載禁止]&#169;2ch.net
http://echo.2ch.net/test/read.cgi/db/1462998547/
864 :
NAME IS NULL
2016/05/26(木) 15:30:05.12 ID:???
>>861
ワッチョイつけてNGするぐらいしかないかと。
865 :
NAME IS NULL
2016/05/26(木) 15:52:32.61 ID:???
その前に、SETTING.TXTを直してもらわないといけない
866 :
NAME IS NULL
2016/05/26(木) 16:11:35.94 ID:???
新しい話題はよ
867 :
NAME IS NULL
2016/05/27(金) 09:02:22.51 ID:???
mysqlとsqlserverとpostgreを少しだけ使って見たのだが、簡単なsql文でさえ互換性がない場合が多いよね?
実際の現場ではdbを変えるなんて滅多にないと思うので、sqlの互換性の無さははあまり問題にならないの?
それともsqlコンバーターみたいなのがあるの?
868 :
NAME IS NULL
2016/05/27(金) 09:18:42.46 ID:???
なるべく互換のある書き方をする
869 :
NAME IS NULL
2016/05/27(金) 12:14:48.49 ID:???
理研の税金無駄使い、954万円高級家具カッシーナ・イクスシーの指定購入も大問題 : 千日ブログ 〜雑学とニュース〜
http://1000nichi.blog73.fc2.com/blog-entry-7696.html
税金の無駄遣い?STAP細胞関連経費1億4500万円 小保方晴子氏の検証実験参加は不要だったで書いた理研の税金の無駄使い。
実は小保方晴子さんらのSTAP細胞関連だけでなく、別の問題にも触れられていました。扱いが小さかったんですけど、こちらもすごく問題だと思います。
(中略)
●本来なら大問題である税金の無駄遣い
 この高級家具の件は、小保方晴子さんが買ったのでは?と、STAP細胞疑惑のときにいっしょに話題になったものです。しかし、すぐに東大教授になった別の方のところで購入したものだと、断定されていました。
違っていたら困りますし、名前を出しちゃうとあれかな?と思うので書きませんが、「カッシーナ・イクスシー 東大教授」あたりで検索すると簡単に出ます。もうあだ名が「カッシーナ」という感じになっていました。
「計288個の穴があること」など、実質的に特定のブランド以外を排除した購入など認められるはずがないものであり、本来なら非常に問題です。これは小保方さん問題以上に返金を求めやすくないですかね?
マスコミはこっちの問題ももっと追求すべきだと思います。
870 :
NAME IS NULL
2016/05/27(金) 12:45:19.84 ID:???
>>867
> mysqlとsqlserverとpostgreを少しだけ使って見たのだが、簡単なsql文でさえ互換性がない場合が多いよね?
具体的には?
871 :
NAME IS NULL
2016/05/27(金) 12:53:34.92 ID:???
>>867
sqlsaverにodbcでリンクサーバ貼って
全てsqlsaverでやればいい
872 :
NAME IS NULL
2016/05/27(金) 13:15:39.49 ID:???
>>870
ggrks
873 :
NAME IS NULL
2016/05/27(金) 16:35:02.84 ID:???
>>870
簡単なsql文って辺りは人によって受け止めが違うんだろうな
874 :
NAME IS NULL
2016/05/27(金) 16:35:40.51 ID:???
merge
875 :
NAME IS NULL
2016/05/27(金) 16:36:54.85 ID:???
select 1;
876 :
NAME IS NULL
2016/05/27(金) 17:52:54.44 ID:???
>>873
まあそう言うこと
なので ggrks とか言ってる奴は単なるバカ w

>>874
確かによく使いそうなものの中だとやはり merge とか upsert 辺りかな
簡単かどうかは人によるだろうけど
877 :
NAME IS NULL
2016/05/27(金) 18:20:13.18 ID:???
mergeが簡単ではないとな?
どんだけIQ低いんだよ
878 :
NAME IS NULL
2016/05/27(金) 18:28:44.18 ID:???
>>876
> 簡単かどうかは人によるだろうけど
>>875も人によるのか?
879 :
NAME IS NULL
2016/05/27(金) 18:53:22.57 ID:???
>>867
まずは標準を知るといい。
そうすれば、準拠していないから使えないとか、
これは便利だけど独自拡張だからほかのRDBMSでは使えない可能性があるとか
そういうのが頭に入りやすくなる
880 :
NAME IS NULL
2016/05/27(金) 20:14:20.77 ID:khxvP1pq
標準SQLとOracle方言で揺れているだけだが、いまのSQL規格だとストアドプロシージャもSQLなので、正確に言うとDBMSによって完全にバラバラ。
881 :
NAME IS NULL
2016/05/27(金) 21:00:04.44 ID:???
簡単な SQL って言ってるのにストアドとか...
882 :
NAME IS NULL
2016/05/29(日) 02:23:06.74 ID:6A+VeXJZ
>>881
日本マイクロソフト人事本部シニアマネージャー(名ばかり管理職)の西川昌邦(さいかわまさくに)は犯罪者にして殺人犯だ!!
「あなたのような従業員は会社のパフォーマンスにとってマイナスなので早く死んでください」
などと自殺教唆を公然と行った!! その結果人が死んだ!!
丁寧に言えば何を言ってもいいというものではない!!これはヤクザや借金取りが脅迫をする時に
「いついつまでに金一億円をお振り込みください。命が惜しければ間違った判断をなされないことを期待します」
と発言するのと同じレベルだ!!
しかもそれを注意してやったら、「世間はわれわれの味方だ。文句があるなら訴えてきたらよろしい。メールを電番を公開したければ
どうぞご自由に。世論はわれわれを賛辞するするメールを送付するだろう」
などとイカ様気取りも大概にしろという発言を行った!!
抗議先 日本マイクロソフト人事本部 西川昌邦
メール:masaikaw●microsoft.com
(●を@に置き換えて)
電話:09025411718
883 :
NAME IS NULL
2016/05/29(日) 14:23:38.60 ID:???
初心者は簡単なSQLでもよくわからずに変な書き方するからすぐ互換性なくなるんだよw
884 :
NAME IS NULL
2016/05/29(日) 14:27:55.58 ID:???
初心者が互換性のない書き方するのって難しくない?
885 :
NAME IS NULL
2016/05/29(日) 14:39:44.41 ID:???
そういえばMySQLでのgroup指定に標準じゃない仕様があったっけ
886 :
NAME IS NULL
2016/05/29(日) 15:12:10.23 ID:???
>>884
参考にした web に載ってた SQL が独自仕様使いまくりとかあるんじゃね?
887 :
NAME IS NULL
2016/05/29(日) 17:40:45.77 ID:eJLnBAYe
ネット上の情報が正しいかどうか、スタンダードかどうかの判断ができないレベルなら本でも買って調べてほしいわ。
888 :
NAME IS NULL
2016/05/29(日) 23:03:29.27 ID:0sEDlbel
ハイハイボール 旨いよ店員!
ハイハイボール もう一杯!
ハイハイボール もう一杯ね
ハイハイボール 女の店員さんにつくって欲しいね
ハイハイボール 女店員ね?店員一人でね
ハイハイボール 種類はないの?店員さん?
ハイハイボール 店員一人で1種類
ハイハイボール 店員一人じゃん
ハイハイボール 女店員、入れろよ店長
889 :
NAME IS NULL
2016/05/30(月) 02:14:14.22 ID:bu03jhsY
>>888
日本マイクロソフト人事本部シニアマネージャー(名ばかり管理職)の西川昌邦(さいかわまさくに)は犯罪者にして殺人犯だ!!
「あなたのような従業員は会社のパフォーマンスにとってマイナスなので早く死んでください」
などと自殺教唆を公然と行った!! その結果人が死んだ!!
丁寧に言えば何を言ってもいいというものではない!!これはヤクザや借金取りが脅迫をする時に
「いついつまでに金一億円をお振り込みください。命が惜しければ間違った判断をなされないことを期待します」
と発言するのと同じレベルだ!!
しかもそれを注意してやったら、「世間はわれわれの味方だ。文句があるなら訴えてきたらよろしい。メールを電番を公開したければ
どうぞご自由に。世論はわれわれを賛辞するするメールを送付するだろう」
などとイカ様気取りも大概にしろという発言を行った!!
抗議先 日本マイクロソフト人事本部 西川昌邦
メール:masaikaw●microsoft.com
(●を@に置き換えて)
電話:09025411718
890 :
NAME IS NULL
2016/05/30(月) 02:16:17.26 ID:???
>>885
初心者が気づかずに使いそうといえばそれだろうなぁと思う
891 :
NAME IS NULL
2016/05/30(月) 10:20:15.06 ID:???
標準関数じゃないやつだろうなあ、
ただFIRSTとかTOPとかだけはさっさと共通化して欲しいといつも思ってる
284KB

lud20160605094233
このスレへの固定リンク: http://5chb.net/r/db/1447160858/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「SQL質疑応答スレ 16問目 [転載禁止]©2ch.netYouTube動画>1本 ->画像>2枚 」を見た人も見ています:
SQL質疑応答スレ 15問目
SQL質疑応答スレ 17問目 [無断転載禁止]
Oracle SQL質疑応答スレ
WordPress(ワードプレス)でWebProg 質疑応答スレ 01
MySQL SQL質問応答スレ
PostgeSQL SQL質問応答スレ
SQL Server SQL質問応答スレ
MySQL SQL質問応答スレ ©2ch.ne
MySQL SQL質問応答スレ ©2ch.ne
【LIVE】政府専門家会議会見 4/1 18時半〜(質疑応答中)★2 
AWS Amazon Aurora MySQL スレ
Microsoft SQL Server 総合スレ 4
Microsoft SQL Server 総合スレ 10
Microsoft SQL Server 総合スレ 12
Microsoft Azure SQL Database スレ
Microsoft SQL Server 総合スレ 12
いまの気持ちをSQLで表すスレ (153)
BS日テレ 4752
DB設計を語るスレ 11
DB設計を語るスレ 10
元スマスレ 628 ->画像>34枚
企画モノAVスレ ©bbspink.com
FF5総合スレ Lv171
ぬえキチが画像を貼るスレ ©bbspink.com
Amazon Redshift スレ
へし切り長谷部受けスレ ©bbspink.com
J-CORE総合スレ 16 &copy;2ch.net
過ぎ去りし遊戯王やってる奴スレ
ハードリョナスレ ©bbspink.com
同人音声声優を語るスレ ©bbspink.com
裏垢界隈観察スレ Part.37 ->画像>166枚
半角文字列板の自治スレ ©bbspink.com
専修大学陸上部応援スレ Part.3
デリヘル嬢と不倫してる人のスレ
Oracleサポート契約関連スレ
ろくでなしBLUES強さ議論スレ
ヤンデレ総合スレ 20 ©bbspink.com
ヴァンパイア騎士 樋野まつりスレ
p2.2ch.net総合スレ Part104
RDBMS比較総合スレ 【サーバ】
THEE MICHELLE GUN 艦これスレ ->動画>6本->画像>232枚
Oracle Database 19c以降を語るスレ
無修正は禁止なの?101スレ ©bbspink.com
響けユーフォニアムスレ ©bbspink.com
【PSO2】エロ総合スレ 5 ©bbspink.com
自分の女装晒しスレ その6 ©bbspink.com
毒親や、毒周囲の毒を吐き出すスレ Part6
海外通販 AliExpress 配送スレ 第10
情報システム課・電算課スレ Part9
日本上空の電子密度憂乱指数を見守るスレ
03:54:13 up 15 days, 23:54, 0 users, load average: 14.58, 13.51, 13.21

in 0.022515058517456 sec @0.022515058517456@0b7 on 111817