SQL質疑応答スレ 18問目

1NAME IS NULL2018/01/04(木) 22:12:22.14ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

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

2NAME IS NULL2018/01/04(木) 22:13:25.04ID:???

3NAME IS NULL2018/01/04(木) 22:14:28.52ID:???
よくある質問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
;

4NAME IS NULL2018/01/04(木) 22:15:39.02ID:???
よくある質問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
;

5NAME IS NULL2018/01/04(木) 22:16:40.08ID:???
よくある質問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によって文法がかなり違うので注意

6NAME IS NULL2018/01/04(木) 22:17:39.88ID:???
よくある質問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

7NAME IS NULL2018/01/04(木) 22:48:11.80ID:???
ダメだ
ブロック条件が厳しすぎる
誰か残りのFAQを貼ってくれ

8NAME IS NULL2018/01/05(金) 02:46:10.18ID:???
よくある質問5

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

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

   20100601
   20100602
    ・
    ・
    ・
   20100630

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

9NAME IS NULL2018/01/05(金) 02:47:19.49ID:???
よくある質問5

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ならこれを適当に改変すれば動きますが
 どのみちお奨めしません。

10NAME IS NULL2018/01/05(金) 02:49:13.40ID:???
よくある質問5 (後半の訂正)

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

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

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

11NAME IS NULL2018/01/05(金) 02:50:38.56ID:???
いちおつ
generate_series()関数がダメみたいだな

12NAME IS NULL2018/01/05(金) 21:56:46.58ID:???
前スレ971の回答でも貼っとくか

select T5."T3_ID"  "ID",
    T5."T3_日付" "日付",
    T5."T3_値"  "値",
    T5."T4_日付" "求めたい日付"
from  (select T3."ID"   "T3_ID",
        T3."日付"  "T3_日付",
        T3."値"   "T3_値",
        T4."T2_日付" "T4_日付",
        row_number() over (partition by T3."ID", T3."日付" order by T4."T1_日付" desc) "日付順"
    from  "TableName" T3
        left outer join
        (select T1."ID"  "T1_ID",
            T1."日付" "T1_日付",
            T2."日付" "T2_日付",
            row_number() over (partition by T1."ID", T1."日付" order by T2."値" desc) "値順"
        from  "TableName" T1
            inner join
            "TableName" T2
            on T1."ID" = T2."ID"
            and T2."日付" between add_months(T1."日付", -12) and T1."日付"
        ) T4
        on T3."ID" = T4."T1_ID"
        and T3."日付" > T4."T1_日付"
    where T4."値順" = 1
    or  T4."値順" is null
    ) T5
where T5."日付順" = 1
order by 1,2,3
;

13NAME IS NULL2018/01/06(土) 14:50:55.67ID:???
なるほど
全然速そうだな

14NAME IS NULL2018/01/06(土) 15:46:57.99ID:Os9t48kn
なんでそんな変なのばっかりなの?
ソートが頭から離れないのか。

15NAME IS NULL2018/01/07(日) 01:11:19.54ID:???
>>13
パーティション切ってrow_numberで先頭行だから
オプティマイザの出来次第だけどパフォーマンスに大差はないと思うけど
相関サブクエリとjoinなら同じ実行計画はいたりするし

>>14
はいはい
どうせ正解は書かないんじゃなくて書けないんでしょ

16NAME IS NULL2018/01/07(日) 10:01:46.51ID:yu9dE7vj
なんというレベルの低さ

17NAME IS NULL2018/01/07(日) 12:26:12.96ID:???
>全然速そうだな

変な日本語を何とかしろよ

18NAME IS NULL2018/01/07(日) 14:04:49.83ID:yu9dE7vj
>>15
>>3 を見たのか?

19NAME IS NULL2018/01/25(木) 18:41:52.80ID:heRfYWvO
mysqlでサブクエリを asに代入するとき、常に1カラムしかasできないため
サブクエリだらけになってしまうのですが、これをスマートに1サブクエリとかで取得できませんでしょうか?

SELECT
(
 SELECT
  max(num)
 FROM
  sub_table
) as max_num ,
(
 SELECT
  min(num)
 FROM
  sub_table
) as min_num,
(
 SELECT
 avg(num)
 FROM
  sub_table
) as avg_num
FROM
main_table
↑main_tableに sub_tableの min max avgを盛り込もうとすると
サブクエリだらけになってしまう。

20NAME IS NULL2018/01/25(木) 19:27:52.27ID:???
これでそのSQLと同じ意味にはなる
何がしたいのかはよくわからんが

select sub.*
from (select max(num) as max_num,
       min(num) as min_num,
       avg(num) as avg_num
   from  sub_table
   ) sub
   cross join
   main_table
;

21192018/01/26(金) 09:39:10.20ID:IngnXOhQ
>>20
ありがとうございます!!

22NAME IS NULL2018/01/26(金) 12:43:24.38ID:pxozcjcA
自作自演?

23NAME IS NULL2018/01/26(金) 17:32:37.75ID:???
どうしてそう思ったの?

24NAME IS NULL2018/01/26(金) 20:18:17.38ID:???
感謝ぐらい好きにさせてやれよ歪んでるなあ

25NAME IS NULL2018/01/28(日) 15:06:04.05ID:Qiu5BIxt
明らかに情報不足なのに情報を補完して回答しているからな。

26NAME IS NULL2018/01/28(日) 17:13:34.73ID:27cZ5HqG
それはキミ、情報不足やない、キミの知識不足やろ。

27NAME IS NULL2018/01/28(日) 18:21:25.57ID:qkfYCnFE
>>26
メインテーブルとサブテーブルの結合条件がクロスジョインとは普通、思わない。

28NAME IS NULL2018/01/28(日) 18:34:16.20ID:???
>>27
> メインテーブルとサブテーブルの結合条件がクロスジョイン
え?

29NAME IS NULL2018/01/28(日) 18:55:59.94ID:???
>>19のSQLがクロスジョインだと思えないのは知識不足としか言いようがない

30NAME IS NULL2018/01/28(日) 19:07:37.13ID:???
>>20は何も補完」してないだろ。逆に>>19の意味不明な部分はそのまま字面通り解釈して回答してる。

31NAME IS NULL2018/01/28(日) 19:16:59.64ID:???
>>29
main_table と「sub_table」の cross join だと思ってるなら知識不足以前の話かとww

32NAME IS NULL2018/01/30(火) 17:05:33.92ID:???
やりすぎ防犯パトロール、特定人物を尾行監視 2009年3月19日19時7分配信 ツカサネット新聞
http://headlines.yahoo.co.jp/hl?a=20090319-00000026-tsuka-soci

この記事で問題になった通称やりすぎ防パトは、創価学会と警察署が引き起こしていたようです

掻い摘んで説明すると

・創価学会は、町内会や老人会、PTA、商店会等の住民組織に関し、学会員が役員になるよう積極的に働きかける運動を
 90年代末から開始し、結果、多くの住民組織で役員が学会員という状況が生まれた

・防犯パトロールの担い手は地域の住民と住民組織で、防犯活動に関する会議や協議会には、住民組織の代表に役員が出席する為
 防犯活動や防パトに、創価学会が間接的に影響力を行使可能となった

・防パトは住民が行う為、住民が不審者や要注意人物にでっち上げられるトラブルが起きていたが
 創価学会はその緩さに目をつけ、住民組織を握っている状況を利用し、嫌がらせ対象者を不審者や要注意人物にでっち上げ
 防パトに尾行や監視、付き纏いをさせるようになった

・防パトは地元警察署との緊密な連携により行われる為、創価学会は警察署幹部を懐柔して取り込んでしまい
 不審者にでっち上げた住民への嫌がらせに署幹部を経由して警察署を加担させるようになった

・主に当該警察署勤務と考えられる創価学会員警察官を動かし、恐らく非番の日に、職権自体ないにもかかわらず
 私服警官を偽装させて管轄内を歩いて回らせ、防犯協力をお願いしますと住民に協力を求めて回り
 防犯とは名ばかりの、単なる嫌がらせを住民らに行わせた(防犯協力と称し依頼して回っていた警察官らの正体は恐らく所轄勤務の学会員警察官)
 ※これに加えて防犯要員が同様のお願いをして回る

・こうして防犯パトロールを悪用し、住民を欺いて嫌がらせをさせつつ、創価学会自体も会員らを動員し、組織的な嫌がらせを連動して行った

つまり警察署に勤務する学会員警察官、警察署幹部、創価学会が通称やりすぎ防犯パトロールの黒幕

詳細は下記スレをご覧下さい
やりすぎ防犯パトロールは創価学会と警察署の仕業だった
https://rio2016.5ch.net/test/read.cgi/bouhan/1516500769/

33NAME IS NULL2018/02/04(日) 15:27:38.88ID:gIv0OydZ
質問です
以下のようなTableAとTableBをTableAのIDで結合して、

1. TableBに特定のKEY(ここではKEY=2)が含まれているならそのデータを、
2. 含まれていなければ若いKEYのデータを、
3. KEYそのものが存在しなければNULL

を返す結果を取得したいです
どのようなSQLなら実現しますか?


「TableA」
ID | NAME
--+-------
1 | aaa
2 | bbb
3 | ccc
4 | ddd

「TableB」
ID2 | ID | KEY | DATA
--+----+-----+-----
1 | 1   | 1    | a_key1
2 | 1   | 2    | a_key2
3 | 1   | 3    | a_key3
4 | 2   | 1    | b_key1
5 | 2   | 2    | b_key2
6 | 3   | 1    | c_key1
7 | 3   | 3    | c_key3

「結果」
ID | NAME    | ID2 | DATA
--+---------+----------
1 | aaa | 2    | a_key2
2 | bbb | 5    | b_key2
1 | ccc | 6    | c_key1
3 | ddd | NULL | NULL

34NAME IS NULL2018/02/04(日) 15:29:21.67ID:gIv0OydZ
訂正

「結果」
3 | ccc | 6    | c_key1
4 | ddd | NULL | NULL

35NAME IS NULL2018/02/04(日) 17:18:13.30ID:???
>>33
SQL-Server なら
select T.ID as ID, T.NAME as NAME, T.ID2 as ID2, T.DATA as DATA
from (
select
row_number() over (
partition by TableA.Id
order by
case TableB.[KEY]
when 2 then 0 else 1
end,
TableB.[KEY] asc
) as R,
TableA.ID as ID,
TableA.NAME as NAME,
TableB.ID2 as ID2,
TableB.DATA as DATA
from TableA left join TableB on TableA.ID = TableB.ID
) T
where T.R = 1

36NAME IS NULL2018/02/04(日) 17:38:30.70ID:gIv0OydZ
>>35
ありがとうございます
使用しているのはMariaDB 10.1でしたが(書き忘れ失礼しました)、頂いた解答をヒントに試してみます

37NAME IS NULL2018/02/04(日) 18:26:18.34ID:???
>>36
う〜ん、MariaDB使ったことないけど
https://mariadb.com/kb/en/library/row_number/
を見るとrow_number()は10.2.0以降でないとダメみたい
10.2.0には上げられないの?

38NAME IS NULL2018/02/04(日) 18:33:52.86ID:gIv0OydZ
>>37
こちらもちょうどそこに行き着いてました
バージョンを上げることは可能なので最新版にアップデートして試してみようと思います
わざわざ調べて頂き感謝します

39NAME IS NULL2018/02/14(水) 13:22:57.02ID:???
☆ 日本の、改憲をしましょう。現在、衆議員と参議院の両院で、
改憲議員が3分の2を超えております。『憲法改正国民投票法』、
でググってみてください。国会の発議はすでに可能です。
平和は勝ち取るものです。お願い致します。☆☆

40NAME IS NULL2018/02/15(木) 23:04:18.91ID:???
SQLがなかなか覚えられません
SELECT が先頭に来るのは覚えていますが、
次がFROMか、WHEREか迷ったりします
なにか覚えやすい方法ってありますか?

41NAME IS NULL2018/02/15(木) 23:30:33.91ID:???
暗記

42NAME IS NULL2018/02/16(金) 00:34:33.15ID:???
>>40
順番はきっちり決まってるから覚えれば迷うことはない
それすら覚えられないならマやめた方がいい

43NAME IS NULL2018/02/16(金) 07:59:00.96ID:???
>>41-42
ありがとうございます
覚えます

44NAME IS NULL2018/02/22(木) 17:16:09.65ID:???
集計で、nullがあれば0で、nullが1つもない場合は最大値や最小値を取ってくるような書き方ってないでしょうか?

45NAME IS NULL2018/02/22(木) 18:10:39.74ID:???
>>44
CASE式で

SELECT c1,
CASE (SELECT count( * ) FROM t1 AS a WHERE a.c1 = b.c1 AND c2 IS NULL)
WHEN 0 THEN sum(c2)
ELSE 0 END
FROM t1 AS b
GROUP BY c1

設計見なおしたほうがいいパターンだと思う

46NAME IS NULL2018/02/22(木) 18:30:09.05ID:???
少し違うやり方だけどこっちのほうがパフォーマンスはいいかも。

SELECT c1, CASE sum(c3) WHEN 0 THEN sum(c2) ELSE 0 END
FROM (SELECT c1, c2, CASE WHEN c2 IS NULL THEN 1 ELSE 0 END AS c3 FROM t1) AS t2
GROUP BY c1
ORDER BY c1;

47NAME IS NULL2018/02/23(金) 10:11:31.58ID:???
>>45 >>46
ありがとうございます!
後者の方が問い合わせが少ない感じで良さそうですね。

48NAME IS NULL2018/02/23(金) 21:55:14.87ID:0la0B0YA
uelect文を2つ書いてunion allの方がよっぽど可読性が高い。

49NAME IS NULL2018/02/23(金) 22:08:01.48ID:KWaEL2bi
union言いたすぎてuelectになっちゃう奴カワユスw

50NAME IS NULL2018/02/23(金) 23:22:19.25ID:???
>>48
その可読性が高いやつ提示しなよ

51NAME IS NULL2018/02/24(土) 09:47:28.16ID:???
uelectあるじゃん

52NAME IS NULL2018/02/24(土) 10:02:55.41ID:???
ウェレクト

53NAME IS NULL2018/02/24(土) 19:12:40.41ID:Au0dOZ0B
セレクト 0 as カラム別名 from テーブル名 group by グループ列名 having 列名 is null
union all
セレクト max(カラム名) as カラム別名 from テーブル名 group by グループ列名 having 列名 is not null

54NAME IS NULL2018/02/24(土) 20:27:08.92ID:pUuArQ+S
uelectになるのにビビってセレクトになっちゃう奴カワユスw

55NAME IS NULL2018/02/24(土) 20:41:54.02ID:???
いつもSQL書かずに意味不明なイチャモンだけつけてた人が
珍しくSQL書いたと思ったらやっぱり意味不明なSQLじゃんか
havingの意味分かってないんだろうな

56NAME IS NULL2018/02/24(土) 20:54:00.99ID:pUuArQ+S
>>55
おい勘違いするな
いつも意味不明なイチャモンつけてるアゲは俺だ
アゲだからといってバカと一緒にされては困るなw

57NAME IS NULL2018/02/25(日) 00:08:49.03ID:???
union all期待してたのに。。。こんな結果なの??

>>45のやつはCASE WHEN EXISTSにしたほうがよかったね

58NAME IS NULL2018/02/25(日) 03:10:53.80ID:???
SEなんだが殆ど要件定義とか折衝が主担当だから
SQLの知識があんまりなくていつも効率悪い調査の仕方だったりベンダーさんに投げてしまったりになってしまうんで質問させてください
使用しているのはoracle SQLです。
下みたいなAテーブル、Bマスタがあって
Aテーブル(トラン)
no 名前 上長名前 日付

Bマスタ
名前 社員番号 適用開始日 適用終了日

【抜き出したい情報】
・Aテーブルに1つもない(名前、上長名前)人員の情報(Bマスタの名前、社員番号)
・Aテーブルの名前、上長名前に1以上トランが発生している人員情報、発生件数(名前、上長名前で分ける)

を抽出したい場合はどうすればよいでしょうか?
実業務ではベンダーさんからの報告で解決したのですが次からは自分でも頑張ってみたくて勉強したのですが実際に書こうと思うと全く上手くいきませんOTL

59NAME IS NULL2018/02/25(日) 03:25:04.65ID:???
>>58
とりあえず自分の思うように書いてみ

60NAME IS NULL2018/02/25(日) 03:51:57.01ID:???
>>59
すみません構文もめちゃくちゃだし途中まで書いてわからなくなっちゃったのですが
上から一つ目
select B.名前,B,社員番号 from Aテーブル A inner join Bマスタ B
on A.名前 = B.名前 or A.上長名前 = B.名前
where
A.日付 between B.適用開始日 and B.適用終了日
 
ってとこまで書いて挫折してしまいました・・・・・
COUNT、EXISTSを使えばよさそうだなとは思うのですがどうでしょう?
ちなみに2つ目のはまったく見当もつかない状況です・・・・

元は営業職で今期から情報部に異動してきて勉強はしてるのですがまったくわかりません・・・
本職SEの方の文の書き方の考え方のコツなんかも教えていただけるとうれしいです

61NAME IS NULL2018/02/25(日) 15:25:45.40ID:EdN+hOz0
>>55
having に集計関数と書かずにカラム名と書いたら、見事にそこだけ問題視するんだな。

セレクトと書いているのもSQLインジェクション対策に引っかかるため。

62NAME IS NULL2018/02/25(日) 15:27:53.61ID:EdN+hOz0
セレクト 0 as カラム別名 from テーブル名 group by グループ列名 having グループ列名 is null
union all
セレクト max(グループ名) as カラム別名 from テーブル名 group by グループ列名 having max(グループ名) is not null

63NAME IS NULL2018/02/25(日) 15:29:20.92ID:EdN+hOz0
曖昧質問に対して勝手な想像で要件を決めつけて答えるのはよくない。

そもそもSQLをずばり教えてくれというのが間違い。

64NAME IS NULL2018/02/25(日) 15:31:10.48ID:EdN+hOz0
>>57
select句にselect文を書くのを推奨するな。

65NAME IS NULL2018/02/25(日) 15:37:06.31ID:EdN+hOz0
>>60
あなたが書いているとおりに書けばよい。

なぜ一つのSQLでいきなりやろうとするのか?

66NAME IS NULL2018/02/25(日) 15:39:24.08ID:EdN+hOz0
>>60
3パターンの整理をせよ。

67NAME IS NULL2018/02/25(日) 15:44:37.91ID:EdN+hOz0
>>60
それあなたのいう1つ目もできていない。
少なくともそのSQLにこだわりがあるのなら、内部結合ではなく外部結合しなければ、1つ目も達成できていない。

68NAME IS NULL2018/02/25(日) 15:45:55.07ID:???
>>62
ここで動かしてみてくれよ
そういうクエリでも動くDBMSがあるんならぜひ知りたい
http://sqlfiddle.com/#!17/05796a

69NAME IS NULL2018/02/25(日) 15:46:29.20ID:???
>>64
なんで?

70NAME IS NULL2018/02/25(日) 17:49:37.39ID:fHMtmeQ2
順当にバカが発狂しとるなw

71NAME IS NULL2018/02/25(日) 18:35:17.10ID:???
>>60
1. SQLの研修を受ける
2. 最小限のテストデータを作成して試行錯誤を繰り返す
3. 少し高度なクエリをWebや書籍で学ぶ

まず1と2をやること(>>58のやつはSQLの研修を受講すれば解決できるレベル)
基本的なクエリは問題なく出来るようになってから3に進む
3はミックのブログやセルコの本がおすすめ

72NAME IS NULL2018/02/25(日) 18:36:47.80ID:???
あと要件定義が主な担当なら
SQLの書き方よりもDB設計を学んだほうが役立つ度合いが大きいよ

73NAME IS NULL2018/02/25(日) 21:06:12.14ID:???
>>58
http://sqlfiddle.com/#!9/81ab8/1

2つめはfilter句が使えるDBもあるけど普通はCASE式かな

74NAME IS NULL2018/02/26(月) 00:51:55.29ID:???
>>71
SQLの受講は予定してるけど・・・
ここってそういうの教えてくれる板じゃないの?
勉強法なんて聞いてないんだが

75NAME IS NULL2018/02/26(月) 02:37:26.99ID:???
こいつはクズだね〜w
営業をお払い箱になって情シスでもお荷物だな

76NAME IS NULL2018/02/26(月) 02:57:29.29ID:???
簡単に解決できるレベルとかいって勉強法講釈たれる奴もどうかと思うがな

77NAME IS NULL2018/02/26(月) 14:57:52.44ID:???
>ベンダーさんに投げてしまったりになってしまうんで
とか言ってるやつがこのスレに投げるだけになるんだぜ
鬱陶しいだろ

78NAME IS NULL2018/02/26(月) 16:34:56.99ID:???
問題を解くコツを教えてもらおうとする前に基礎を学べってことだろ
内部結合や外部結合は算数で言えば四則演算レベルの基礎なんだからさ

79NAME IS NULL2018/02/26(月) 19:15:23.41ID:k450wkRK
教えたがりのくせに質問には答えたくないてどないやねんw
そのややこしい承認欲求どうにかしろやw

80NAME IS NULL2018/02/26(月) 20:28:10.94ID:???
>>60だけど
やっぱりSEって気持ち悪いな
ベンダー嬲り倒すことにしたわ
てか早く答えろやwwwPGしかできないアホなんだからこれくらいすぐ答えだせwwwwww

81NAME IS NULL2018/02/26(月) 20:56:37.17ID:???
答え出てるだろww

82NAME IS NULL2018/02/26(月) 20:59:21.87ID:???
>>81
どこが出てるんだよwwwwww
やっぱSEって頭おかしいのしかいないのなwwwwww

83NAME IS NULL2018/02/26(月) 21:13:20.39ID:???
おまえマジかww
回答してくれた気持ち悪いエス・イーさんの親切心台無しだなww

84NAME IS NULL2018/02/27(火) 20:04:14.37ID:???
困ったら黙っちゃうSEさん達現実でも2ちゃんでも同じなんだね・・・・・

85NAME IS NULL2018/02/28(水) 08:09:46.03ID:???
>>44
これでもいける
select c1,
case when count(*) = count(c2)
then max(c2)
else 0
end
from t1
group by c1
order by c1

86NAME IS NULL2018/02/28(水) 16:49:50.76ID:???
>>85
そんな答え出てるものより60でも答えたれや

87NAME IS NULL2018/02/28(水) 18:05:33.63ID:???
60も答えでとるやん

88NAME IS NULL2018/02/28(水) 19:44:20.59ID:F+U9w50n
>>87
それではその答えを31文字以内で示しなさい。

89NAME IS NULL2018/02/28(水) 19:49:58.19ID:???
>>87
どこにでてんだよwwwwww
あほかよSEさんwwwwww

90NAME IS NULL2018/02/28(水) 22:18:01.64ID:???
二人もおるんかww
インターネッツの使い方も知らないんやなwwwププッ

91NAME IS NULL2018/03/01(木) 07:11:43.52ID:???
箇条書きの条件それぞれのsqlつくればいいのか?
それなら簡単じゃね

92NAME IS NULL2018/03/01(木) 07:52:43.33ID:RvibXfFY
簡単じゃねえ!

93NAME IS NULL2018/03/01(木) 11:39:27.35ID:hRou4xtV
これは「SQLの研修行け」の人が正解だったな

94NAME IS NULL2018/03/01(木) 12:18:12.52ID:/b0teX7H
>>93
バカはお口にチャックで

95NAME IS NULL2018/03/01(木) 15:53:17.90ID:???
>>92
どの辺が簡単じゃないの?

96NAME IS NULL2018/03/01(木) 18:35:19.24ID:???
こんな簡単な SQLも教えられないとかゴミしかいないんだなここ
そりゃ営業上がりに馬鹿にされるわけだわ

97NAME IS NULL2018/03/01(木) 18:42:45.36ID:???
>>96
簡単なSQLだからこそ

98602018/03/01(木) 18:53:30.95ID:???
ほらこの答え出るまで
俺居座るからなはやくだせや
他のやつ質問すんなよこれが最優先だから

99NAME IS NULL2018/03/01(木) 18:59:20.56ID:???
お前が質問してからのレスを全部読み返せよ、ゴミ

100NAME IS NULL2018/03/01(木) 19:05:25.93ID:???
簡単なSQLすら理解できない人に教えるとか無理ゲーやろ

101NAME IS NULL2018/03/01(木) 19:22:33.99ID:RvibXfFY
>>100
じゃあ誰に教えんだよw

102NAME IS NULL2018/03/01(木) 19:58:10.36ID:???
>>100
お前最高にアホだな

103NAME IS NULL2018/03/01(木) 20:18:58.38ID:???
>>101
>>102
お前ら池沼にSQL教えられんのか?

104NAME IS NULL2018/03/01(木) 20:26:35.43ID:???
>>58
Bを取り出すSQLを考える
select b.* from b
存在する社員をだす
 exists (select 1 from a where a.名前=b.名前)
本来欲しいのは逆なんだから
select b.* from b
where not exists (select 1 from a where a.名前=b.名前)

105NAME IS NULL2018/03/01(木) 20:45:45.55ID:???
かけ算も割り算も分かってないやつが
四角形と三角形の面積の求め方を教えろと質問してるのと同じ状況なんだよな

かけ算も割り算も分かってないってことが分かってないレベルなら
かけ算がよくわからないので教えて下さいって言えるところまでは最低でも自力で勉強すべき

106NAME IS NULL2018/03/01(木) 20:51:29.51ID:???
例えが全然的を射てないんだよなあ
かけ算と SQL同列に語って池沼に教えるのと同じってw
お前の方がどうかと思うぞ 部下とか後輩から嫌われてない?w

107NAME IS NULL2018/03/01(木) 21:01:35.54ID:???
>>106
ガイジキタ━━━━(゚∀゚)━━━━!!

108NAME IS NULL2018/03/01(木) 21:09:42.85ID:RvibXfFY
悩める教えたがりクン>>105
愛くるしいよぅ〜wwww

109NAME IS NULL2018/03/01(木) 21:09:49.44ID:???
うわっ今どきキターとか使わないで
恥ずかしいから辞めた方がいいよ

110602018/03/01(木) 21:11:32.00ID:???
>>105
このスレ否定しちゃったよwwwwww
アホかwwwwwwお前は2度とここ見なくていいからwwwwww現実で偉ぶってろやwwwwww
みーんなおまえのこと嫌いだろうけどwwwwww

111NAME IS NULL2018/03/01(木) 21:31:25.75ID:???
>>109
キタ━━━━(゚∀゚)━━━━!!

112NAME IS NULL2018/03/01(木) 21:31:45.96ID:???
>>109
キタ━━━━(゚∀゚)━━━━!!

113NAME IS NULL2018/03/01(木) 22:04:21.50ID:???
内部結合/外部結合はかけ算/割り算レベル
それが分からないから難しいと思っちゃうんだろね

114NAME IS NULL2018/03/01(木) 22:08:38.92ID:???
なんで教えてくれたやつをまたスルーしてんの?

115NAME IS NULL2018/03/01(木) 22:50:37.36ID:RvibXfFY
>>114
どんだけお礼欲しがりなんだよw
はいはいありがとうございましたwwww

116NAME IS NULL2018/03/01(木) 22:51:54.37ID:RvibXfFY
ちょっとまて誰だ教えてくれたやつって?
何嘘ついてんだよ騙されたじゃねえか

117NAME IS NULL2018/03/02(金) 00:15:42.26ID:???
>>115
そういうことじゃないだろw

118NAME IS NULL2018/03/02(金) 00:19:18.61ID:???
リアルでよほど抑圧されてんだな
ガンバレよ

119602018/03/02(金) 20:44:32.05ID:???
>>104
答えになってないが?
あほ?

120602018/03/02(金) 20:45:48.81ID:???
>>118
PGSEさんは作業するだけだもんねー
大変だなあwww応援してるよ!頑張ってよ!

121NAME IS NULL2018/03/02(金) 21:51:10.04ID:oDhTFYq0
>>118
お前が頑張れよw

122NAME IS NULL2018/03/02(金) 23:06:21.55ID:ThHddFfe
SQL初心者スレ状態

123602018/03/02(金) 23:08:56.75ID:???
>>122
SQL初心者スレみたいな質問にもまともに答えられる奴が1人もいないってどうなん?

124NAME IS NULL2018/03/02(金) 23:14:33.21ID:ThHddFfe
>>123
データベース板は過疎板だから。いるのはインフラ屋ばかりでSQLはよくわからない。

125NAME IS NULL2018/03/02(金) 23:27:14.54ID:???
回答出てるのにレスが池沼だからスルーしてるだけだろ

12660 ◆YDp73vGOso3d 2018/03/02(金) 23:36:47.57ID:???
なんか俺のふりして頭おかしい人っぽく印象操作してるゴミSEがいるみたいだなトリップ付けとくわ

127NAME IS NULL2018/03/02(金) 23:38:29.13ID:???
>>126
で、回答はわかったの?

12860 ◆YDp73vGOso3d 2018/03/02(金) 23:40:48.89ID:???
>>127
1つ目の質問はこれでできると思うが
2つ目の質問が答え出てないぞ

129NAME IS NULL2018/03/03(土) 08:36:46.58ID:???
104答えたの俺だけど60バカみたいで何も考える気が無いみたいなんで
2つ目答えようとおもったけどやめるわ

13060 ◆YDp73vGOso3d 2018/03/03(土) 11:26:10.35ID:???
正直にできませんでしたってかけや

131NAME IS NULL2018/03/03(土) 12:26:43.72ID:lRXd5Nnq
別にせんでもいいのに5ちゃんでまで出来ない言い訳をしてしまうバカ正直なバカかわゆすw

1321292018/03/03(土) 14:46:46.78ID:???
教えてくださいっていったらおしえてあげる

13360 ◆YDp73vGOso3d 2018/03/03(土) 16:01:20.17ID:???
お前みたいななんの特徴も個性もないゴミSEが名前つけなくていいからね^ ^
名無しに戻って2度と戻ってくんなよ^ ^

134NAME IS NULL2018/03/03(土) 17:41:54.12ID:???
1週間もたってこの程度解決できない奴って
うちの会社だったらありえないわ
去年入った新人ですら余裕で解決できるぞ
やっぱ能力無いやつっているんだな

13560 ◆YDp73vGOso3d 2018/03/03(土) 19:37:31.76ID:???
>>134
な!こんな簡単な問題も解けないとか民度低すぎるわここ
あ!俺はもう SQLなんて民度低い言語勉強するのやめたからお前ら頼むな!

136NAME IS NULL2018/03/03(土) 20:38:19.21ID:???
その能力ない奴に使いっぱにされるSEさん可哀想・・・・・
SEやめよ

1371342018/03/03(土) 21:38:49.47ID:???
>>135
それぞれの名前、上長と結合したカウントをselect句に書けばいいだけだが
それすらかけないんだろw
添削してやるからかいてみろ

138NAME IS NULL2018/03/03(土) 22:33:41.88ID:???
このスレのスルー力のなさは民度低すぎと言われても仕方ないレベル

1391342018/03/04(日) 00:10:24.97ID:???
>>138
御託はいいから書いてみろよw
添削してやるって言ってるだろw

140NAME IS NULL2018/03/04(日) 00:37:32.72ID:???
懲りずにまた他人を語るやつw

141NAME IS NULL2018/03/04(日) 00:38:36.36ID:???
ウェレクト臭がするわ

142NAME IS NULL2018/03/04(日) 00:48:49.97ID:elOR/YZE
ウェレクトまだやっとったんかw

143NAME IS NULL2018/03/04(日) 00:59:59.63ID:aBRPubRf
俺と他人を混同してるようだな。

144NAME IS NULL2018/03/04(日) 01:15:14.67ID:elOR/YZE
なにコイツ有名人気取りかwwwww

145NAME IS NULL2018/03/04(日) 01:24:29.26ID:???
などとウェレクトが申しており

14660改め神 ◆YDp73vGOso3d 2018/03/04(日) 01:32:39.75ID:???
何意味わかんねえ事のたまわってるのお前ら
DB板とかいう糞過疎板とか初めて来たんだがなんだよその恥ずかしいコテ
いいから早く答えだけ書けばいいんだよ

147NAME IS NULL2018/03/04(日) 10:10:03.20ID:elOR/YZE
>>145
あん?あんま調子に乗るなよウェレクトくん?オコっちゃうよオレ

148NAME IS NULL2018/03/04(日) 16:57:22.20ID:???
ずぼしウェレクトw

149NAME IS NULL2018/03/05(月) 14:13:09.19ID:3Wgchkax
データベースのquery limit 75,000って何でしょうか?
ワードプレスを利用していますが、query limit 75,000を超えたとかで表示が制限されてしまいました・・・。

1時間で75000人以上はアクセスできないということでしょうか?
また、今後このようなエラーが起きたいために何かできることはないでしょうか?
不要なプラグインは既に削除しています。

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

150NAME IS NULL2018/03/05(月) 17:41:44.50ID:???
>>149
スレチ
WordPressのスレへどうぞ

1511492018/03/05(月) 19:20:20.57ID:TwTjzndW
いえ、でもmysqlの問題でもあるんですが・・・。

15260改め神 ◆YDp73vGOso3d 2018/03/05(月) 19:27:50.25ID:???
ググれゴミ
今は俺の答え出るまで他の質問受け付けてないから

153NAME IS NULL2018/03/05(月) 20:09:33.69ID:???
>>151
MySQLの問題でもないから
ホスティング会社に問い合わせてね

154NAME IS NULL2018/03/05(月) 20:10:09.44ID:???
>>152
ウェレクトは黙ってて

155NAME IS NULL2018/03/06(火) 05:00:29.05ID:???
>>152
お前、何様?
勝手に仕切んなボケ

156NAME IS NULL2018/03/06(火) 12:33:46.08ID:Ki/iiA5R
【ゴチ大杉漣(66)】 小森常務゜:(つд⊂):゜「致死量の放射能を放出しました」 【ブルマ鶴ひろみ(57)】
http://rosie.5ch.net/test/read.cgi/liveplus/1520303016/l50

15760改め神 ◆YDp73vGOso3d 2018/03/06(火) 20:00:31.31ID:???
うっせえSE如きが意見してんじゃねーよ
はやく答えろやゴミ
ってみんな思ってるからな?wwwそういうふうに思いながら仕事しろよ?wwwwww

158NAME IS NULL2018/03/07(水) 20:56:18.81ID:7USA4bpQ
そろそろ飽きてきたから俺が答えちゃおうかなwいいのか?お前ら?w

15960改め神 ◆YDp73vGOso3d 2018/03/07(水) 21:49:59.76ID:???
はやく答えろや

160NAME IS NULL2018/03/08(木) 07:15:45.81ID:???
アホコテはngにしてるからどうぞお好きに

16160改め神 ◆YDp73vGOso3d 2018/03/08(木) 10:26:18.12ID:???
でたー!wwwwww
NGにしてるで勝ち誇ってるやつwwwwww

162NAME IS NULL2018/03/08(木) 21:47:16.61ID:/+R2cp3T
>>160
ウェレクトは黙っとけまた恥かくぞ

163NAME IS NULL2018/03/09(金) 00:40:28.63ID:???
>>162
君がウェレクトじゃないのか?

164NAME IS NULL2018/03/09(金) 16:53:42.16ID:???
・SQLインジェクション対策はシングルクォートを空白に置換すればOK
・テーブルで年月のみを入れる項目は文字列型で定義
この辺を論破できないので悲しい...

シングルクォートなんてデータ入れねーよ m9(^Д^)プギャー
年月のみならサイズを小さくできるよといわれる

165NAME IS NULL2018/03/09(金) 18:01:49.05ID:???
いろいろヤバイなそれ

16660改め神 ◆YDp73vGOso3d 2018/03/09(金) 18:24:40.67ID:???
>>164
ここ君の日記帳じゃないよ
さようなら

167NAME IS NULL2018/03/10(土) 12:48:06.89ID:???
年月を文字型にすると
・比較相手によってはキャストが必要
・範囲チェックが働かない
・容量が増える

逆に年月を文字列型にするメリットって何かあるの?
あと速度的なとこも気になるね

168NAME IS NULL2018/03/14(水) 12:59:09.36ID:E2z4/zZm
>>164
いまどき数バイト削るためにコンピュータの数値型を使うのは時代錯誤。しかもリレーショナルデータベースでは文字として出力するのが優先だから文字表現でデータを格納するのが基本。

169NAME IS NULL2018/03/14(水) 15:47:30.57ID:???
釣り針がデカすぎ

170NAME IS NULL2018/03/14(水) 18:50:24.54ID:???
え、え〜〜!?
これは救いようもなくヤバイ

171NAME IS NULL2018/03/14(水) 19:40:23.59ID:9cJyYZaB
疑心暗鬼すぎる>>169かわゆすw

172NAME IS NULL2018/03/14(水) 20:12:41.81ID:???
疑心暗鬼? w

17360改め神 ◆YDp73vGOso3d 2018/03/14(水) 20:20:38.93ID:???
気持ち悪い話してないではやく>>60答えろやごみども

174NAME IS NULL2018/03/14(水) 20:24:27.64ID:9cJyYZaB
多くのゴミの中でも本当にゴミと言えるのは>>172だけやでw

175NAME IS NULL2018/03/15(木) 00:28:50.67ID:08yLtO65
>>167
int型の項目値を文字列に変換する方がはるかに負荷が大きい。

17660改め神 ◆YDp73vGOso3d 2018/03/15(木) 00:39:41.41ID:???
正直なそんな低レベルなDB設計してる奴がいるとこで働いてるお前がかわいそうだわ
んでそんな話どうでもいいから早く質問答えろな?

177NAME IS NULL2018/03/15(木) 00:52:07.97ID:???
年月は数字項目にしといたほうがトラブルが少ない。整合性チェックにもなる
文字列にして文字が入ってたりすると日付形式に変換する時エラーになる

178NAME IS NULL2018/03/15(木) 00:54:30.05ID:08yLtO65
>>167
キャストが必要というのもコンピュータの数値型を使っていても、最終的には文字列に変換する。

年月の同士の計算が膨大にあるのであれば理解できなくないが、日付項目同士の比較は日付型で行う。

コンピータの数値表現で扱ってしまうと、まず日付型に変換し、実在しない年月や、1ヶ月前、1ヶ月後、月末日等の特定に2段階のキャストが必要になる。

現実には存在しない年月を生み出してしまうリスクまでとる必要がない。

何度も言うが年月の単純計算などほぼないうえに、文字列に大小判定は気にせず、コンピータの数値ばかりこだわるのはリレーショナルデータベースを理解していないどころか、コンピータを理解していない。

179NAME IS NULL2018/03/15(木) 01:04:17.75ID:???
いつもの人ですねー
お薬出しときますねー

18060改め神 ◆YDp73vGOso3d 2018/03/15(木) 01:37:34.58ID:???
>>60の簡単なSQLも書けないアホが何言っても滑稽なだけですよ^ ^

181NAME IS NULL2018/03/15(木) 04:57:56.45ID:???

182NAME IS NULL2018/03/15(木) 17:36:45.04ID:???
一人で勝手にint型や数値型を持ちだしてそれを的外れな長文で否定w
文脈を理解してないどころか、一般常識を理解していない。

183NAME IS NULL2018/03/15(木) 20:48:02.74ID:S1KKHbYv
バカ必死やねw

184NAME IS NULL2018/03/17(土) 13:49:54.26ID:tBZQagyi
  ★★★根税制による格差解消は、赤犬を根絶しユダヤ支配を永遠に終わらせる為の決め手である。★★★

▲  この掲示板(万有サロン)に優秀な書き込みをして、総▲額148万円の賞金をゲットしよう!(*^▲^)v
  http://jbbs.livedoor.jp/▲study/3729/ →リンクが不良なら、検索窓に入れる!

185NAME IS NULL2018/03/18(日) 00:49:00.65ID:???
>>175
>>178
いつもCPU100%にしちゃうから勉強になります!!

186NAME IS NULL2018/03/18(日) 11:46:44.87ID:a+ovhjNW
それはSQLの書き方がおかしいんだろ

187NAME IS NULL2018/03/18(日) 15:36:28.47ID:???
ホントに文脈も一般常識も理解してないのな

18860改め神 ◆YDp73vGOso3d 2018/03/18(日) 23:26:43.98ID:???
統計情報も取らないアホ集団で仕事してるのはわかったから
はやく俺の質問答えてや^ ^

189NAME IS NULL2018/03/20(火) 22:22:54.01ID:Rscf1saE
>>185
CPUは使うものですよ。

190NAME IS NULL2018/03/20(火) 22:23:50.07ID:Rscf1saE
>>188
統計情報はユーザーが取るものではないぞw

191NAME IS NULL2018/03/24(土) 13:21:59.28ID:GEutIhi9
訳のわからんツッコミにさすがの神もタジタジの様子w

192NAME IS NULL2018/03/25(日) 01:04:30.70ID:yjy1y48X
MySQL (InnoDB) で ALTER TABLE をする際の振る舞いとしてテーブル単位のロックではなくインスタンス全体をロックしているような挙動を示しています
innodb_file_per_table を疑ったが ON だったのですが何が問題なんでしょうか

193NAME IS NULL2018/03/25(日) 01:39:47.58ID:???
>>192
MySQLスレへどうぞ

194NAME IS NULL2018/03/25(日) 17:11:51.29ID:???
>>192
追記:
原因の切り分けが非常に難しく、 AWS RDS を利用しているからこうなっているのか、
それともこの挙動が発生したインスタンスに大量のデータベース・テーブル(150万テーブル以上)が存在していることが問題なのか、
他に見落としている条件がないかを調査している。

195NAME IS NULL2018/03/26(月) 12:26:18.51ID:E8QJAuxE
テーブル数150万てwどうしてそうなったw

19660改め神 ◆YDp73vGOso3d 2018/03/26(月) 18:43:16.56ID:???
>>194
MySQLの問題だからねそれ。
あと今質問打ち切ってるよ?

>>195
150万って別に普通だと思うが?アホ?

19760改め神 ◆YDp73vGOso3d 2018/03/26(月) 18:44:41.84ID:???
ああごめんね。テーブル数150万はないわ。
どんな教育受けてきたん?
はいこの話終わり早く答えて

198NAME IS NULL2018/03/26(月) 21:34:19.88ID:???
>>197
お前は教育受けてないだろ

19960改め神 ◆YDp73vGOso3d 2018/03/26(月) 22:38:34.91ID:???
>>198
そうだね教えを請うたことないわ
いっつも享受する側だわ
スキーマテーブルレコードカラムの違いがわかんないアホがこのスレ使ってんなや!

200NAME IS NULL2018/03/27(火) 07:18:12.07ID:???
まだ居座ってるんだ
このかわいそうな人

201NAME IS NULL2018/03/27(火) 07:21:01.46ID:Sf3AYZp2
間違いを指摘された途端にブチ切れ始めた

202NAME IS NULL2018/03/27(火) 12:28:22.82ID:5YfwV0Ug
「指摘したって言う奴の指摘は大体間違っている」の法則

203NAME IS NULL2018/03/27(火) 12:34:14.84ID:???
意味不明

20460改め神 ◆YDp73vGOso3d 2018/03/27(火) 18:30:19.18ID:???
>>203
こんな簡単なSQLも作れないの?
仕事辞めた方がいいんじゃない?

205NAME IS NULL2018/03/27(火) 19:00:54.47ID:???
SQLの事だと思い込んでいる事も意味不明

20660改め神 ◆YDp73vGOso3d 2018/03/28(水) 21:03:37.12ID:???
>>205
きみ本当のあほみたいだから2度とこないでね

207NAME IS NULL2018/03/28(水) 21:25:27.44ID:???
>>206
150万テーブル作ってろゴミクズ

208NAME IS NULL2018/03/28(水) 21:37:10.33ID:???
>>206
お前生きてる価値無いから死ね

209NAME IS NULL2018/03/28(水) 22:42:12.95ID:???
>>207
書き間違えまで揚げ足取るってやべえなここの民度

210NAME IS NULL2018/03/28(水) 22:45:28.11ID:???
>>196
150万テーブルwww

211NAME IS NULL2018/03/28(水) 23:27:20.25ID:???
普通そんな所書き間違えるなんてしないよ

212◆YDp73vGOso3d 2018/03/29(木) 00:26:29.50ID:???
>>210
お前あほ?俺に安価つけてんなよゴミSEが

213NAME IS NULL2018/03/29(木) 01:27:17.73ID:???
読み間違えた挙句にアホ呼ばわりする人間が民度を語るなよ。みっともない奴だな。

214◆YDp73vGOso3d 2018/03/29(木) 01:35:47.13ID:???
>>213
君名前欄も読めないメクラさんかな?
民度どうこうなんて言ってないんだけど?
文体から伝わってくるんだけど加齢臭口臭やばいでしょあなた?

215NAME IS NULL2018/03/29(木) 03:34:49.63ID:???
>>212
あら「普通」の概念が破綻してる方がまたいらっしゃった

216NAME IS NULL2018/03/29(木) 12:25:25.63ID:siRTS5gv
あら「普通」の概念が堅固なバカがまたいらっしゃった

217NAME IS NULL2018/03/29(木) 12:33:58.03ID:???
>>214
ごめんなさい

218NAME IS NULL2018/03/29(木) 12:34:37.82ID:???
>>216
自己紹介おつ

219NAME IS NULL2018/04/03(火) 20:44:20.13ID:wbI218I7
select A1,A2 from tableA
select B1 from tableB

これをそのまま流すと結果は2行になりますが、
これをA1,A2,B1と1行でとる方法はないでしょうか

220NAME IS NULL2018/04/03(火) 21:07:32.04ID:???
書き忘れましたが、どちらも1行しか返さないSQLです

221NAME IS NULL2018/04/03(火) 21:10:17.03ID:???
>>219
それぞれの実行結果が1行しかないなら

select tableA.A1, tableA.A2, tableB.B1 from tableA, tableB;

222NAME IS NULL2018/04/03(火) 22:07:12.44ID:???
>>221
なるほど、ありがとうございます

223NAME IS NULL2018/04/04(水) 08:04:54.29ID:2HlnMqVc
MysqlがすぐおちるのですがMariaDBにすれば改善されるのでしょうか?

よく出るエラーメッセージはこんなやつです。
mysqli_set_charset(): Error executing query in DBのURL

MariaDBはMysqlに比べてどのぐらい優れているのかもわからないので教えていただければ幸いです。

224NAME IS NULL2018/04/04(水) 13:11:13.69ID:???
>>223
おそらくデータベースに設定している文字セットで不整合があるんだろうと思いますが
MySQLの設定方法に関する質問の場合は、ここで聞くよりも、
MySQL 総合 Part26
https://mevius.5ch.net/test/read.cgi/db/1499949595/
で聞いた方が良いかと思います。

MariaDBに関するスレもあります。覗いてみると良いかもしれません。
https://mevius.5ch.net/test/read.cgi/db/1360677476/

225NAME IS NULL2018/04/04(水) 16:32:49.81ID:+pp14tKO
誤爆かもな

226NAME IS NULL2018/04/04(水) 21:47:48.32ID:???
with句で取得した数列を別のテーブルでその数列と一致するレコードを取得したいんだけどどうすればいいでしょう?
withで別で取得したリスト名Aとし取得結果がBだとすると
select ※ from X
where X.C IN (SELECT B FROM A)
で取得しようとしたんだが上手くいかずいろいろとぐぐってみたけどわからなかったです・・・

227NAME IS NULL2018/04/04(水) 21:48:51.99ID:tDmvnrOB
DB名も書けないとか

228NAME IS NULL2018/04/04(水) 22:51:56.44ID:???
withで別で取得したってのが意味わからん
その部分を含めてどうやろうとしたのか書けば答えようもあるが

229NAME IS NULL2018/04/04(水) 23:31:43.42ID:???
すみません。書き方が悪かったです。
使用しているのはoracleです。
with A AS (SELECT X FROM Z
GROUP BY X)
SELECT COUNT(※) FROM B
WHERE B.C IN(SELECT X FROM A)
のような文を書いてエラーとなりました。
イメージ的にはZテーブル上のXの数列についてBテーブルに何件存在するかを確認したいです。

23060改め神 ◆YDp73vGOso3d 2018/04/04(水) 23:59:17.52ID:???
参考書でも開けばそんくらいわかんだろゴミ
早くお前ら答えろや
スレチの質問には誘導して俺の質問には答えないって根性捻れまくりだろお前ら

231NAME IS NULL2018/04/05(木) 01:39:19.17ID:l3AE4+ue
「Xの数列」という説明が他人には理解できない。

Xがひとつの列だとするとなぜグループ化なのかわからない。

さらに再帰クエリにして、別のSELECT文のINリストのSELECT文にしているのも意図がくみにくい。

かなり単純なことを聞いていると予想はできるが、なぜこんなに難しく考えているのか?

232NAME IS NULL2018/04/05(木) 06:25:28.48ID:???
本当に>>229の通りに書いているならcount(※)がcount(*)の間違いだが
それ以外に致命的な間違いは見当たらない
まあこう書いても同じ意味にはなる
select count(*) from B inner join Z on B.C = Z.X;

233NAME IS NULL2018/04/05(木) 13:53:35.43ID:???
>>231
再帰クエリーないけど?

234NAME IS NULL2018/04/05(木) 19:22:56.90ID:l3AE4+ue
再帰のないWITHを再帰クエリと呼ぶなということか。

ただOracleは再帰があってもなくてもただWITHと書いて、再帰のないWITHと言ったりするからそう書いた。

標準SQLではWITH RECURSIVEと書かないといけないが、Oracleはたしかこの構文がない気がする。

235NAME IS NULL2018/04/05(木) 19:24:12.57ID:l3AE4+ue
他人のミスに厳しいならそう自己紹介してくれ。

236NAME IS NULL2018/04/05(木) 20:02:25.68ID:???
ではまずご自身からどうぞ

237NAME IS NULL2018/04/05(木) 20:52:54.79ID:???
やあ、俺

238NAME IS NULL2018/04/05(木) 21:29:58.31ID:???
>>232
B.CかZ.Xの少なくともどちらかがユニークでないと同じ意味にはならん

239NAME IS NULL2018/04/06(金) 00:33:07.86ID:GwnuWxH/
このスレはSQL入門スレなのかSQLオタクスレなのか?

よくわからない質問に、エスパー回答をするというIT技術者の間ではあまりないやりとりが多い。

240◆YDp73vGOso3d 2018/04/06(金) 01:28:52.77ID:???
テンプレ見ろゴミ
ここは初心者用スレだよ
なのに俺の質問は基礎的すぎるとかいう謎老人のおかげで誰も答えんのや
まじでゴミSEは右ならえの自我すら持たない穢多非人よ

241NAME IS NULL2018/04/06(金) 08:24:33.64ID:???
いつまで粘着してんだ、このキチは

242NAME IS NULL2018/04/06(金) 12:19:44.04ID:1nt8ANDW
>>239
IT技術者の間ではよくわからない質問によくわからない回答をして
お互い納得するのがデフォルトスタンダードですものねw

243NAME IS NULL2018/04/06(金) 12:43:29.95ID:???
ここはわざと言い間違えるスレか?

244NAME IS NULL2018/04/06(金) 12:58:57.72ID:GwnuWxH/
まず質問者が無礼。回答者がとりあえず想像で回答。これがこのスレが機能していない理由。

245NAME IS NULL2018/04/06(金) 13:59:04.00ID:GwnuWxH/
>>240
初心者向けであれば、SQLを回答するのではなく、何をしようとしているのを確認するのが先です。できればいい論をデータベース板で確認するのはおかしいので、プログラム板やプログラマ板で質問すべきです。

246◆YDp73vGOso3d 2018/04/06(金) 20:23:48.23ID:???
>>245
わかったわかったお前の意見とかどうでもいいわ
文体見るだけで中年のごみおっさんってわかるわやばいよ君?

247NAME IS NULL2018/04/06(金) 20:45:46.08ID:???
匿名の掲示板で誰でも書き込めるんだから
気に入らなければスルーすれば良いだけ
質問者が無礼って、お前に害悪を加えてきたわけじゃあるまいし

248NAME IS NULL2018/04/06(金) 21:22:42.32ID:+EV0F8Wd
助けてください。
ACCESSのDBなんですが、
tblAは、[id][なまえ][電話番号][性別][入会日]というフィールド構成のマスター名簿
tblBは、[id][入金日][入金額]というフィールド構成です。

このテーブルを元に、ACCESSやEXCELのVBA上で、

[id] [なまえ] idごとの[入金額]の合計 WHERE 昨日=<[入金日] <= 明日

というレコードセットを取得したいです。
tblBの集計に、tblAからもってきたなまえフィールドをくっつけたい、という感じです。
INNER JOINとか、そういうのを駆使して、なんとかひとつのSQL文を作りたいのですが、
うまくいきません。
どなたか、SQL文そのものをご教示ください。
お願いします。

249NAME IS NULL2018/04/06(金) 21:55:43.69ID:???
>>248
このままだとよくわからん
「誰が」入金したという情報はどこで管理しているの?

250NAME IS NULL2018/04/06(金) 22:00:07.59ID:+EV0F8Wd
>>249
すみません。idというのは、メンバーidのことです。レコードidではありません。
わかりづらくてすみません。

メンバー(マスターで、idから名前がわかる)による入金の記録がBテーブルです。
それぞれのメンバーが、合計でいくら入金したのか、を集計したいのですが、
Bテーブルにはidしかなく、集計表には名前も欲しいので、Aテーブルから持ってきたいのです。

251◆YDp73vGOso3d 2018/04/06(金) 22:08:41.64ID:???
>>250
君質問する以前の問題だよ?
あと今質問受け付けてないからばいばい

252NAME IS NULL2018/04/06(金) 22:09:44.34ID:???
>>250
えーと
同じ日に2件以上の入金はないということ?

253NAME IS NULL2018/04/06(金) 22:12:55.34ID:+EV0F8Wd
>>252
ありえます。
なので、SUM[金額] GROUP BY id としたいです。

254NAME IS NULL2018/04/06(金) 22:20:07.86ID:???
>>253
そもそもテーブル設計がまずいのでは
同じ人が同じ日に同じ金額を入金したらどうなるの?
主キーは?

255NAME IS NULL2018/04/06(金) 23:15:05.62ID:+EV0F8Wd
Bテーブルにはオートナンバーのridフィールドがあります。

256NAME IS NULL2018/04/07(土) 04:28:00.74ID:???
GROUP BY [id],[なまえ]

257NAME IS NULL2018/04/07(土) 09:47:12.83ID:???
>>248
Accessは知らんが一般的なSQLではこんな感じ

select A.id,
    A.なまえ,
    B.合計
from  tblA A
    inner join
    (select id,
        sum(入金額) as 合計
    from  tblB
    where  入金日 between 昨日 and 明日
    ) B
    on A.id = B.id
;

2582572018/04/07(土) 09:48:19.23ID:???
サブクエリ内にgroup by id書くの忘れた

259NAME IS NULL2018/04/07(土) 15:34:15.71ID:???
>>248
accessで作ってやったぞ
これでどうだ。

SELECT tblA.ID, tblA.[なまえ], Sum(tblB.入金額) AS 入金額の合計
FROM tblA INNER JOIN tblB ON tblA.ID = tblB.ID
WHERE (((tblB.入金日)>='2018-04-06' And (tblB.入金日)<='2018-04-08'))
GROUP BY tblA.ID, tblA.[なまえ]
ORDER BY tblA.ID;

260NAME IS NULL2018/04/07(土) 20:09:01.50ID:???
>>259
ありがとう!

261NAME IS NULL2018/04/10(火) 10:35:12.39ID:dRsp0g4C
【シオンの議定書は反日】 『マス・レジャーとクイズを盛んに』 『あなたは極めて優秀だから寝返れ』
http://rosie.5ch.net/test/read.cgi/liveplus/1523323225/l50

262NAME IS NULL2018/04/15(日) 00:36:03.26ID:???
>>4 のよくある質問2で、keyに別テーブル?配列?を指定することはできますか。
(key=3など、BDにない項目のカウント結果は当然ゼロになるが、それも結果として欲しい)

1〜12の数値(月)で集計するとか、47都道府県をキーとするとか、
ニーズはありそうなので方法もあるように思うのですが。

DBは、Google Fusion Tablesです。

263NAME IS NULL2018/04/15(日) 00:56:40.79ID:???
>>262
具体的にテーブルの内容を例示してみて

264NAME IS NULL2018/04/15(日) 01:11:20.64ID:???
outer joinのことを言いたいんだと思う

265NAME IS NULL2018/04/15(日) 01:41:28.73ID:???
OUTER JOIN? …慌ててググる…そうそうそれです!

Google Fusion TablesはWHERE句で関数が使えないなどSQLはやや貧弱なのですが、
OUTER JOINはあるようなので(LEFTだけ?)勉強してやってみます。
ありがとうございました。
https://developers.google.com/fusiontables/docs/v2/sql-reference

266◆YDp73vGOso3d 2018/04/15(日) 17:01:53.04ID:Bs6Qpy/T
おいおいおいおいouter joinとかいう初心者以前の質問には答えて
俺の質問には答えんのかい
お前らほんと捻くれてるな
これだからSEとかいうオタク共はいじめたくなるんだよなあ

267NAME IS NULL2018/04/15(日) 17:33:52.27ID:???
>>58
専門学生の宿題だろこれ?

268NAME IS NULL2018/04/19(木) 00:19:53.73ID:ACyU9sdk
>>266
答えられんのはプログラマーとかゆうコーダーだろ
SEとゆうのは俺様みたいな有能のことたぜボーイ!

269NAME IS NULL2018/04/19(木) 01:05:53.36ID:pgNamYVa
>>268
you?

270NAME IS NULL2018/04/20(金) 20:42:22.38ID:cUph+NAS
>>269
なんや?SE様に何か用か?

271NAME IS NULL2018/04/28(土) 20:00:00.97ID:???
テーブル分割してidなどで紐付けるのが基本なのは分かるんですけど
この値がどのidなのか毎回自分でテーブル確認してinsertするのが大変で困ってます
リストボックスみたいなので'ゆうちょ'を選んだら(bank_id=)3みたいに支援してくれる機能ってSQLでできませんか?
RDBMSはMySQLでLinuxのターミナル使ってます

272NAME IS NULL2018/04/28(土) 21:05:32.03ID:???
それはSQLではなくWeb画面等使って選択させれば良いだろう

273NAME IS NULL2018/04/28(土) 21:36:58.41ID:f64A+t1T
>>271
SQLの話ではないな。

274NAME IS NULL2018/04/28(土) 22:38:37.03ID:???
ACCESSでも使ってろ

275NAME IS NULL2018/04/29(日) 03:58:48.45ID:uDICrjO7
>>271
IDを使わず銀行名でやってみてください。

自分が経験しなければ、なぜそうした方がいいのか、わかりませんよ。

276NAME IS NULL2018/04/29(日) 10:54:53.31ID:???
>テーブル分割してidなどで紐付けるのが基本なのは分かるんですけど

それは分かってるっていうよりメリットデメリット理解しないまま鵜呑みにしてるだけだよね。
どうせ鵜呑みにするなら教科書通りのリレーショナルDB設計から入ればいいのに。

277NAME IS NULL2018/04/29(日) 11:08:37.04ID:???
更新時のレコード件数を減らしたり情報の集約・一元化がメリットですよね。ざっくりとは理解してるつもりです。
ただターミナルからSQLで複数のレコードを追加するには自力でテーブル確認する必要あるのが使いづらいなと思って

278NAME IS NULL2018/04/29(日) 11:34:58.17ID:???
select bank_id from m_bank where bank_name = ’ゆうちょ’

こんなサブクェリーを追加SQLに埋め込む

279NAME IS NULL2018/04/29(日) 12:34:02.47ID:???
>>278
こういうときに副問合せ使うんですね、使いやすそうで凄く良さそう。
早速使ってみます。
ありがとうございます。

280NAME IS NULL2018/04/29(日) 13:38:14.58ID:uDICrjO7
マスタテーブルではないのか?

281NAME IS NULL2018/04/29(日) 14:23:08.00ID:???
>複数のレコードを追加するには自力でテーブル確認する必要ある

これの意味が判らん

282NAME IS NULL2018/04/29(日) 18:36:41.80ID:???
説明下手ですみません。
初心者なのですごく初歩的な質問でした。
取り敢えずサブクエリで解決しましたが一応

habook:
id, money, method_id
...
135, -5000, 58
...

method:
method_id, method_name
...
58, 'ゆうちょ銀行'
...

INSERT INTO habook VALUES (200, -1000, ???)
method_idが多くてゆうちょ銀行のidがパッと思い出せなくて詰まる
methodテーブルを自分で確認してソニー銀行のidを調べてinsertに打ち込む

同じような感じで外部キーの列が増えるとインサートする度に自分で調べる必要があって大変になってきたのでなにかいい方法ないか聞きました。


混乱させてすみません。

283NAME IS NULL2018/04/29(日) 18:57:21.95ID:???
使用しているのはoracle SQLです。
下みたいなAテーブル、Bマスタがあって
Aテーブル(トラン)
no 名前 上長名前 日付

Bマスタ
名前 社員番号 適用開始日 適用終了日

【抜き出したい情報】
・Aテーブルに1つもない(名前、上長名前)人員の情報(Bマスタの名前、社員番号)
・Aテーブルの名前、上長名前に1以上トランが発生している人員情報、発生件数(名前、上長名前で分ける)

を抽出したい場合はどうすればよいでしょうか?

284NAME IS NULL2018/04/29(日) 19:30:40.63ID:???
学校の宿題みたいな設問だな

285NAME IS NULL2018/04/29(日) 19:48:09.61ID:i1PXJR4v
>>282
自分でそういうプログラムを作ればいい。

286NAME IS NULL2018/04/29(日) 19:49:09.41ID:i1PXJR4v
>>284
トランザクションデータをトランと略しているあたりから、どこかの会社だろう。

287NAME IS NULL2018/04/29(日) 19:49:26.43ID:ccXAu8y/
同姓同名には考慮しなくて良いの?

288NAME IS NULL2018/04/29(日) 19:51:35.86ID:i1PXJR4v
>>283
外部キーが社員番号ではなくて名前なのはネタだからか?

289NAME IS NULL2018/04/29(日) 22:10:20.38ID:???
>>282
どのぐらいの頻度でSQL使うかわからんけど、こんなのでもいいんかね
insert into habook(id, money, method_id)
select 200, -1000, method_id from method where method_name='ゆうちょ銀行'

290NAME IS NULL2018/04/29(日) 22:12:28.42ID:???
>>283
>>58と同じみたいなんだが、いまだにわからないのかw

291NAME IS NULL2018/04/29(日) 22:15:33.56ID:???
銀行は銀行名の変更とか合併とかあるから
そういった事も考えないといけない

292◆YDp73vGOso3d 2018/04/30(月) 03:17:07.21ID:???
お前らはどうしても俺の質問には答えたくないみたいだな

293NAME IS NULL2018/04/30(月) 08:36:43.41ID:???
頼み方ってものがあるだろ
ほら言ってみろ

294NAME IS NULL2018/04/30(月) 10:55:57.85ID:FupcYnE7
コメントが一杯付いてて良かったじゃないか

295NAME IS NULL2018/04/30(月) 14:55:41.60ID:???
下みたいなAテーブル、Bマスタがあって
Aテーブル(トラン)
no 名前 上長名前 日付

Bマスタ
名前 社員番号 適用開始日 適用終了日

【抜き出したい情報】
・Aテーブルに1つもない(名前、上長名前)人員の情報(Bマスタの名前、社員番号)
・Aテーブルの名前、上長名前に1以上トランが発生している人員情報、発生件数(名前、上長名前で分ける)

を抽出したい場合はどうすればよいでしょうか?

296NAME IS NULL2018/04/30(月) 14:57:09.24ID:???
>>295
同じ名前の社員がいたとき、どうすれば良いの?

297NAME IS NULL2018/04/30(月) 15:03:04.31ID:???
結婚とか離婚して姓名変わったらどうすんだ

298NAME IS NULL2018/04/30(月) 17:56:27.86ID:???
もうここしか頼るところがございません。
SQL server7.0が、綺麗にwin10のPCだけつながらなくなりました。
「接続できませんでした。 SQL state'ST100'
SQL server エラー0
[microsoft][ODBC SQL server driver] ログインが時間切れになりました」
と出ます。どうすればいいのでしょうか

299NAME IS NULL2018/04/30(月) 18:22:54.57ID:???
>>298
20年前の製品とか捨てちまえ

300NAME IS NULL2018/04/30(月) 18:35:50.58ID:???
>>296
>>297
それぐらい自分で考えろ

301NAME IS NULL2018/04/30(月) 19:16:11.68ID:L8ngFuqq
>>298
ああこれはログインが時間切れになってるね
ログインが時間切れにならないように注意しなよ

302NAME IS NULL2018/05/01(火) 08:40:04.60ID:???
>>298

なんでこの板まで来て

Microsoft SQL Server 総合スレ 11 [無断転載禁止]&#169;2ch.net
https://mevius.5ch.net/test/read.cgi/db/1464508208/

に行かないの?

303NAME IS NULL2018/05/04(金) 20:14:40.86ID:???
外部キーって必ず他のテーブルの主キーじゃないとダメなの?

304NAME IS NULL2018/05/04(金) 21:31:51.25ID:???
主キーでなくてもUNIQUE制約がついていれば大丈夫だと思う

305NAME IS NULL2018/05/04(金) 22:29:19.11ID:GLAEl09j
>>303
>>304
これ自分も知りたいからageてみるか

306NAME IS NULL2018/05/05(土) 00:10:26.39ID:T65X27xi
>>303
一意制約の列でもよい。要は重複値を持っている列では外部キー制約に使用できない。

3073032018/05/05(土) 01:36:42.07ID:dfGZW7dT
>>304
>>306
ありがとうございますm(_ _)m

308NAME IS NULL2018/05/10(木) 23:54:50.05ID:???
DB殆ど触ったことないので分からないのですが、
1. SQLでは[ユーザー名, パスワード, [データA], [データB]] (便宜的にリスト形式にしています)
のようなDB構造は作れるのでしょうか?

つまり、ユーザー名とパスワードは1ユーザに1つずつ、データA,B,C、、、は内部に複数のデータを持つような構造です
ちなみに扱いたいSQLはpostgreSQLです

2. node.jsとpostgreSQLを使ってウェブアプリを作ろうと思っているのですが、postgreSQLでは最初にDB構造の宣言などはしなくて良いのでしょうか?

Swift + RealmでDBを使った際には、ユーザーモデルっていうDB構造?を宣言してから使ったので、少々混乱しています

3. node.jsとpostgreSQL(npmで)をWindowsにインストールしたのですが、postgreSQLが動きませんでした
WindowsにもpostgreSQLをインストールしなければいけないのでしょうか?


よろしくお願いします

309NAME IS NULL2018/05/11(金) 03:50:27.46ID:JrURJydT
MySQLです。数値を計算するSQL文ってあるでしょうか?

例えば、rankingテーブルに「access」と「click」というカラムがあるとします。
accessは×1でclickは×5にして、その合計数値が多い値(降順)で表示

みたいなことがしたいです。

310NAME IS NULL2018/05/11(金) 05:53:20.74ID:6wqBIw87
>>308
まずはDBを触りましょう
SQLではと書いているということは他ならわかるのでしょうか
RDBでは一般的に
[ユーザーID,ユーザー名,パスワード]
[ユーザーID,データ番号,データ]
のようなテーブルを作成してユーザーIDで結合します
これを正規化といいます

>>309
素直に
order by (ranking.access + ranking.click * 5) desc
でいけるかと

311NAME IS NULL2018/05/11(金) 17:09:15.29ID:???
SQL初心者です。
連続して1が立っている時間
(行数、データ数)は求められないでしょうか。
1が出てきたタイミングで後どれだけ続くかをその行に書き込みたいです。

312NAME IS NULL2018/05/11(金) 21:47:33.52ID:???
>>310
いけました!orderに計算するって概念がありませんでした。
とても勉強になりました。ありがとうございます

313NAME IS NULL2018/05/12(土) 09:16:12.16ID:???
>>311
どういうテーブル、イメージしてるデータの並びを書かないとレスつかないんじゃないか

314NAME IS NULL2018/05/12(土) 20:19:54.53ID:???
>>313
ありがとうございます。

A B
0 0
0 0
1 3
1 0
1 0
0 0
0 0

AからBを作りたいです。
Bの3は1が3つ続いていることを意味します。

315NAME IS NULL2018/05/12(土) 21:14:06.97ID:???
>>314
順序も規定せずに 「続いてる」とか言われてもなあ
Excel + VBA とかでやれば?

316NAME IS NULL2018/05/12(土) 21:22:35.67ID:???
>>314
連番がなければsql では無理

317NAME IS NULL2018/05/12(土) 21:39:12.17ID:???
>>315
>>316
No A B
0 0 0
1 0 0
2 1 3
3 1 0
4 1 0
5 0 0
6 0 0
7 1 2
8 1 0
9 0 0

例えばこの様な連番が有れば出来るものでしょうか。

すみません。
SQLで出来るのか?
出来るならどのような方法が有るのか
知りたいです。

よろしくお願いします。

318NAME IS NULL2018/05/12(土) 22:16:46.98ID:???
>>317
これで
2 1 3
7 1 2
がとれたらいいわけ?
時間っていってたわりにはそういう結果をかいてないが

319NAME IS NULL2018/05/12(土) 22:19:25.26ID:???
あとDBは何かしりたい

320NAME IS NULL2018/05/12(土) 22:28:15.77ID:???
最新の(つまりinsertする前の)NoでAが1で、かつ追加するデータのAが0だったら
直前のAが0のデータのNoを見る
例ならNoが9の時に0になったから直前のAが0のデータはNoが6だと。
んで、7,8が連続したものだった
だからNo7のBに2をセット

こんな感じ?

321NAME IS NULL2018/05/12(土) 23:17:44.19ID:???
>>318
分かりにくく申し訳ありません。
元々時系列のデータだったので
時間という書き方をしていました。
(何個続いたか知りたいのです)

NOとAの項目がある状態でBの項目
を追加したいと思っています。

318様のような結果でも構いません。

>>319
MSのSQL Serverです。申し訳ありませんが詳細なバージョンなどは不明です。

>>320
ありがとうございます。
書かれているようなことが
実現できればと思います。

322NAME IS NULL2018/05/12(土) 23:18:49.98ID:???
>>317
SQL文でやるならレコードを次々と参照しないといけないから再帰SQL使わないとだめだろうな
あるいはプロシージャでカーソル使う
あるいはプログラムでやる感じになる

323NAME IS NULL2018/05/13(日) 00:03:02.98ID:???
SQL Serverでなく、MySQLです、済みません。テーブル名はtと仮定しました。

create procedure setB()
begin
 declare done int;
 declare _flag int;
 declare _cnt int;
 declare _a int;
 declare _no int;

 declare cur cursor for select No,A from t order by No desc;
 declare exit handler for not found set done = 0;
 set done = 1;
 set _flag = 0;
 set _cnt = 0;
 
 open cur;
 while done do
  fetch cur into _no, _a;
  if _a = 1 and _no > 0 then
   update t set b = 0 where No = _no + 1;
   set _cnt = _cnt + 1;
  else
   update t set b = _cnt where No = _no + 1;
   set _cnt = 0;
  end if;
 end while;

 if _a = 1 then
  update t set b = 0 where No = _no;
 else
  update t set b = _cnt where No = _no;
 end if;
 close cur;
end;

324NAME IS NULL2018/05/13(日) 05:37:55.80ID:???
>>322
ありがとうございます。
教えていただいたキーワードをもとに
調べてみます。

>>323
ありがとうございます。
今はPCをさわれる環境にないので月曜日に試してみたいと思います。

325NAME IS NULL2018/05/13(日) 07:21:58.29ID:???
>>322
再帰やストアドなんて要らんでしょ
>>318 の結果を得たいだけなら

select
 T1.NO, T1.A,
 (
  select min(T3.NO) as NO
  from T as T3
  where T1.NO < T3.NO and T1.A <> T3.A
 ) - T1.NO as [連続数]
from T as T1
inner join T as T2 on T1.NO - 1 = T2.NO and T1.a <> T2.a
where T1.A = 1

で十分でしょ (わかると思うけど表名は T ね)

326NAME IS NULL2018/05/13(日) 09:51:48.44ID:???
>>325
ありがとうございます。
試してみます。

327NAME IS NULL2018/05/13(日) 11:09:02.63ID:???
再帰SQLでやるならこんな感じ
最初に1がでたところで表示したいとのことなので
レコードの最後から加算積み上げてる
半角でレスしようとしたらインジョクションかなんかでエラーになった
ため全角に変換してます

WITH CTE AS (
SELECT NO,A,A AS B 
FROM TBL AS M

UNION ALL 
SELECT M.NO ,M.A ,S.B + 1 AS B −−Bを1で積上げていく
FROM TBL AS M
inner join CTE AS S
on  M.NO = S.NO −1 −−レコードの後ろから参照
and S.A = 1
and M.A = 1

), [WK1] AS (
SELECT NO,A,max(B) as B −−Bが積上開始位置により別々の数字になっているので最大値でサマリー
FROM CTE AS M
GROUP BY NO,A


SELECT M.NO,M.A,case when S.A = 0 then B else 0 end B −−前のレコードがゼロの時のみBを表示
FROM [WK1] AS M
LEFT JOIN TBL AS S
on M.NO −1 = S.NO 
ORDER BY M.NO

328NAME IS NULL2018/05/14(月) 10:07:01.26ID:???
>>325
>>327
ありがとうございます。どちらも思ったような結果が得られました。
>>323
ありがとうございます。
今回は動かせていませんが、MySQLをさわる機会に試してみます。

4月末よりSQLを使わなければいけなくなり、困っていました。
皆さんに教えていただいた方法を理解し自由にSQLが書けるよう頑張ります!

329NAME IS NULL2018/05/17(木) 11:36:55.43ID:???
教えて下さい。

下記の表Tに於いて
NO,START,STOPが与えられているとき
KEKKAという行を得たいです。
良い方法があれば教えてください。
(STARTからSTOPの間に1を立てたい)
DBはMicrosoft SQL Serverです。

NO START STOP KEKKA
1 0 0 0
2 0 0 0
3 1 0 1
4 0 0 1
5 0 0 1
6 0 1 1
7 0 0 0
8 0 0 0

よろしくお願いします。

330NAME IS NULL2018/05/17(木) 15:57:54.69ID:???
>KEKKAという行を得たい

????????

331NAME IS NULL2018/05/17(木) 16:33:50.08ID:???
>>330
わかりにくくてすみません。
KEKKAという項目は元のデータにはなく、この項目を生成したいです。

332NAME IS NULL2018/05/17(木) 19:41:40.74ID:???
STARTとSTOPは1件ずつしかないのか?

順序はNO順でいいのか?
NOは連番なのか?

333NAME IS NULL2018/05/17(木) 22:05:10.46ID:???
START、STOPは必ず1レコードあり、複数はない
って事なら、簡単なSQLで処理できそう

334NAME IS NULL2018/05/17(木) 22:12:42.54ID:???
>>332
STARTとSTOPは複数あります。
NO順です。
NOは連番です。
STARTが1である行とSTOPが1である行は必ず交互に来て、
STARTとSTOPが同時に来ることはありません。
STARTが1の行とSTOPが1の行は続くことがあります。
STOPが1の行の直後にSTARTが1の行が来る場合もあります。
STARTが1の行の数とSTOPが1の行の数は同じです。
NO順に先頭から見ていくと、STARTが1の行は、STOPが1の行より先に出現します。

よろしくお願いします。

335NAME IS NULL2018/05/17(木) 22:21:17.05ID:???
>>334 で何をやりたいかはだいたいわかったけど
(たぶん STARTしてからSTOPするまで KEKKAを1にすればよいはず)
行順を保持しつつ状態遷移させるのって普通のSQLでできるのだろうか?

336NAME IS NULL2018/05/17(木) 22:27:50.57ID:???
START、START、STOP、STOPって並びになったときはどうすんの?

337NAME IS NULL2018/05/17(木) 22:28:51.14ID:???
334見てなかった、すまん

338NAME IS NULL2018/05/17(木) 22:51:31.55ID:???
>>334
スタートがあったら1加算ストップがあったら1減算する累積計算すればいいじゃねえ
select no sum( start + end * -1) as kekka from t as m
left join t as s
on t.no<=m.no
group by no

339NAME IS NULL2018/05/18(金) 01:30:58.99ID:???
>>338
いろいろ細かいミスは置いといて、それSTOPの行が1にならんだろ

>>329
select NO,START,STOP,
(select isnull(sum(START),0) from t where t.NO <= m.NO)-
(select isnull(sum(STOP),0) from t where t.NO < m.NO) KEKKA
from t m
とかで出来んじゃね

340NAME IS NULL2018/05/18(金) 10:08:58.76ID:???
ありがとうございます。
皆さんに教えていただいた方法を試していますが、うまく行きそうです。
ありがとうございました。

341NAME IS NULL2018/05/18(金) 17:13:55.57ID:???
・DBMS名とバージョン
10.1.16-MariaDB

・テーブルデータ
テーブル:categories
cateid  catename   
----------------
1     c1
2     c2
3     c3
4     c4
5     c5
6     c6
7     c7
8     c8

テーブル:books
cateid  bookname price
--------------------
1     b11     20
1     b12     10
1     b13     30
1     b14     40
1     b15     5
2     b21     20
2     b22     10
2     b23     30
2     b24     40
2     b25     5


・欲しい結果
cateid   catename bookname price
--------------------------------
1     c1      b14     40
1     c1      b13     30
1     c1      b11     20
2     c2      b24     40
2     c2      b23     30
2     c2      b21     20

・説明
categoriesとbooksをcateidで結合。結合の順番はbooksのpriceの降順とし、更にその結合する数の上限を3としたいのですが、どういうSQLになりますか?

ちなみに↓のようなSQLを思いつきましたが上手く行かず・・・
SELECT *
FROM categories
    LEFT JOIN (SELECT * FROM books ORDER BY price DESC LIMIT 3) books
    ON (books.cateid = categories.cateid)
priceでのソートはできてるんですが、LIMITが期待通りには機能しませんでした
まあそれもそのはず・・・これではbooksテーブル全件の上位3件を拾ってこいというクエリですからね

342NAME IS NULL2018/05/18(金) 21:21:55.34ID:???
select
 t1.cateid, catename, t1.bookname, t1.price
from books t1
join category c on c.cateid=t1.cateid
where 3 >= (
 select count(*)
 from books t2
 where
  t1.cateid = t2.cateid and
  t1.price <= t2.price
)
order by cateid, price desc;

343NAME IS NULL2018/05/20(日) 02:31:03.55ID:???
>>342
できました!ありがとうございます!

344NAME IS NULL2018/05/29(火) 11:29:58.81ID:???
table data_pool
code bb_date   baibai  suuryou
111  2018/04/01   3  2000
111  2018/04/03   1  1000
222  2018/04/05   3  1000
222  2018/04/09   3  2000
333  2018/05/01   3  5000

(PK code + bb_date)
baibai 1 売り 3 買い
月単位で集計するときにbaiba=1はマイナスとして集計し
111  2018/04  1000
222  2018/04  2000
333  2018/05  5000
のような結果を得たいのですがどう書けばいい?(mysql)

3453442018/05/29(火) 11:31:34.61ID:???
間違い
222  2018/04  3000
です

346NAME IS NULL2018/05/29(火) 12:22:53.17ID:x6Mfbf1/
こういう時に間違える人って

347NAME IS NULL2018/05/29(火) 12:41:29.95ID:???
おっちょこちょいなんだろうな
> baiba=1
とか書いてるし w
でも、欲しい結果をちゃんと書いてるのはいいことだと思う

MySQLはよく知らんけど
select
code,
date_format(bb_date, '%Y/%d'),
sum(
case baibai
when 1 then -suuryou
when 3 then suuryou
end
)
from data_pool
group by code, date_format(bb_date, '%Y/%d')
とかで行けるんじゃね?

348NAME IS NULL2018/05/29(火) 14:04:09.72ID:???
date_format の所、%Y/%m だな。
2カ所直せば大丈夫だろう

3493442018/05/29(火) 14:07:06.19ID:???
重ね重ねの間違いお恥ずかしいw
有難うございます
%d を %m にして欲しい結果を得ることが出来ました。感謝

350NAME IS NULL2018/05/31(木) 20:59:32.14ID:???
毎日の果物の価格を記録するデータベースを作りたいんですがどういうテーブルをつくったらいいですか?とりあえずitemsテーブルに果物の種類とidのカラムを作ります。
毎日の価格はどういうテーブルにしたらいいですか?

351NAME IS NULL2018/05/31(木) 21:13:08.20ID:???
>>350

DB設計を語るスレ 10 [無断転載禁止]&#169;2ch.net
https://mevius.5ch.net/test/read.cgi/db/1495438711/

まぁ叩かれるとは思うが…

352NAME IS NULL2018/05/31(木) 21:18:17.81ID:???
>>351
スレチでしたかすんません

353NAME IS NULL2018/05/31(木) 21:20:45.86ID:???
DB設計を語るスレ 10
https://mevius.5ch.net/test/read.cgi/db/1495438711/

聞くなら、こちらの方が良いかもしれない

354NAME IS NULL2018/05/31(木) 21:21:57.55ID:???
被ってしまった、すまん

355NAME IS NULL2018/05/31(木) 21:27:38.54ID:???
>>354
ありがとうございますそっちで聞いてみます、

356NAME IS NULL2018/05/31(木) 22:01:13.46ID:???
まあどっちの住人もたいして変わらんからここでも良いとは思うけど
> 毎日の果物の価格を記録するデータベースを作りたいんです
とか意味がわからん
そのデータベースでどう言うことをしたいいのか、とかどういう結果が欲しいのかを書けよ...

357NAME IS NULL2018/05/31(木) 22:14:37.43ID:trgN2RKZ
またバカがごねとるw

358NAME IS NULL2018/06/01(金) 05:31:44.28ID:VfzZdde5
クリエ通知ってどうやるの?

359NAME IS NULL2018/06/06(水) 21:29:03.80ID:???
relatedなカラムにむこうのテーブルにないものをinsertすると勝手に登録してくれますか?

360NAME IS NULL2018/06/07(木) 14:54:12.56ID:???
しばらく考えてしまったが
やはり意味が分からなかった
誰か解説頼む

361NAME IS NULL2018/06/07(木) 15:10:39.40ID:???
リレーションで外部キーに存在しないものを挿入したら
どうにかしてくれるのかってことだべ
制約にならんと思うんだが、、、トリガで自分で追加するようにすればいけるかもね

362NAME IS NULL2018/06/08(金) 03:47:57.75ID:Ywf/F+oU
皆さんがアンケートの答えを格納するテーブルを作るとしたら
未回答は、nullを想定しますか?0を想定しますか?
理由も教えてください!

363NAME IS NULL2018/06/08(金) 09:49:12.26ID:???

364NAME IS NULL2018/06/10(日) 09:42:21.89ID:???
>>361
on insert cascade か。他のカラムはどうすんだろ

365NAME IS NULL2018/06/10(日) 10:20:33.83ID:???
null なり default 値なりにするんだろ

366NAME IS NULL2018/06/10(日) 20:58:20.60ID:???
主キーはどうするんだ

367NAME IS NULL2018/06/10(日) 21:58:41.22ID:???
>>366
identity とかでいいだろ
てか insert と同じだろ

368NAME IS NULL2018/06/14(木) 13:13:32.45ID:???
自動採番のあるテーブルにインサートした場合、その番号を知るには別途selectするものですか?

369NAME IS NULL2018/06/14(木) 16:10:12.12ID:???
そもそも自動採番ってSQL標準じゃない気がするし
DBMSによるんじゃね

370NAME IS NULL2018/06/14(木) 18:37:24.82ID:???
>>368
普通は採番された番号を取得する機能が提供されてる
でないと単純なログみたいにその番号以外の部分には重複を許す列しかないと検索しようがないから

371NAME IS NULL2018/06/15(金) 10:36:36.02ID:???
>>368 です。
自分の使うデータベースで探したらありました。
自動採番ってあるの普通だと思ってたので勉強になりました。

372NAME IS NULL2018/06/17(日) 00:34:30.36ID:DF4YrmFv
こういう常時、一人しか使っていないと思っているひとは、なんなんだろうな。

373NAME IS NULL2018/06/17(日) 00:58:11.39ID:YrBEhWbQ
こういう常時、で読点打つキチガイはバカなんだろ、うな。

374NAME IS NULL2018/06/17(日) 11:52:51.97ID:???
バカだからイミフなんですね

375NAME IS NULL2018/06/19(火) 19:16:06.54ID:???
n+1問題ってなんやねん

パフォーマンス低下したら何がいけないの?

376NAME IS NULL2018/06/19(火) 19:17:03.49ID:???
何回もデータ分だけ引くの何がいけないの?
ハードが優秀なら別にいいんじゃないないの?

377NAME IS NULL2018/06/19(火) 23:22:26.54ID:NrZ3i0Js
それでええんやで

378NAME IS NULL2018/06/24(日) 19:08:35.72ID:???
助けてください。自分の力量だと解決できず

データ
日付,オーダ番号,個人名.エラーA,エラーB,エラーC
0601,00001,タナカ,エラーA発生,,
0601,00002,イトウ,,エラーB発生,
0601,00003,サトウ,,,エラーC発生
0602,00004,タナカ,エラーA発生,,
0602,00005,イトウ,エラーA発生,,
0602,00006,スズキ,エラーA発生,,

このとき、個人別にエラー回数の内訳を出したいのです。
個人名, エラー1回目, エラー2回目, エラー3回目,…
タナカ,エラーA,エラーA,,
イトウ,エラーB,エラーA,,
サトウ,エラーC,,
スズキ,エラーA,,

使用DBはMYSQLですがストアドは使えないという制約があり
エラー回数は動的に延ばせればという要望がありますが、5回で止めてもOKです。

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

379NAME IS NULL2018/06/24(日) 21:18:41.09ID:???
select
個人名,
max(case カラム番号 when 1 then エラー end) as エラー1回目,
max(case カラム番号 when 2 then エラー end) as エラー2回目,
max(case カラム番号 when 3 then エラー end) as エラー3回目,
max(case カラム番号 when 4 then エラー end) as エラー4回目,
max(case カラム番号 when 5 then エラー end) as エラー5回目
from (
select
個人名,
case
when not エラーA is null then 'エラーA'
when not エラーB is null then 'エラーB'
when not エラーC is null then 'エラーC'
end as エラー
row_number() over (
partition by 個人名
order by 日付 asc, オーダ番号 asc) as カラム番号
from エラー履歴
)
group by 個人名

380NAME IS NULL2018/06/25(月) 19:53:25.00ID:???
よろしくお願いします。

381NAME IS NULL2018/06/25(月) 21:07:08.21ID:???
こちらこそよろしくお願いします。

382NAME IS NULL2018/06/25(月) 22:01:22.79ID:???
>>379
ありがとうございます!できました!!!
どうしてこんなクエリが思いつくんですか。すげぇですね!

383NAME IS NULL2018/06/26(火) 16:30:55.58ID:???
質問です。
tableA
id

tableB
id, A.id

tableC
B.id, col1

のような、A-B-Cと、親-子-孫の関係で、子孫になるほど関連する行が1対多数になっていくテーブルで、

Bの1レコードにたいして、Aの情報と、Cのcol1がnullでない数の情報が欲しいのですが、
LEFT OUTER JOINでどう書けばいいでしょうか?

SELECT t1.x, t2.x, t3.nullでない数
FROM B t1
LEFT OUTER JOIN A t2
ON t1.A.id = t2.id
LEFT OUTER JOIN
(SELECT COUNT(col1) AS nullでない数 FROM C WHERE Bid = t1.id) t3
ON t3.B.id = t1.id

みたいな事がやりたいのですが、クエリはエラーになってしまいます。

3843832018/06/26(火) 16:58:48.22ID:???
FROM C WHERE Bid = t1.id) t3
の部分で、「t1はここから参照できない」みたいなエラーです。

3853832018/06/26(火) 17:50:23.15ID:???
自己解決しました
(SELECT B.id, COUNT(col1) AS nullでない数 FROM C GROUP BY B.id) t3
として、WHERE句を取ればいいだけでした

無駄な検索時間は増えてしまうと思いますが・・・

386NAME IS NULL2018/06/27(水) 01:56:23.14ID:???
>>385
カラム名を変えさせてもらった
tableB id, A_id
tableC B_id, col

select tableA.id, tableB.id,
count(C.col) as count
from tableA,tableB,
(select
B_id,
(case
when col1 is NULL then NULL
else 1 end) as col
from tableC) as C
where
tableA.id=tableB.A_id and
tableB.id=C.B_id and
C.c is not NULL
group by A_id,C.col;

387NAME IS NULL2018/06/27(水) 02:05:38.77ID:???
訂正 最後から2行目

× C.c is not NULL
○ C.col is not NULL

388NAME IS NULL2018/06/27(水) 08:42:50.79ID:???
>>383
BCを先にjoinしてカウント。その結果とAをjoin

389NAME IS NULL2018/06/27(水) 11:12:53.09ID:???
お願いします。
質問文を入力すると403 Forbiddenとなるのですが、なぜでしょう?
こういう文章は入力できるのに・・・

390NAME IS NULL2018/06/27(水) 11:16:55.56ID:???
再度質問を投稿してみます。

CREATE TABLE TB(
MM VARCHAR(81) DEFAULT ’NOTHING’ NOT NULL)

なのですが、DEFAULTで'NOTHING'が設定されていてNULLにならないと思うのですが
文末にNOT NULL制御を掛けているのはなぜなのでしょうか?

391NAME IS NULL2018/06/27(水) 12:49:39.15ID:???
>>390
> NULLにならないと思うのですが
NULLは後からでも設定できるだろ

392NAME IS NULL2018/06/28(木) 05:17:45.28ID:???
>>390
insertでカラムにnull指定すれば出来るからでは

393NAME IS NULL2018/06/28(木) 09:25:57.73ID:???
>>391
>>392
ありがとうございました!言われると恥ずかしいくらい簡単なことだったのですね。先生方、ありがとうございました。

394NAME IS NULL2018/07/02(月) 08:04:38.26ID:NPOvlBFE
1時間に1回だけ引けるガチャを実装したいんだけどどうすればいいですか?
一応、ユーザがいつガチャを引いたかを記録するテーブルを作って(不正が分かるように必須)
そこから検索かけて該当するのがあれば残り時間を返すみたいな実装を考えてます

・MariaDB 10
・user_id, time
・残り時間(引ける時はいらない)

395NAME IS NULL2018/07/02(月) 09:11:16.24ID:???
>>394
DB設計を語るスレ 10 [無断転載禁止]&#169;2ch.net
https://mevius.5ch.net/test/read.cgi/db/1495438711/

396NAME IS NULL2018/07/14(土) 15:21:18.46ID:wB+JUIy4
条件1〜条件10のうち9個以上の条件を満たすものを抜き出したい。

select * from table1 where 条件;

の条件のところに
(条件1 AND 条件2 AND ...AND 条件10)
AND
(条件1 AND 条件2 AND ... AND 条件9 AND (NOT 条件10))
AND
(条件1 AND 条件2 AND ... AND 条件8 AND (NOT条件9) AND 条件10)
AND
...
AND
((NOT 条件1) AND 条件2 AND ... AND 条件10)

と愚直に11通り書く他に、スマートに書く方法無いの?

397NAME IS NULL2018/07/14(土) 15:48:00.68ID:???
where case when 条件1 then 1 else 0 end
   + case when 条件2 then 1 else 0 end
   ...
   + case when 条件10 then 1 else 0 end
   >= 9

398NAME IS NULL2018/07/14(土) 16:33:57.42ID:???
なるほど、CASE式を使うのか。 サンQ

ってか質問のころ、11通りを結ぶのはANDじゃなくてORの間違いだったな。

399NAME IS NULL2018/07/16(月) 18:50:59.75ID:XzzcYhc4
>>398
複数のselect文を書いてunion allの方が意図がわかりやすいうえに、条件を変えるときも変更時のリスクも低い。

400NAME IS NULL2018/07/16(月) 19:13:40.21ID:???
>>399
ちょっと具体的に書いてみ

まともな頭持ってたら書いてる途中で顔真っ赤になると思うが…

401NAME IS NULL2018/07/16(月) 19:16:01.66ID:???
>>399
条件ちゃんと読んでないのかもしれんが、複数条件つなぐのはorだぞ
ちょっとunionで書いてみてくれよ

402NAME IS NULL2018/07/16(月) 20:50:23.35ID:???
単純に、orでつないでる式を一つにしたsql文をunionすれば良いと思うのだが

403NAME IS NULL2018/07/16(月) 21:32:24.07ID:???
>>402
それのどこが「スマート」なんだ?

404NAME IS NULL2018/07/16(月) 21:39:54.23ID:???
質問者自身にしろ、CASE使った回答にしろ、
SELECT条件で9個以上の判定をしていますが、
UNION使って列挙した場合、それぞれのSELECTが
独立してテーブルをスキャンする事になるので
仮に上手く書けたとしても効率が悪いって気がします

405NAME IS NULL2018/07/16(月) 22:51:06.23ID:5Oge9TUh
>>404
それは素人の考え方です。先の例ではSQLの見た目はシンプルそうに見えますが、実際の処理コストは高いと思われます。

406NAME IS NULL2018/07/16(月) 22:53:57.62ID:5Oge9TUh
それなりにデータベースに詳しくてもいまだにSQLはこう書くと内部でこう処理されると主張する方がいますが、それはリレーショナルデータベースの根本から否定する主張です。SQLは処理方法を指定しない非構造化言語です。

407NAME IS NULL2018/07/16(月) 23:01:38.78ID:5Oge9TUh
>>404
リレーショナルデータベースはそんなにお馬鹿ではありません。SQLの発行回数を問題視したり、SELECT句が難度も出てきたり、見た目だけでコストが高い、性能が悪いと言われて仕事でもかなりの支障をきたしますのでそういった発言は控えてください。

まずは実行計画と実際にどのように処理されたかSQLをトレースして己の知識を高めてから偉そうなことを言ってください。

408NAME IS NULL2018/07/16(月) 23:03:33.07ID:???
後の例を提示してもらった上で性能なり効率なりを評価してみましょう

409NAME IS NULL2018/07/16(月) 23:07:17.64ID:5Oge9TUh
>>408
すぐに回答を欲しがるいつものあなたですが、ここは教育スレッドではありません。

ちなみにさきほどの非構造化とは非構造化データのことではなく、構造化定義のない言語という意味です。

410NAME IS NULL2018/07/16(月) 23:12:29.73ID:???
教えてもらうスレではなく、質疑応答スレです。

>402 名前:NAME IS NULL[sage] 投稿日:2018/07/16(月) 20:50:23.35 ID:???
>単純に、orでつないでる式を一つにしたsql文をunionすれば良いと思うのだが

この人がSQL書いて提示するのを待っているところですが

411NAME IS NULL2018/07/16(月) 23:18:34.32ID:5Oge9TUh
>>397 の良くない点を挙げましょう。

SELECTが一度しか出てきませんが、WHERE句の条件を見れば、普通のプログラマはループのネストとわかるはずです。

一番の問題はそこではなく、仕様の変更に弱く保守性が低いところです。

複数のSELECT文のUNION ALLは結果セットを最後に単純に繋ぐだけで、それぞれのSELECT文が独立していますので仕様の変更が全体に影響しません。

ただし本当のところはオプティマイザの判断ですので、必ずこうなるわけではありません。

412NAME IS NULL2018/07/16(月) 23:27:47.58ID:???
評価は後の例が出てきてからで良いでしょう?

413NAME IS NULL2018/07/16(月) 23:29:52.01ID:5Oge9TUh
>>410
条件が10個もあり、そのうちの9個の条件が真の場合のSELECT文のパターンは膨大だと思うでしょう。

SELCT * FROM Aテーブル WHERE 条件パターン1
UNION ALL
SELCT * FROM Aテーブル WHERE 条件パターン2
UNION ALL




とかなり並べないといけないと思うと思います。

ただ冷静に考えてください。10個条件があり、すべての条件を満たすSELECTはひとつです。10個の条件のうち9個を満たすSELECT文は10個、10種類です。

たった11パターンのSELECT文のUNION ALLです。簡単でしたね。

414NAME IS NULL2018/07/16(月) 23:38:47.97ID:5Oge9TUh
このスレでは集合演算子がないことにしている回答ばかりです。おそらく集合演算子が使いこなせないのでしょう。

もっとシンプルに考えてください。プログラマとは思えません。

SQLを組み立てるときに頭の中でWHERE句内でどうにかしなければいけないと思い込んでいませんか?

常にSELECT文がひとつでSELECT句内でSELECT文を使う回答やWHERE句の服問い合わせでどうにかしようとする回答も多いですね。

特定の人物が回答しているのがよくわかります。その場しのぎの小手先のSQLほど迷惑なものはありません。

415NAME IS NULL2018/07/16(月) 23:38:56.00ID:???
条件パターンを例に従って具体的に書いてみてくれませんか?
そうすれば実際に性能評価ができそうですし

416NAME IS NULL2018/07/16(月) 23:43:50.42ID:5Oge9TUh
>>415
なぜ11種類の条件違いのWHERE句違いのSELECT文が理解できないのですか?

SELECTの結果を足し算、くっつければすればいい話ですので、あなたがUNION ALLを理解できないだけです。

SQLの入門書の絵でも見て勉強してください。

417NAME IS NULL2018/07/16(月) 23:45:50.92ID:???
この人NGにした方が良さそうですね?

418NAME IS NULL2018/07/16(月) 23:52:58.66ID:5Oge9TUh
UNION ALLでなくてもSELECTがひとつでないといけないルールがあるなら、WHERE句に10個の条件がすべて真、9個の条件がすべて真の条件をOR条件でつないでもかまいません。

419NAME IS NULL2018/07/16(月) 23:58:36.32ID:5Oge9TUh
条件1〜条件10のうち9個以上の条件を満たすものを抜き出したい。

select * from table1 where 条件;

の条件のところに
(条件1 AND 条件2 AND ...AND 条件10)
AND
(条件1 AND 条件2 AND ... AND 条件9 AND (NOT 条件10))
AND
(条件1 AND 条件2 AND ... AND 条件8 AND (NOT条件9) AND 条件10)
AND
...
AND
((NOT 条件1) AND 条件2 AND ... AND 条件10)

と愚直に11通り書く他に、スマートに書く方法無いの?


↑は本人も訂正していますがORの間違いでANDと書いています。さらに本人は気づいていなかったようですが「 NOT 条件 」部分はいりません。

質問者はスマートではないと言っていますが、本人がスマートではないと見た目だけで思っているだけで、まったく悪くはありません。

420NAME IS NULL2018/07/17(火) 05:22:06.92ID:???
>>413
おれなら11個も同一テーブルからのunion allとか書いてたらアホかと思うけどな
whereで11個or条件書く方がマシだわ
どっちにしても、9個以上が8個以上とか7個以上とかになったらどうするんだろうね

ああ、たんに最近union覚えて使いたいだけか

理解できてないのはお前のunionに対する実行効率だよ

まあ>>397がループのネストとか俺には意味不明だから、俺を遙かに超越した理解の持ち主なのかもしれんが

421NAME IS NULL2018/07/17(火) 06:35:01.38ID:???
環境はそれぞれだったら、いろんな方法を試したらいいんじゃない?
で、目的に一番合うもの選べば。

422NAME IS NULL2018/07/17(火) 07:11:11.28ID:???
効率云々の前にunion allとかにしたら重複行の扱いで結果異なるし
>>417が正解かと

423NAME IS NULL2018/07/17(火) 11:41:13.48ID:???
まあちゃんとnot条件書けばいちおうunionでもunion allでも同じになるんじゃね
unknownになるような条件書かなきゃな

424NAME IS NULL2018/07/17(火) 19:05:25.28ID:???
>403
どっちがスマートかと言えば、unionで繋げた方が"sql文"としてはスマートかな

425NAME IS NULL2018/07/17(火) 20:31:21.01ID:???
現実社会じゃクイズ解いてるわけじゃないんだから、アプリ側でやっちゃうだけ

426NAME IS NULL2018/07/17(火) 20:40:16.91ID:???
>>425
この例で
アプリ側でどんなクエリ発行してどんなロジックでチェックするのか教えてくれ

427NAME IS NULL2018/07/17(火) 21:16:08.13ID:???
>>424
だからSQL書いてみろって
書いてる間に顔真っ赤になるだろ w

428NAME IS NULL2018/07/17(火) 21:20:42.11ID:???
お前は読めるのか?

429NAME IS NULL2018/07/17(火) 22:10:19.21ID:???
unionおじさんの次の一手は誰も言ってない要件を持ち出す、かな

430NAME IS NULL2018/07/17(火) 22:47:07.54ID:adSOPTjX
UNIONとUNION ALLはまったく別物だ。

431NAME IS NULL2018/07/17(火) 22:50:39.33ID:adSOPTjX
>>422
だから質問者のWHERE句での条件でいいのに。
なんでSQLを直すことになったらすぐにWHERE句全体が崩壊する方法を勧めるひとがいるの?

432NAME IS NULL2018/07/17(火) 22:57:06.79ID:adSOPTjX
>>422
確かにUNION ALLでは同じレコードが返ってくることには気づかなかった。

433NAME IS NULL2018/07/17(火) 23:05:43.48ID:adSOPTjX
質問者が静的SQLにこだわっている理由も気になる。10個の条件のうち9個が真という条件が激しく変化するのなら、動的SQLでSELECT文を組み立てた方が、てっとり早い。

こういう条件の場合は動的にSQLを組み立てるのが普通で、静的SQLにこだわる理由がみつからない。

こういう検索機能を動的SQLではなく、静的SQLにしようとすると、例の仕様変更に耐えられないSQLを使用しなくてはいけないなる。

434NAME IS NULL2018/07/17(火) 23:26:06.21ID:???
>>433
静的/動的は関係ないでしょ?
まあ動的に生成するなら>>396でもそんなに面倒じゃないけど>>397でなんの問題もないしな
ちな>>399は論外

435NAME IS NULL2018/07/17(火) 23:31:51.56ID:???
素朴な疑問だけど、なぜみんなUNIONを嫌うの?

436NAME IS NULL2018/07/18(水) 00:03:15.34ID:???
適切な使い方なら良いんだが、これは違うだろう

437NAME IS NULL2018/07/18(水) 02:54:15.10ID:???
この例で最悪でもテーブルスキャン1回で済ます実行計画吐くならまあunion allでもいいんじゃね
結果行数が多くなるならunionはダメだろうけど

438NAME IS NULL2018/07/18(水) 08:36:07.89ID:???
誰か最初のUNION(ALL)の手前までででいいからSQL書いてくれ

439NAME IS NULL2018/07/18(水) 12:04:56.31ID:???
言うに事欠いて1回のスキャンで済むunionとか…

440NAME IS NULL2018/07/19(木) 15:29:12.57ID:ql5n9nVD
【3.11津波は自民由来!? 安倍逮捕秒読みか!?】 ロシア国防省『日本は地震を偽装した核実験を止めよ』
http://rosie.5ch.net/test/read.cgi/liveplus/1531966541/l50



2018年、テレビが隠している大ニュース!

441NAME IS NULL2018/07/20(金) 00:47:16.08ID:qGWP8ju3
ここのキチガイは実行計画もみたことがないからな。文字数が少ないSQLがスマートと言い張る。
なんでプログラマなのに

442NAME IS NULL2018/07/20(金) 12:58:13.55ID:???
a

443NAME IS NULL2018/07/20(金) 21:39:10.73ID:???
実行計画という用語を最近覚えたノロマ w

444NAME IS NULL2018/07/20(金) 23:08:59.22ID:GJRr/f3G
おまえの事やんけ

445NAME IS NULL2018/07/20(金) 23:40:11.94ID:???
なにか気に触ったのか? w

446NAME IS NULL2018/07/21(土) 07:43:39.15ID:5x2HyI6i
おまえ何時も他人の顔色うかがってばかりやな

447NAME IS NULL2018/07/21(土) 08:27:53.48ID:???
ノロマは何をやっても駄目だな w

448NAME IS NULL2018/07/21(土) 12:27:57.38ID:5x2HyI6i
おまえの事やんけ

449NAME IS NULL2018/07/21(土) 13:27:35.31ID:???
実行計画とか考慮したら、unionはないわw

450NAME IS NULL2018/07/21(土) 15:38:38.03ID:???
>>448
>>444
いつものバカループ w

451NAME IS NULL2018/07/21(土) 18:42:01.35ID:OaX/dGdR
>>449
実行計画がなんなのか分かってますか?

多少の知ったかぶりはかまいませんが、少しは謙虚にわからないことはわからないと言うようにしましょう。

452NAME IS NULL2018/07/21(土) 18:46:09.10ID:???
その実行計画をやってみたいから、早くUnion使ったSQLをここに晒してくれ

453NAME IS NULL2018/07/21(土) 18:48:49.51ID:???
unionの1回目のselectで、キャッシュに乗る

454NAME IS NULL2018/07/21(土) 18:50:04.62ID:???
それぞれのselectが異なるのに?

455NAME IS NULL2018/07/21(土) 18:55:37.55ID:???
バッファキャッシュ

456NAME IS NULL2018/07/21(土) 19:22:15.63ID:???
キャッシュに乗るかどうかは実行計画とは直接は無関係だがな
キャッシュにのったからって不要なテーブルスキャンが許容できるわけではない

457NAME IS NULL2018/07/21(土) 20:00:11.00ID:???
でっかいテーブルだとキャッシュに収まるのは無理

458NAME IS NULL2018/07/21(土) 20:17:41.08ID:???
条件によってはインデックスしかアクセスしない可能性もあるしな

459NAME IS NULL2018/07/21(土) 21:13:40.08ID:???
不要なテーブルスキャン

460NAME IS NULL2018/07/21(土) 21:14:00.83ID:HTGK0eq2
>>451はアホやけどおまえらはその足下にも及ばんアホなんやで?
知らんかったやろ?

461NAME IS NULL2018/07/22(日) 02:39:53.39ID:ODcS1lTE
>>460
実行計画ではなくコストだったと間違いを認めなさい。

462NAME IS NULL2018/07/22(日) 11:27:50.93ID:zTS56Hn0
>>461
おまえが一番アホやなw

463NAME IS NULL2018/07/22(日) 19:38:32.24ID:???
条件1〜条件10のうち9個以上の条件を満たすものを抜き出したい。

テーブルは以下の内容とし、レコード件数は1万件、
cond*にはランダムに1〜100までの数値を設定し、
抽出条件は各カラム値が50を超えるものとする

create table vote (
id int primary key auto_increment,
cond01 int,
cond02 int,
cond03 int,
cond04 int,
cond05 int,
cond06 int,
cond07 int,
cond08 int,
cond09 int,
cond10 int);

464NAME IS NULL2018/07/22(日) 19:48:47.06ID:???

465NAME IS NULL2018/07/22(日) 20:05:59.94ID:???
unionにだけorder byあるとか
やるならちゃんとやって

まあunionはたいがいの場合でソートするんだが
unionの押しの人はunion allって言ってなかったっけ?

どうせならインデックスの有無も

466NAME IS NULL2018/07/22(日) 20:43:15.80ID:???
case whenはそのままid順になるけど、unionはならなかった
union all使えば重複の除外が発生するし、変わらないんじゃない?
index付けてもunion内のsql実行に影響するだけで、
マージする性能には多分影響しない

続きは各自で

467NAME IS NULL2018/07/22(日) 21:05:02.26ID:???
>>466
ただのunion はdistinctで重複除去、除去しないのがall指定
この例でunion allだと重複行がでるはずだぞ

caseはID順(おそらく主キーか物理格納順)でテーブル舐めてるからそのままID順だな
unionで順番変わるってことは、重複除去の方法がソート系じゃない可能性が高い
まあなんにしても、order by書かないと順番は不定ってのが原則なので
両方に書くか両方に書かないか合わせないと

indexは、unionの各whereには効くだろうけど、caseにはうまく効かないんじゃないかと
まあそれで実行性能がひっくり返るとしても、unionで書こうとは思わんが

468NAME IS NULL2018/07/22(日) 22:25:29.43ID:???
>>464
ごめん9は間違いで8以上だったSQL直してくれる?

469NAME IS NULL2018/07/23(月) 07:46:29.52ID:???
sql自体でなくて申し訳ないが,前の例で、10億レコードで,テーブルが列ストアで保持されているとした場合、whereでー発フィルタリングするのと、unionするのとどっちが効率的なのだろう?
条件が適用されるカラムのメンバー数にもよりそうな気もするが、どんなもんなんでしょうか

470NAME IS NULL2018/07/24(火) 19:21:58.65ID:yAzT+3qO
やってみればいいのに。見た目がシンプルなのと処理の重さは反比例する。

471NAME IS NULL2018/07/24(火) 21:25:13.19ID:???
見た目で決まるほど今のオプティマイザはアホじゃないし

472NAME IS NULL2018/07/27(金) 12:11:49.90ID:???
質問です。

select a + b +c -d as 計算結果
where 計算結果 > 0

とすると行が表示されません。where句を外すと、
計算結果は0より大きい値でちゃんと出てきます。

where a + b +c -d > 0 

と書き換えると表示されたのですが、
where句でselectの as 別名 は使えないのでしょうか?

473NAME IS NULL2018/07/27(金) 13:33:09.67ID:???
一部つかえるDBMSもあるようだが原則使えない

474NAME IS NULL2018/07/27(金) 18:03:08.40ID:???
普通はselect句でつけた別名を使えるのはorder by句だけだな

4754722018/07/27(金) 18:21:36.74ID:???
そうだったんですね
できそうなイメージだったんですが
ありがとうございます

476NAME IS NULL2018/07/27(金) 22:18:42.27ID:???
いい加減使えるようにしろよとは思う

477NAME IS NULL2018/07/27(金) 22:54:00.11ID:???
select a + b +c -d as 計算結果
having 計算結果 > 0

478NAME IS NULL2018/07/28(土) 13:12:09.25ID:tm98Iqt0
>>475
よく考えてくれ。WHERE句が先に評価され、そのあとにSELECT句の選択リクトが評価される。

いったんSELECTした結果に対して、絞り込みのWHERE句つきSELECTを再度するのを基本としてしまうと、SELECT文は常にフルテーブルスキャンをして、その結果を一時的に保管して、保管した結果に対してさらに検索することになる。

479NAME IS NULL2018/07/28(土) 13:13:33.29ID:tm98Iqt0
>>471
だから見た目をシンプルにするのは意味がないと言っているのだが?

480NAME IS NULL2018/07/28(土) 13:36:47.39ID:???
>>478
なんでそんな難しいことを考えるんだよ…
> select a + b +c -d as 計算結果
> where 計算結果 > 0
ってあったら
select a + b +c - d as 計算結果
where a + b +c - d > 0
って展開すれば良いだけだろ

481NAME IS NULL2018/07/28(土) 14:05:45.09ID:???
>>479
>見た目がシンプルなのと処理の重さは反比例する
反比例ってどういうことだ?
基本的にはシンプルなSQLほどオプティマイザの裁量が広がって有利なんだが

482NAME IS NULL2018/07/28(土) 15:08:24.77ID:???
>>478
この場合はどっちにしても全行計算してから絞り込むから大差ないような・・・

483NAME IS NULL2018/07/28(土) 15:12:20.21ID:???
>>478
ああ一時テーブルのメモリと、捜査が2度手間になるのか
whereが先だったのか
どっかのサイトにselect結果をwhereで絞り込むって書いてたけど

484NAME IS NULL2018/07/29(日) 09:18:12.72ID:???
ちょっと前のunionの話だけど
処理効率や保守性はおいといて、10個の条件のうち9個を満たすものをとるのにunion使ってどうやるの?

485NAME IS NULL2018/07/29(日) 09:28:13.30ID:???
それを書いた本人の真意はわからんけど、

(1番目以外の9個を満たすクエリ)
union
(2番目以外の9個を満たすクエリ)
union
:
でできるはず。

486NAME IS NULL2018/07/29(日) 09:43:51.54ID:???
>>485
それselectごとに条件9個ずつ書くの?

487NAME IS NULL2018/07/29(日) 09:46:11.97ID:???
ごめん、保守性はおいといてって言ったの自分だね
たしかにそのやり方ならできるか

488NAME IS NULL2018/07/29(日) 09:52:42.06ID:???
自分なら union 化して
where x.cond > 条件 group by id having count(*) > 件数
を副問合せにする

489NAME IS NULL2018/07/29(日) 10:21:47.78ID:???
>>485
unionだけだと元は異なるレコードでも結果が同じだったら1レコードにされちゃう
かと言ってunion allだと複数の条件にヒットするレコードが複数出ちゃうよ

490NAME IS NULL2018/07/29(日) 10:52:46.82ID:???
>unionだけだと元は異なるレコードでも結果が同じだったら1レコードにされちゃう

主キーが存在しないテーブルならともかく、適切なselectリストにすりゃいいだけ。

>かと言ってunion allだと複数の条件にヒットするレコードが複数出ちゃうよ

(1番目を満たさずそれ以外の9個を満たすクエリ)でおk。

491NAME IS NULL2018/07/29(日) 14:29:08.48ID:???
なんでいまさら話をループさせてるんだ

492NAME IS NULL2018/07/29(日) 19:49:38.36ID:0RlqY4hk
>>491
ここに常にいるキチガイ

493NAME IS NULL2018/08/21(火) 16:31:56.98ID:???
(プライマリではない) authorがaaaとbbbの最新のレコードをそれぞれ1件ずつ取得したいのですが
どのようにしたらいいでしょうか? 最新かどうかは updated_at で判定できます

SELECT * FROM news WHERE author IN ('aaa', 'bbb')

494NAME IS NULL2018/08/21(火) 17:41:25.74ID:???
>>493
もう少し詳しく書いて欲しい
テーブル定義と、updated_atでどうやって判定するのかなど

495NAME IS NULL2018/08/21(火) 18:04:34.79ID:???
>>3じゃないのか?

496NAME IS NULL2018/08/21(火) 21:30:01.28ID:KIn4MzQg
MySQLでREPLACE関数を使って複数行を置換するにはどうすればいいのでしょうか?

例えば「body」というカラムがあるとして以下の値が登録されているとします。
あいうえお
かきくけこ
さしすせそ

これをREPLACEして「さしすせそ」のみ残したい時、

UPDATE news SET body=REPLACE(body,"あいうえお\r\nかきくけこ\r\n","")

としたのですが、置換できません。

497NAME IS NULL2018/08/21(火) 21:57:14.63ID:???
>>496
出来ると思うんだが、出来ないとしたら
bodyの文字列中改行コードが、
replace関数で指定したものと違っているのかも知れない。

498NAME IS NULL2018/08/22(水) 01:37:20.21ID:???
>>497
\nにしても駄目でした。一行だけだと置換できるんですけどね・・・

499NAME IS NULL2018/08/22(水) 01:59:39.45ID:???
>>498
select hex(body) from table名
とやって、
改行部分を16進数で見てみるとか

500NAME IS NULL2018/08/22(水) 03:03:57.79ID:???
>>494-495
遅くなりました
>>3 のをいろいろ弄ってみて実現できました
よく見ず質問してしまいすいません。
ありがとうございましたm(_ _)m

501NAME IS NULL 2018/08/28(火) 06:20:52.88ID:FcSigLis

板復帰(OK!:Gather .dat file OK:moving DAT 215 -> 193:Get subject.txt OK:Check subject.txt 215 -> 215:Overwrite OK)0.86, 0.75, 0.74
age subject:215 dat:193 rebuild OK!

502NAME IS NULL2018/08/30(木) 23:59:48.61ID:???
すいません。DB2でフラッシュバッククエリのコマンドを実行したいのですが、
ググってもOracleのコマンドしか出てきません。
どなたかご教授お願いします。

503NAME IS NULL2018/08/31(金) 05:07:54.46ID:???

504NAME IS NULL2018/08/31(金) 14:35:48.08ID:???
そっちのスレは過疎ってますし、そもそも回答になってませんが・・・

505NAME IS NULL2018/08/31(金) 14:57:35.99ID:???
ここは特定のDBMLの操作方法を質疑するスレじゃないので

506NAME IS NULL2018/08/31(金) 18:08:53.87ID:???
DB2にフラッシュバッククエリなんかないでしょ
ぐぐるとOracleのLogMinerみたいな機能ですら
db2ReadLog APIを使って自分で実装しろと出てくる

507NAME IS NULL2018/08/31(金) 22:40:03.31ID:???
アクセスでの開発なのですが
氏名,エラー内容.エラー回数
A,ダメポ,1
A,無理ぽ,2
B,もうだめ,1
C,むり,1

みたいなものをクエリで出して、行列を入れ替えて
  1回目 2回目
A ダメポ 無理ぽ
B もうだめ
C むり
みたいに出力をしようとしています。

これが2万レコードほどあり、処理が重たくて困っています。

select 氏名
MAX(エラー内容)
from (抽出クエリ)
group by 氏名

等で出力すると、処理が非常に重たく

select 氏名,
[1回目].エラー内容
[2回目.エラー内容
from (抽出クエリ where エラー回数=1) as 1回目
left join on (抽出クエリ where エラー回数=2) as 2回目

みたいにしても重たいのです
どなたか助けてください

508NAME IS NULL2018/09/01(土) 16:24:39.15ID:???
>>507
エラー回数は最大2ではなくNなわけ?
かりにNだった場合SELECT句はどうするつもり?

509NAME IS NULL2018/09/01(土) 18:48:49.07ID:???
エラー回数は有限で3回までです。
accessがtempテーブルも使えず、実体テーブルにselect into しても
それだけなのに、2万件で1時間近くかかってしまっています。
助けてください。。。今日そのことばかり考えながら家事をしていました。つらい

510NAME IS NULL2018/09/01(土) 19:17:06.19ID:he6NSwN/
抽出クエリ自体を実テーブルにして氏名にインデック貼って

SELECT
氏名,
Max(IIf(エラー回数 = 1,エラー内容,Null)) as 1回目,
Max(IIf(エラー回数 = 2,エラー内容,Null)) as 2回目,
Max(IIf(エラー回数 = 3,エラー内容,Null)) as 3回目
from 抽出クエリ結果
group by 氏名
order by 氏名

とかかな

511NAME IS NULL2018/09/01(土) 19:31:19.34ID:???
抽出クエリってやつは実テーブルじゃなくて何かの条件で抽出した状態のビューを言ってるわけ?
それとDBがアクセスってだけでSQL自体は外部ツール(C#とか)から実行するの?

512NAME IS NULL2018/09/01(土) 19:32:05.22ID:???
適切なスレが見当たらないんで、ここで聞くんだけど
sqlから、ER図を生成する方法ってある?
できればoracleで。
イメージ的には、プログラミングで言うと
ソースコードからクラス図を生成するイメージ

513NAME IS NULL2018/09/01(土) 19:35:46.49ID:???
>>510
ありがとうございます。
実テーブルに入れるというところで30分以上かかってしまい。
select だけだと1分程度で抜けるのが、insert selectでも select insertでも
30分かかってしまって、その後にクエリ流すのに時間が掛かってしまっています。

>>511
from 句の中に書いたサブクエリになります。
アクセスに対して、エクセルのVBA側から呼び出しをかけています。

514NAME IS NULL2018/09/01(土) 19:39:12.73ID:he6NSwN/
>>512
SQLってDDL分ってこと?
実態テーブルからER作成するのは
有償ツールはいくつかあるけど
とりあえずA5とかで試して見たら?
https://a5m2.mmatsubara.com/help/ER/
FKとか指定してないとさすが無理だけど

515NAME IS NULL2018/09/01(土) 19:59:08.40ID:???
>>514
DDLではなく、普通のselect分です。
DBにつながる環境で、FKとかはDBから拾ってきてほしい想定です。
実テーブルから、ER図ではなく、
実テーブルと、select分から、ER図を作ってほしい

516NAME IS NULL2018/09/01(土) 19:59:37.04ID:???
select
抽出テーブル1.氏名,
抽出テーブル1.エラー内容 as エラー内容1,
(select エラー内容 from 抽出テーブル as 抽出テーブル2 where 抽出テーブル2.氏名=抽出テーブル1.氏名 and 抽出テーブル2.エラー回数=2) as エラー内容2,
(select エラー内容 from 抽出テーブル as 抽出テーブル3 where 抽出テーブル3.氏名=抽出テーブル1.氏名 and 抽出テーブル3.エラー回数=3) as エラー内容3
from 抽出テーブル as 抽出テーブル1
where 抽出テーブル1.エラー回数=1
order by 抽出テーブル1.氏名;

access2016のSQLビューで動いた奴

517NAME IS NULL2018/09/01(土) 20:00:42.02ID:???
エラー内容ってカラムが実は1つのテーブルから複数もってくるけどはしょられたら破綻するけどね

518NAME IS NULL2018/09/01(土) 20:13:28.57ID:???
>>516
これはデータ件数が多いと時間かかりそう
レコード1件ごとカラムのサブクエリが実行されるだろう

519NAME IS NULL2018/09/01(土) 20:30:03.52ID:???
>>518
おれもそうおもったんだよね
抽出テーブルがサブクエリだとなおさらだな

2万件っていってるのは元データが2万なのか、
氏名で出力する行が2万件なのか(2万×最大3列=6万)なのかで結果がかわるけど、
どっちなんだろな

520NAME IS NULL2018/09/01(土) 20:58:07.07ID:???
>>516
ありがとうございます。今一番早く出来たのがその形で、それで1時間掛かっています。

抽出対象が2万件。
そのそれぞれに最大3列、エラーが発生し得る状態です。

サブクエリで抽出している下記のデータは、30万件ほどから抽出していて
氏名,エラー内容.エラー回数
A,ダメポ,1
A,無理ぽ,2
B,もうだめ,1
C,むり,1
抽出もとは最終的に100万件ほどまで増えます。

30万件から抜くクエリは1分程度なので、×3でいけると思っていたら1時間掛かるようになってしまい。

521NAME IS NULL2018/09/01(土) 22:02:50.69ID:???
>>520
問題を切り分けたほうがいい気がしてきたけど、
@単純にデータを取得する場合の実行速度
select 氏名,エラー回数,エラー内容
from 抽出テーブル
order by 氏名,エラー回数
Aエラー回数を列別に変換する場合の実行速度(>>510)を参考
select
氏名,
Max(IIf(エラー回数=1,エラー内容,Null)) as エラー内容1,
Max(IIf(エラー回数=2,エラー内容,Null)) as エラー内容2,
Max(IIf(エラー回数=3,エラー内容,Null)) as エラー内容3
from 抽出テーブル
group by 氏名
order by 氏名
これはどのくらいの実行時間なわけ?※Openして何もせずにループだけする

522NAME IS NULL2018/09/01(土) 22:05:12.33ID:4FUN7IZm
いまなんの話題?3行で

523NAME IS NULL2018/09/01(土) 22:53:54.26ID:???
s
q
l

524NAME IS NULL2018/09/01(土) 23:00:11.61ID:???
>>521
状況をきちんと伝えられていなくて申し訳ないです。

30万行の元データ→エラー回数抽出サブクエリ(@ 件数は2万件程度抽出)→エラー回数を列別変換(A)
という流れです。

@は1分程度で1クエリは抽出完了、Aは1時間掛かってしまっています
当初>>510のように作っていましたが、処理を見直し>>516のようなクエリに書き換えています。
@は分析クエリのように演算で回数を出しています。

525NAME IS NULL2018/09/02(日) 03:03:08.10ID:???
>>524

>>510が正解じゃない?
インデックス効かせるには。
書き込み時間がかかるかもしれないけど。

最終結果の使い方わかんないけど
VBAとかで2万件結果セットループで変数持ちとかじゃだめか。

526NAME IS NULL2018/09/02(日) 07:52:34.77ID:???
>>524
> @は1分程度で1クエリは抽出完了
@の結果をアプリ側で整形するってのはできないの?
SQLは行列変換得意じゃないし

527NAME IS NULL2018/09/02(日) 09:56:31.15ID:???
>>525-526
他のDB情報と最終的に結合して出力するためできればクエリでやりたいと思っていました。
ただ、どうしても時間が掛かるならVBA側で実装するのもありですね。

もう少し性能測定して、改善の見込みが無かったらVBAに乗り換えてみます。
諸々失礼しました。

528NAME IS NULL2018/09/02(日) 17:58:27.97ID:???
>>515 って、無理ですかね。

529NAME IS NULL2018/09/02(日) 18:52:28.60ID:???
実テーブルから定義を引ければ十分だと思うけど、なぜselect文が必要で
>>514じゃ何が足りないのか、質問の意図が誰も理解できないんだと思う。

530NAME IS NULL2018/09/02(日) 22:22:42.98ID:???
>>514 に書かれてるようにFKないんじゃね?
join の結合条件見ろと

531NAME IS NULL2018/09/03(月) 03:08:13.74ID:xugX4t13
>>496
なんでreplace関数を使わなきゃいけないのか?

where句の条件が あいうえお、かきくけこ で SET句の値が さしすせそ でいいだろ。

532NAME IS NULL2018/09/03(月) 23:51:22.93ID:???
>>531
さしすせそは不定で指定できないとか。
最初の2行はヘッダーとか特定できるなにかなんじゃないかな。

>>496
ちなみにxampp5.6.12でテストしたら>>496のクエリでできたよ。

命令送ってる側とかで勝手に改行コード省かれちゃってるとか?

サーバーでログとってみたら?

533NAME IS NULL2018/09/04(火) 13:40:14.68ID:Md9f/krD
>>532
MySQLと質問者は書いているのに、なんでXAMPPという何をどう使っているのかわからないくくりで答えているのか?

534NAME IS NULL2018/09/04(火) 13:45:29.38ID:Md9f/krD
改行コードを含む文字列の置換を言っているのか。単に改行コードがSQLの改行コードとみなされるような環境で発行してねえだろうなw

535NAME IS NULL2018/09/04(火) 20:40:30.85ID:???
質問者もMySQLとしか書いてないので環境がよくわかんないから
とりあえずMySQL使ってればなんでもいいかとおもって。

536NAME IS NULL2018/09/15(土) 02:10:48.09ID:???
個人からの申請で、登録、変更、削除を受け付けます。
その時、変更だけしか申請していない人を抽出するSQLはどう書いたらいいですか。

変更と登録、変更と削除など、他の申請を出した人は除いて変更だけの人を抽出したいです。

537NAME IS NULL2018/09/15(土) 02:23:19.42ID:???
>>536
そのDBシステムで、
受け付けた登録、変更、削除をどう扱っているか次第

538NAME IS NULL2018/09/15(土) 12:40:37.04ID:???
>>536
そのテーブルのカラム名すらも書けないんならSQLいじるの止めたほうが良い

539NAME IS NULL2018/09/15(土) 13:28:08.11ID:???
>>536
個人Id | 申請
------+-----
001 | '登録'
002 | '登録'
001 | '変更'
002 | '削除'
003 | '変更'
で003だけ欲しくてSQL-Server使ってるとエスパー
select 個人Id from テーブル where 申請 = N'変更'
except
select 個人Id from テーブル where 申請 <> N'変更'

540NAME IS NULL2018/09/15(土) 17:44:40.73ID:RSsWpwqw
監査の話かと思った

541NAME IS NULL2018/09/15(土) 18:18:49.96ID:dWsaBm9G
>>539
「SQL Server」を「SQL-Server」と書きたい理由を教えてくれ。

542NAME IS NULL2018/09/15(土) 20:31:26.68ID:Cd4+ZhgT
【ちびまる子、乳ガン】 モー娘がヒキ逃げなら  <急に基準変更して逃走>  トー電はベク逃げかな
http://rosie.5ch.net/test/read.cgi/liveplus/1536979182/l50


関東の子供が、東電にベク逃げされて、棺桶が売れてる!

543NAME IS NULL2018/09/15(土) 20:41:56.63ID:???
>>541
単なる好みだけどそれが何か?

544NAME IS NULL2018/09/16(日) 06:31:37.33ID:znPzt7LE
製品名は変換する目的は何か?

545NAME IS NULL2018/09/16(日) 08:31:26.77ID:???
お前みたいな日本語怪しいやつをあぶり出すため

546NAME IS NULL2018/09/18(火) 15:27:23.99ID:dZAMkAe5
固有名詞を改変したら駄目だろう

547NAME IS NULL2018/09/18(火) 23:19:39.80ID:EwCoq+cp
ええやろw

548NAME IS NULL2018/09/19(水) 01:25:54.61ID:???
商標権を侵害してるな

549NAME IS NULL2018/09/19(水) 11:22:26.10ID:SAO4z521
半角スペース恐怖症なんだろうな。

550NAME IS NULL2018/09/19(水) 19:30:55.56ID:???
誰でも間違いはある
気にするな

551NAME IS NULL2018/09/19(水) 21:03:38.93ID:f2yuv0SC
製品名を正しく書けないやつはたいてい危険人物。だいたいよくわかっていない。

552NAME IS NULL2018/09/19(水) 23:26:57.94ID:UE0WOPkY
なんやこの病的すぎるバカw

553NAME IS NULL2018/09/20(木) 08:02:36.86ID:???
内容に突っ込めないから製品名に突っ込むしかないんだろ
どうでもええわ

554NAME IS NULL2018/09/21(金) 14:45:01.05ID:wlRN+aGs
お客相手に間違えなくて良かったじゃないか

555NAME IS NULL2018/09/21(金) 15:39:47.79ID:???
ところで、IDが出てたり出てなかったりするのは何故?

556NAME IS NULL2018/09/21(金) 21:51:00.56ID:???
>>554
そんなもんを気にしてるお客なんてお前の脳内にしかいないけどなww

557NAME IS NULL2018/09/21(金) 21:52:53.93ID:???
>>555
sageかどうかでしょ
そもそもsageてない奴のレスは見る価値ないし

558NAME IS NULL2018/09/21(金) 22:45:10.80ID:LJZuek3J
責任をとりたくない奴は、IDを隠すってこと

559NAME IS NULL2018/09/21(金) 23:13:57.63ID:???
責任? w

560NAME IS NULL2018/09/21(金) 23:43:14.92ID:J7Fz2JlS
図星に脊髄反射しとる奴、おる?

561NAME IS NULL2018/09/22(土) 07:06:16.16ID:???
図星に脊髄反射しとる奴 ⇒ >>558

562NAME IS NULL2018/09/22(土) 13:24:41.08ID:/G0Wh7Kz
>>557
いまどき上げ下げかw

563NAME IS NULL2018/09/22(土) 19:23:47.16ID:???
sageるのって荒らしに見つからんようにとかそんな理由だったっけ?
今だと勢い順か新しい順、あるいはスレ検索して見るからもう完全に意味ないよな、わざわざ荒らすやつも激減してるし
ましてこんな過疎版じゃ気にするだけ無駄

564NAME IS NULL2018/09/22(土) 20:12:24.86ID:???
質問スレだと、質問者は必ずageてって板もある
ID出た方が成りすましを防げるからやり取りで
混乱しなくて良いと言う側面もある

565NAME IS NULL2018/09/23(日) 10:30:22.73ID:???
質問スレはそんなルールあったね
sageるとID出ないのはDB板の仕様か
技術的な話をするんだから一律IDつけたほうが勝手がいいと思うけどなあ
専ブラがデフォルトsageになってていちいち削除すんのもめんどいし

566NAME IS NULL2018/09/29(土) 20:35:17.15ID:W8T9QA3v
質問するのでIDありで・・・
リレーショナルデータベース=JOINで複数のテーブルをまたいでクエリを投げられる

という意味?

567NAME IS NULL2018/09/29(土) 20:51:07.76ID:???
リレーションってのは要はテーブルだ。
リレーションでできているデータベースだからリレーショナルデータベース。

568NAME IS NULL2018/09/29(土) 21:24:57.55ID:W8T9QA3v
レスありがとう。
リレーショナルではないデータベースというのは、テーブルでは無いデータベースが想像つかないな・・・。
二次元的なものではなく、テキストに羅列されているだけという感じだろうか。
昔pc-98で桐ver2とか名前だけは知っていたけど、あの頃はすでにテーブルという概念があったのかしら?

569NAME IS NULL2018/09/29(土) 21:34:54.80ID:9EBEb433
すごい会話だなw

570NAME IS NULL2018/09/29(土) 21:36:14.75ID:9EBEb433
>>568
自作自演?

571NAME IS NULL2018/09/29(土) 21:38:54.14ID:???
>>568
桐もDBASEもリレーショナルデータベースだな
テーブルであるならそうかといえば、ちょっと違う

複数のテーブルを関係性で紐付けが出来るなら
リレーショナルデータベースと呼んで良いと思う

Excelの表はテーブルだけど誰もそうは呼ばないしな

572NAME IS NULL2018/09/29(土) 22:03:17.34ID:???
情報処理試験とかデータベースの勉強をすれば初めの方で説明されているはずだけど、
リレーショナルの前には階層型やネットワーク型といったデータベースの形式があった。

ついでに言えば、リレーショナルデータベースには「複数のテーブル」などという要件はない。
複数のテーブルはその直積である1テーブルと等価なんで。

573NAME IS NULL2018/09/29(土) 23:12:42.69ID:9EBEb433
なんか変な素人が出てきたなw

574NAME IS NULL2018/09/29(土) 23:27:01.69ID:???
普通はRDBMSと言えばリレーショナルデータモデルを表現できるだけでなく
ACID特性を備えるのが必要条件とされる
最近流行りのNoSQLなんかはリレーショナルデータモデルを表現するものではない上に
ACID特性のいずれかを満たさないのが普通だったりする

575NAME IS NULL2018/09/29(土) 23:29:52.65ID:9EBEb433
NoSQLが最近ものだと?

タイムマシンで過去から来た人間の書き込み?

5765742018/09/30(日) 00:54:24.60ID:???
しまった
自ら正解を出すことはできず文句しか言わない人に絡まれてしまった

577NAME IS NULL2018/09/30(日) 01:17:21.17ID:???
NGにすると吉

578NAME IS NULL2018/09/30(日) 09:28:56.36ID:???
おまえらが知る前から俺は使ってるんだ( ・`ー・´) +

579NAME IS NULL2018/09/30(日) 14:41:59.34ID:???
>>574
RDBとDBMSの区別がつかないなら、ややこしくなるだけだから黙っとけな

580NAME IS NULL2018/09/30(日) 22:46:54.70ID:???
プライマリキーをフォーリンキーにすることはできますか?

581NAME IS NULL2018/10/01(月) 00:24:20.26ID:???
できるが変な設計だなとは思う

582NAME IS NULL2018/10/01(月) 12:38:28.99ID:???
>>581
時系列データのテーブルが2つあって
時間をフォーリンキーにしたいんですけどおかしいですか?

583NAME IS NULL2018/10/01(月) 12:51:24.62ID:Q6K7qC3N
>>580
単に1対1のテーブルだからおかしくはない。

584NAME IS NULL2018/10/10(水) 11:28:56.03ID:???
インデックスが使われるSQL文の書き方というのは、例えば出庫データに
商品コード順+出荷日順+伝票番号順というインデックスを作っておいて
SELECT * FROM 出庫データ WHERE 商品コード='A01' ORDER BY 商品コード, 出荷日, 伝票番号
みたいにするとレスポンスが速くなるということでしょうか?

585NAME IS NULL2018/10/10(水) 21:59:19.97ID:G1VCUlYl
>>584
プラス記号の意味がよくわからんが
CREATE INDEX(商品コード,出荷日,伝票番号)
という複合主キーを作成すると
例示のSQLは速くなるだろうが
ただしインデックスの順序と異なる
ORDER BY 出荷日,商品コード
などと場合は効かない

586NAME IS NULL2018/10/11(木) 11:55:45.37ID:???
>>585
ありがとうございます

587NAME IS NULL2018/10/11(木) 23:22:18.86ID:LDSiJwGe
>>584
忠告しておくが、インデックスが使われるSQLを書くのではなくて、問い合わせの内容とインデックスが必要かどうかを考えてSQLを書く。

SQLがこうだから、このSQLはこのインデックスが使われるとSQLだけでは言いきれない。

588NAME IS NULL2018/10/11(木) 23:32:44.06ID:ppvirY+z
>>586
複合主キーじゃないわ複合インデックスね

>>587の言うように
実際に効くかどうかは実行計画で決まるので
インデックスを使ったかどうかは
実際の実行計画を取得しないとわからない
オプティマイザが意図したインデックスを使ってくれない場合
ヒントで特定インデックス使用を強制することもDBMSによっては可能

589NAME IS NULL2018/10/13(土) 19:43:23.58ID:???

590NAME IS NULL2018/10/14(日) 17:09:16.28ID:EhhxMLoo
常にサクラのサイトが応援している ノーザンコペルニクス
https://mevius.5ch.net/test/read.cgi/blog/1538500447/

591NAME IS NULL2018/10/14(日) 20:22:51.35ID:???
 私たち日本人の、日本国憲法を改正しましょう。
『憲法改正國民投票法』、でググってみてください。
(へいわ)は、勝ち取るものです。拡散も含め、お願い致します。

592NAME IS NULL2018/11/01(木) 06:26:01.46ID:imTVWlJr
質問です。
以下のようなテーブルがあったとします。
id|name
------
0|aaa
1|bbb
2|ccc

aaa,bbb,ddd,eeeを呼び出し側から与えて、nameにない項目(dddとeee)を取得したいです。
こういう場合どのように書けばよいでしょうか。
擬似的にaaa,bbb,ddd,eeeの項目をテーブルのように扱えればできそうですが、やり方がわかりません。
SQLiteを使っていますが、汎用的な書き方でできればしたいです。
よろしくおねがいします。

593NAME IS NULL2018/11/01(木) 09:10:57.14ID:???
>>592
case when thenとかは?

594NAME IS NULL2018/11/01(木) 11:56:15.87ID:???
汎用的には、テーブルを作ってしまうのが良いと思う

595NAME IS NULL2018/11/01(木) 12:45:48.88ID:pgw6fBBH
SELECT
a.empno<br />
,a.ename
,a.job
,b.ename AS 'mname'
FROM
emp a
,emp b
WHERE
a.mgr = b.empno;
このようなSQLを書いたのですが、SELECTのAS句が機能しません。どうすれば機能しますか?

596NAME IS NULL2018/11/01(木) 13:00:22.93ID:???
'mname' の囲みいらない

597NAME IS NULL2018/11/01(木) 14:17:52.92ID:imTVWlJr
意見ありがとうございました。
汎用的なのは諦めて、SQLiteでは以下で疑似的なテーブルができるようなので、これをもとにSQLを考えていこうと思います。
WITH t(name) AS (SELECT * FROM (VALUES ("aaa"), ("bbb"), ("ddd"))) SELECT * FROM "t";

598NAME IS NULL2018/11/01(木) 19:59:14.73ID:vMwdzdp/
>>595
行頭に,を書く悪習はいいかげんヤメロ

599NAME IS NULL2018/11/01(木) 21:02:02.93ID:???
行頭に,を書くとどういう問題があるんだ?

600NAME IS NULL2018/11/01(木) 21:32:48.31ID:vMwdzdp/
>>599
ヴィジュアル的に認識しにくい

601NAME IS NULL2018/11/01(木) 21:50:22.90ID:???
まさかそれだけ?

602NAME IS NULL2018/11/02(金) 09:06:50.55ID:???
>>599
見た目にブサイク
(個人の感想です)

603NAME IS NULL2018/11/02(金) 09:48:07.02ID:???
膨大なカラム数があって、スクリプトで処理しているときには都合が良いかもしれないが、
手作業で編集する分にはどっちでもいい気がする

604NAME IS NULL2018/11/02(金) 12:32:46.28ID:c/Fx/3hC
コードは読むもんだと教わらんかったんかおまえら?
ヴィジュアル問題の大切さがいまいちわかっとらんな

605NAME IS NULL2018/11/02(金) 13:13:36.22ID:DS+sU5kd
前カンマの方が打ち忘れが減るので
自分はこちらのヴィジュアルが合っているらしい

606NAME IS NULL2018/11/02(金) 19:10:39.71ID:ckbyV4Q5
それヴィジュアルちゃうやんw

607NAME IS NULL2018/11/02(金) 19:39:46.15ID:???
前にカンマの方がコメントアウトする時に楽

608NAME IS NULL2018/11/02(金) 22:38:08.71ID:ckbyV4Q5
だからヴィジュアルちゃうやんそれ
しかもどっちゃでも変わらんしw

609NAME IS NULL2018/11/02(金) 22:53:44.45ID:???
カンマの忘れとか、余分なカンマとか、割とよくやるw

610NAME IS NULL2018/11/03(土) 03:58:33.81ID:Pv5mB3Rz
最近JSONとか末尾カンマ無視するのあるよね
あれ導入されれば後ろでもいいんだけどな
前の方が行カット&ペーストで入れ替えやすい

611NAME IS NULL2018/11/03(土) 09:51:12.69ID:JBJEgXB4
前カンマの方が綺麗だと思うけどなあ
カンマと列名の間にタブなりスペースなり入れてカンマの位置を揃えるの
テキストエディタで矩形選択を使ってごりごり編集するのに便利なのだ

612NAME IS NULL2018/11/03(土) 10:58:19.38ID:???
人の好きずきの問題をここで語られても

613NAME IS NULL2018/11/03(土) 11:34:40.41ID:???
caseの件

614NAME IS NULL2018/11/04(日) 12:09:42.60ID:???
書式整形ソフト使って好きな形で読め。
--のコメントさえなければSQLは改行なし
で書けるんだから読むやつが好きに整形しろ。
ここで個人の好みの書式の話しされると
うざい!!

615NAME IS NULL2018/11/04(日) 12:23:08.21ID:???
ちょっと難しい問題を出してみて
そうしたら、多分静かになるから

616NAME IS NULL2018/11/11(日) 17:44:06.06ID:DVzqXgBV
そもそもカンマがいらなかったんだよな。

英文っぽくしたためにカンマ区切りにしてしまった。

列名の区切りは半角スペースか改行でよかった。

617NAME IS NULL2018/11/23(金) 19:38:48.29ID:NImj8hV3
質問させてください。
使っているのはSQLite(Python)です。

あるテーブルに、たとえば性別、血液型、職業というカラムがあって、
それぞれ、男、A、会社員、などと、データが入っているとします。
これら3つのカラムの中身について、テーブル内にある組み合わせの
パターンをすべて抽出したいのですが、sqlでどのように書けば効率がよいでしょうか?

抽出後、(男、A、会社員)は何名、(女、A、会社員)は何名、、、と
集計することが目的です。テーブルにより起こる組み合わせが様々なので、
都度調べる必要があります。

単純にFor文で1行ずつ調べて、過去にない組み合わせであれば外部のリストに
追加する形だと、非効率な気がしています。
良い方法があればお教えください。

6186172018/11/23(金) 19:43:01.73ID:???
ぐぐっていたら、下記を見つけました。

https://www.dbonline.jp/sqlite/select/index9.html

DISTINCT を使えばできそうです。
ありがとうございました。

619NAME IS NULL2018/11/23(金) 20:05:35.29ID:???
>>617
こうじゃないか

select `性別`,`血液型`,`職業`, count(*) as `人数`
from `テーブル`
group by`性別`,`血液型`,`職業`;

620NAME IS NULL2018/11/24(土) 03:57:01.05ID:???
効率悪いし、何名か?が取れないと思う

621NAME IS NULL2018/11/24(土) 03:58:33.86ID:???
distinctについてね

6226172018/11/24(土) 12:35:17.12ID:???
>>619

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

623NAME IS NULL2018/11/24(土) 16:31:58.75ID:Pyo9iAE3
再び質問です。
教えてもらった

select `性別`,`血液型`,`職業`, count(*) as `人数`
from `テーブル`
group by`性別`,`血液型`,`職業`;

で得られる'人数’を同じテーブル内の別カラムに保存したいと思い、
カラムは事前に作成しておいて、

update 'テーブル' set '人数のカラム' =
(select `性別`,`血液型`,`職業`, count(*) as `人数`
from `テーブル`
group by`性別`,`血液型`,`職業`)

としてみたのですが、group byの最後のグループのcountの結果が
全部の行に上書きされてしまいます。

各行毎に所属するグループの人数を記録するにはどう書けばよいでしょうか。

(目的は、その人(各行)の所属するグループの人数を個別に保存することです。)

よろしくお願いします

624NAME IS NULL2018/11/24(土) 17:14:07.61ID:???
>>623
> 各行毎に所属するグループの人数を記録するにはどう書けばよいでしょうか。
> (目的は、その人(各行)の所属するグループの人数を個別に保存することです。)
そんな設計やめなよ…
レコードに追加/削除/更新する度にその人数も更新しないとだめだし
毎回求めてもよほどでかい表でない限りは問題にならないだろ

625NAME IS NULL2018/11/24(土) 17:28:12.86ID:???
>>623
使用意図はわからんが、どうしても一時的にテーブルに保存したきゃUPDATEじゃなくて、DELETE→INSERTでよくね?
オイラならテーブル変数使うけど

626NAME IS NULL2018/11/24(土) 17:32:36.45ID:???
>>624

コメントありがとうございます。
実はモデルをすり替えて質問していまして、
データを書き換えての繰り返し計算に使いたいのです。

その後、order by でなく、select以下のテーブルをtable as Tなどとしてwhere句で’テーブル’とTの要素が等しい時に限定したら一応できました

何故かブロックされたのでスマホから

627NAME IS NULL2018/11/24(土) 17:49:44.47ID:Pyo9iAE3
>>625
使用意図は、エクセルの表計算のように、
左のカラムにデータがあって、それを元に
右の方のカラムに途中計算を書いていって、
最後に得られた結果の誤差が減るように
また最初の方から計算を繰り返すような感じです。

1巡の計算が大きすぎて記録を残したいのですが、ご指摘の通り、記録が不要なところはテーブル変数がよさそうです
勉強してみます

628NAME IS NULL2018/11/24(土) 17:50:56.49ID:???
オレ多分頭悪いんだろう
>>626 で何を言っているのかよく分からない

愚直に>>623の要求通りのものを書くとすれば
`テーブル`に`人数`カラムを追加したとして
update `テーブル` t1 set
`人数` = (
select `人数` from (
select `性別`,`血液型`,`職業`, count(*) as `人数` from `テーブル`
group by`性別`,`血液型`,`職業`
) t2
where
t1.`性別` = t2.`性別` and
t1.`血液型`= t2.`血液型` and
t1.`職業` = t2.`職業`
);

でも、こんなこと実際にはしないし、
もっと良い方法が必ずあるはずだし
見直した方がいい

629NAME IS NULL2018/11/24(土) 18:02:53.98ID:Pyo9iAE3
>>628

626が意味不明で申し訳ないです。
書かれておられるように自分もwhereで
比較しました。

計算は各行に対してするのですが、
それが所属するグループの平均等の計算値も
途中計算で何度もつかうのです
それで、各行にそれを入れておきたいのです

なんだか変な事をやってるみたいで恐れ入ります

630NAME IS NULL2018/11/24(土) 18:07:07.78ID:???
結局何をしたいのかさっぱり理解できないけどわざわざ違うモデルで答えさせるとか失礼な事するやつだからスルーしとくわ

631NAME IS NULL2018/11/24(土) 18:18:02.74ID:???
質問をシンプルにしたくてモデルを
変えましたが、失礼と思われたようで
済みません

632NAME IS NULL2018/11/24(土) 18:26:04.19ID:???
わざわざスルーするって宣言してる奴なんだからスルーでいいよ

633NAME IS NULL2018/11/24(土) 21:20:38.92ID:???
合計値も平均値も割と簡単に計算出来ますし
それをテーブルに入れた方が良いのか
それともDBを見ているミドルの方で計算させた方が良いのか
全体の仕組みと性能で総合的に考えた方が良いかもしれません

634NAME IS NULL2018/11/25(日) 01:43:22.84ID:+jUq2Ssi

635NAME IS NULL2018/11/26(月) 21:45:52.63ID:???
mysql,mariadbでmyisamが非推奨になったのはなぜですか?
innodbではbeginやcommitが使えるそうですが、メモ的なデータをinsertするぐらいなのですが、
それでもinnodbを使った方がいいのでしょうか?

636NAME IS NULL2018/11/26(月) 22:42:16.59ID:???
そういうのは各RDBのスレがあるんだから、そこで聞けよ

637NAME IS NULL2018/11/26(月) 23:01:09.03ID:???
>>635
こちらで聞いてみたら

MySQL SQL質問応答スレ
https://mevius.5ch.net/test/read.cgi/db/1478776715/

638NAME IS NULL2018/11/27(火) 03:05:52.60ID:???
専用スレがあったのですね、誘導ありがとうございます。

639NAME IS NULL2018/11/28(水) 16:28:54.70ID:ZtGMc1/U
【勝谷誠彦(57)死去】 人口が毎年20万人も減るほど被曝して応援させ、さらに70歳まで働いて応援
http://rosie.5ch.net/test/read.cgi/liveplus/1543371270/l50

640NAME IS NULL2018/11/29(木) 10:10:36.91ID:???
以下のようなデータがあった場合、
name date rate
AAA 11/1 2000
BBB 11/1 900
CCC 11/1 500
DDD 11/1 700
AAA 11/2 2000
BBB 11/2 1200
CCC 11/2 500
DDD 11/2 700
AAA 11/3 2000
BBB 11/3 500
CCC 11/3 1500
DDD 11/3 700

最新のrateが1000未満だけを抽出するにはどうすればよいでしょうか?
DDD 11/3 700
BBB 11/3 500

641NAME IS NULL2018/11/29(木) 11:07:44.82ID:???
>>640 こうかな?
select name, MIN(date), rate
from hoge
where rate < 1000
group by name, date, rate

6426412018/11/29(木) 11:26:02.69ID:???
違った、こうか?
select a.name, a.date, a.rate
from hoge as a,
(select name, MAX(date) from hoge where rate < 1000 group by name, date) as b
where a.name = b.name and a.date=b.date;

643NAME IS NULL2018/11/29(木) 13:04:58.18ID:???
SELECT * FROM a WHERE (name,date) IN (SELECT name,MAX(date) FROM a GROUP BY name) AND rate<1000

644NAME IS NULL2018/11/29(木) 13:09:17.80ID:???
>>642
レスありがとうございます。
試したのですが、fromのselectでMAX(date)以外のも全て列挙されてしまいます。
DDD 2018/11/01 00:00:00
BBB 2018/11/01 00:00:00
CCC 2018/11/01 00:00:00
DDD 2018/11/02 00:00:00
CCC 2018/11/02 00:00:00
DDD 2018/11/03 00:00:00
BBB 2018/11/03 00:00:00
ちなみに使用DBはpostgresqlです。

645NAME IS NULL2018/11/29(木) 13:14:19.05ID:???
>>643
おお!できました!!
ありがとうございます!
整理して理解します。

646NAME IS NULL2018/11/29(木) 16:31:32.41ID:???
こういうときに色々意地悪な条件をついつい考えてしまう
最新日って言う場合、1件だけになるのか、
それとも同一日は全部該当にするのか
結果表示に時刻まで出てきていると悩んでしまう
その後の処理で何を使いたいかにもよるんだろうけど

647NAME IS NULL2018/11/29(木) 23:50:24.51ID:0rvo1ya5
>>646
ここで質問してくるやつはいつも仕様などあまり考えていない。

648NAME IS NULL2018/12/03(月) 19:05:02.42ID:???
2つの文字列カラムがあり、一方がもう片方の文字列から始まるものだけを抽出したい場合どうすればいいですか?
str1 str2
ABC ABCDEF
DEF aiu
GHI GHIxxx
JKL akasa
の場合、
ABC ABCDEF
GHI GHIxxx

649NAME IS NULL2018/12/03(月) 20:36:59.12ID:???
>>648
str1の長さがstr2より短いことがわかってるなら
where left(str2, len(str1)) = str1
でいいかと

650NAME IS NULL2018/12/03(月) 22:05:33.10ID:???
ためしてないけど、
where (str1 like str2+'%') or (str2 like str1 + '%')とかでどうだろう

651NAME IS NULL2018/12/03(月) 22:51:42.17ID:???
>>648
んじゃ他ので
WHERE PATINDEX(str1 + '%', str2) = 1

652NAME IS NULL2018/12/04(火) 10:41:43.68ID:???
>>649>>650>>651
お三方、ありがとうございました。
ばたばたしてて遅くなりましたが、確認できました。

653NAME IS NULL2018/12/04(火) 11:20:56.24ID:???
>>650-651
str1とかstr2に'%'含んでても大丈夫だっけ?

654NAME IS NULL2018/12/04(火) 11:59:27.62ID:KJK6oDpE
大丈夫。ただ+が使えるのはMS系だな。
後は使えるやり方に読み換えて

655NAME IS NULL2018/12/09(日) 16:50:28.29ID:???
SQL SERVERのSQL文について質問です

【条件】
1.全てのテーブル内容を取得
2.@ABのM_CODEとS_CODE、CのM_CODEとS_CODEが一致したNAMEを取得

一つのSQL文で完結できると助かります
以上の内容でご教示お願いします


@Table1
ID | M_CODE | S_CODE | 内容
--+----------+-----
01 | 1 | 1 | a
02 | 1 | 2 | aa
03 | 1 | 3 | aaa
04 | 1 | 2 | aaaa

ATable2
ID | M_CODE | S_CODE | 内容
--+----------+-----
01 | 2 | 1 | ab
02 | 2 | 2 | abb
03 | 2 | 3 | abbb
04 | 2 | 2 | abbbb

BTable1
ID | M_CODE | S_CODE | 内容
--+----------+-----
01 | 3 | 1 | ac
02 | 3 | 2 | acc
03 | 3 | 3 | accc
04 | 3 | 2 | acccc

CCode
M_CODE | S_CODE | NAME
--+----------+-----
1 | 1 | サッカー
1 | 2 | 野球
1 | 3 | バスケット
2 | 1 | バナナ
2 | 2 | リンゴ
2 | 3 | オレンジ
3 | 1 | サバ
3 | 2 | カツオ
3 | 3 | マグロ

656NAME IS NULL2018/12/09(日) 18:37:50.56ID:???
1,2,3をuionして4とjoinすればいいんだろうけど,何んでこんな設計?

657NAME IS NULL2018/12/09(日) 18:58:36.79ID:???
欲しい結果がよくわからん

4に1〜3をJOINするだけじゃダメなのか?

新着レスの表示
レスを投稿する