SQL質疑応答スレ 5問目
レス数が1000を超えています。これ以上書き込みはできません。
0001NAME IS NULL
2007/10/27(土) 21:09:21ID:OP1e5oAphttp://sql.main.jp/cont/sql/map.html
http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
http://oraclesqlpuzzle.hp.infoseek.co.jp/
http://www.techscore.com/tech/sql/
前スレ:【帰ってきた】SQL質疑応答スレ 4問目
http://pc11.2ch.net/test/read.cgi/db/1176553195
質問テンプレ
・DBとバージョン
・テーブルデータ
・欲しい結果
・説明
0002NAME IS NULL
2007/10/28(日) 05:58:02ID:???SQL質疑応答スレ http://pc8.2ch.net/test/read.cgi/db/1056973582/
SQL質疑応答スレ Part 2 http://pc8.2ch.net/test/read.cgi/db/1103113155/
【帰ってきた】SQL質疑応答スレ http://pc8.2ch.net/test/read.cgi/db/1124178925/
【帰ってきた】SQL質疑応答スレ 2問目 http://pc8.2ch.net/test/read.cgi/db/1141622643/
【帰ってきた】SQL質疑応答スレ 3問目 http://pc11.2ch.net/test/read.cgi/db/1160458216/
【帰ってきた】SQL質疑応答スレ 4問目 http://pc11.2ch.net/test/read.cgi/db/1176553195/
0003NAME IS NULL
2007/10/28(日) 12:24:13ID:HNaUJLCGzip(
pubcode INT
,zip5 CHAR(5)
,zip7 CHAR(7)
,pref_k TEXT
,city_k TEXT
,town_k TEXT
,pref_j TEXT
,city_j TEXT
,town_j TEXT
);
で
SELECT zip7,pref_j,city_j,town_j FROM zip WHERE 0=0 AND city_j = 'hoge'
LIMIT 5
みたいな事をしているのですが、
WHERE 0=0の意味が分かりません。
「WHERE句の条件の所で0=0という妙なものが入っていますが、
コレはコーディングを簡略化するための小技です。
SQL文を動的に作成する場合、条件検索が複雑になってくるとWHERE句が
長くなってきますが、SQL文を文法的に正しくするため、
条件を動的に増やすたびに、その直前にWHEREを付けるかANDを付けるかを判断する必要が有ります。
ここでは、WHERE 0=0というダミーの条件を頭につける事で、後は機械的にANDでつなげば良いようにしています」
という説明が有るのですが、いまいち理解出来ません。
何か具体例はないでしょうか?
0004NAME IS NULL
2007/10/28(日) 12:42:13ID:???スレ違いなんだが、最後の文句
> 後は機械的にANDでつなげば良いようにしています
がすべてじゃね。
とりあえずPHPで書くと、
$where = "WHERE 0=0 ";
if ($pref) $where += "AND pref_j=$pref ";
if ($city) $where += "AND city_j=$city ";
if ($town) $where += "AND town_j=$town ";
$sql = "SELECT * FROM zip $where LIMIT 5";
ってことだろう。
俺なら配列に入れておいて" AND " でJOINするけどな。
0005NAME IS NULL
2007/10/28(日) 12:46:20ID:???if ($pref) $where += "AND pref_j='$pref' ";
if ($city) $where += "AND city_j='$city' ";
if ($town) $where += "AND town_j='$town' ";
' 'でくくるの忘れてt。
0006NAME IS NULL
2007/10/28(日) 21:59:15ID:???アルバイトで返事が遅れました。
すいません、SQLに初めて触るので不理解です。
えっと、SELECT文にはWHERE句を入れなければならないけれども、
この場合WHERE hogeで固定すると、引数に応じた柔軟なSQL文を発行するのが
めんどくさい。
そこで、WHERE 0=0として引数に応じてANDで追加したら、コーディングが
楽になると言う理解でよろしいでしょうか?
ちなみに WHERE 0=0ってどういう意味なんでしょうか?
今までの場合だと、
WHERE zip7とかWHERE 100といった直接指定しか習っていないので、
0=0の意味が良く分からないです。
0007NAME IS NULL
2007/10/28(日) 22:31:01ID:???0=0は常に真となるダミーの条件。
つけてもつけなくてもSQLの意味としては全く同じ。
なんで必要かが分からないうちはつけなくていい。
プログラムでSQLを自動生成するようになれば
おのずと分かるようになるよ。
0008NAME IS NULL
2007/10/28(日) 23:34:47ID:???0009NAME IS NULL
2007/10/29(月) 11:02:14ID:???0010NAME IS NULL
2007/10/29(月) 12:01:11ID:???直接連絡の取れない会社に「テキストでのsqlダンプ」をくださいといったのですが、
秀丸で開くとバイナリっぽい感じがするデータが来ました。
TAPE <文字化け> microsoft SQL serverと1行目にあるのですが、
これはテキストでのsqlダンプなのでしょうか?
完全なテキストデータでは、microsoft SQL serverはエクスポートできないのでしょうか?
0011NAME IS NULL
2007/10/29(月) 20:22:15ID:BxcL5p6/-------
1, 0101, 100
1, 0101, 200
2, 0102, 300
2, 0103, 400
というようなテーブルがあって、
a, count(b), sum(c)
-------------------
1, 1, 300
2, 2, 700
というようなのを取得するにはどうすればいいのでしょうか。
まず group by a をするのは思いついたのですが、b の扱いに悩んでいます。
postgres なんですが、サブクエリを使って二段階で処理すれば
いけるのかなとは思っているのですが、できれば一発で処理したいです。
0012NAME IS NULL
2007/10/29(月) 20:29:42ID:???SELECT a,count(DISTINCT b),sum(c) FROM Table GROUP BY a;
0013NAME IS NULL
2007/10/29(月) 20:48:55ID:???ありがとうございます。
DISTINCTって、集約関数の引数の欄にも書けるんですね。驚きました。
0014NAME IS NULL
2007/10/29(月) 20:50:59ID:???スレ違い。「BCP でエクスポートしてね」って頼め。
詳しくは、SQL Server の専用スレで。
0015NAME IS NULL
2007/10/30(火) 00:14:05ID:???ボイスコット正規形がちんぷんかんぷんで解りません・・・・。
ので、解説お願い致します。
なるべくイメージが攫み易いように比喩など使って戴けると幸いです。
あと、調べた限りですと、
非キー項目から主キー項目を特定する事が出来てしまう(主キーが非キー項目に関数従属している)らしいのですが
どうして、このように特定できてはいけないのでしょうか?
0016NAME IS NULL
2007/10/30(火) 14:00:25ID:sO7Hyn8fレコードが4つあり、idがユニークで 1 2 4 6 という値が入っています。
このテーブルにインサートしたいのですが、SELECT MAX(id) の結果に
1を足した値をインサートする方法だと、いつかはオーバーフローします。
3でインサートしたいのですが、3を得るためによいSQL文はありませんでしょうか?
0017NAME IS NULL
2007/10/30(火) 15:05:25ID:LF/fw7efInStrとLike/ILikeでは何か違いがあるのでしょうか。
とりあえずキーワードの前後に%をつければいいという事はわかりましたが、
ヒットする件数に微妙な違いが出るときがあるようです。
その違う例を発見できれば、何かわかりそうなのですが、
access側とpostgres+VB側それぞれ付き合わせるにしても件数が大きくて困っています。
0018NAME IS NULL
2007/10/30(火) 15:06:27ID:???それが自然キーではない、つまりシステム内部で採番しシステム内部で使用するキーならば、
余計なことを考えずにより大きな型、32bitや64bitの整数を使う。
Max+1ではなくidentity属性やsequenceを使うのが基本。
それが自然キーならば、例えば1-9999の番号を繰り返し使うなどルールがある場合は、
例えば使わなくなった番号を管理するテーブルを別に持ちまずそれから番号を取得するなど、
いくつか方法がある。
採番の範囲が広いほどそれなりの工夫をしなければパフォーマンスを落とすことになりやすい。
0019NAME IS NULL
2007/10/30(火) 21:38:01ID:???すでに1行以上データがあることが前提だが、最小の空き番は以下でとれる。
SELECT min(id)+1 FROM Table AS T1 WHERE NOT EXISTS (SELECT * FROM Table WHERE id=T1.id+1);
だけど、>>18に同意。
0020NAME IS NULL
2007/10/31(水) 17:46:13ID:WwEAVoHFオブジェクトが閉じている場合は、操作は許可されません。
というエラーです。
rsが閉じているかどうやって調べればよいのでしょうか?
0021NAME IS NULL
2007/10/31(水) 17:49:34ID:???すれ違い、この辺できいてくれ
ADO DAO など接続方法について
http://pc11.2ch.net/test/read.cgi/db/1059027812/l50
0022NAME IS NULL
2007/10/31(水) 17:51:23ID:WwEAVoHF0023NAME IS NULL
2007/10/31(水) 18:06:36ID:???0024NAME IS NULL
2007/10/31(水) 18:09:34ID:???そのスレにはもっと痛い奴が何年も住み着いてるからきーつけな>WwEAVoHF
0025NAME IS NULL
2007/11/02(金) 16:01:42ID:B26ewXs/2つのテーブル tbl1 と tbl2 があり、SELECTする際にこの2つを結合させるものとします。
このとき取得できるフィールド名に、別名をつけたいと考えています。
tbl1.foo → tbl1_foo
tbl1.bar → tbl1_bar
tbl2.foo → tbl2_foo
tbl2.bar → tbl2_bar
というように、ユニークな別名をつけるにはどうすれば良いでしょうか。
もちろん、1つずつASを使うのが確実ではあるのですが、文字列操作関数で一括置換できないかなと。
プログラム側の都合上、同じフィールド名だと片方しか取得できないもので…。
0026NAME IS NULL
2007/11/03(土) 06:57:14ID:???以下のようなデータがあるとします。
-----------------
id name
-----------------
1 win xp
2 max os x
3 win 95
nameの先頭が"win"になっているものをwindowsに置き換えたいと考えており、
期待している結果は以下の通りです。
-----------------
id name
-----------------
1 windows xp
2 max os x
3 windows 95
このような更新を行うSQLはどのようにかけばよろしいのでしょうか?
mysqlを使ってます。
よろしくお願い致します。
0027NAME IS NULL
2007/11/03(土) 08:24:08ID:???0028NAME IS NULL
2007/11/03(土) 08:26:06ID:???UPDATE Table SET name=replace(name,'win ','windows ') WHERE name LIKE 'win %';
一応誤爆(windows -> windowsdows)回避のためwinの後ろにスペースを入れてある。
まぁ、これだと、nameが'win win os'となっていた場合、'windows windows os'ってなってしまう。
MySQLで可能かどうか不明だが、
UPDATE Table SET name='windows' || substring(name FROM 'win #"%#"' FOR '#') WHERE name LIKE 'win %';
POSIX正規表現が使えるならもそっと楽かな。
UPDATE Table SET name=regexp_replace(name,'^win ','windows ') where name LIKE 'win %';
002928
2007/11/03(土) 08:33:59ID:???UPDATE Table SET name='windows '||substring(name,5) WHERE name LIKE 'win %';
0030NAME IS NULL
2007/11/03(土) 14:19:49ID:???テーブルのnameフィールドが一部は
「山田 太郎」や「山田 太郎」となっており、
一部は
「山田太郎」
となっています。
スペースを無くす方向で統一したいのですが、下記SQL文で合っているでしょうか。
念のためバックアップしますが、それでも失敗したくないので。。。お願いします。
UPDATE table SET name=replace( name, ' ', '' )
UPDATE table SET name=replace( name, ' ', '' )
0031NAME IS NULL
2007/11/04(日) 22:42:08ID:???マジですか?ISOのサイトにそう描いてある文書ないでしょうか。
0032NAME IS NULL
2007/11/04(日) 22:56:46ID:???『Database Language SQL』
としか書いてねぇよ。
0033NAME IS NULL
2007/11/04(日) 23:09:38ID:???そうか・・
0034NAME IS NULL
2007/11/04(日) 23:10:41ID:???→
○ >>32
みすった・・
0035NAME IS NULL
2007/11/05(月) 15:33:31ID:???現在のテーブル内情報:
GROUP_ID│REG_DATE │TEL_NO │STATUS
-────┼─────┼──────┼─────
A001 │2007/10/01│03-9999-0001│ENABLED
A001 │2007/09/20│03-9999-0002│DISABLED
A001 │2007/10/03│03-9999-0002│ENABLED
A001 │2007/10/03│03-9999-0003│ENABLED
A001 │2007/08/01│03-9999-0003│DISABLED
A001 │2007/10/31│03-9999-0004│DISABLED
A001 │2007/10/31│03-9999-0005│DISABLED
このうちTEL_NOが重複しないように、
GROUP_ID│REG_DATE │TEL_NO │STATUS
-────┼─────┼──────┼─────
A001 │2007/10/01│03-9999-0001│ENABLED
A001 │2007/10/03│03-9999-0002│ENABLED
A001 │2007/10/03│03-9999-0003│ENABLED
A001 │2007/10/31│03-9999-0004│DISABLED
A001 │2007/10/31│03-9999-0005│DISABLED
こうなるように、
・STATUS=ENABLEDで重複無しの場合はそのまま抽出。
・STATUS=DISABLEDで重複無しの場合はそのまま抽出。
・STATUS=DISABLEDとENABLEDの双方が設定されて重複
登録されているデータについては、
STATUS=ENABLEDのもののみを重複無しで取得したい。
という条件でselectしたいのですが、
どのように記述すれば良いでしょうか?
よろしくお願いします。
0036NAME IS NULL
2007/11/05(月) 19:32:18ID:???ENABLED同士、DISABLED同士で重複している場合は
どういう条件で重複を排除するのか?
なんとなく
select A.GROUP_ID, A.REG_DATE, A.TEL_NO, A.STATUS
from TableName A
inner join
(select TEL_NO, max(REG_DATE) as MAX_REG_DATE
from TableName
group by TEL_NO
) B
on A.TEL_NO = B.TEL_NO
and A.REG_DATE = B.MAX_REG_DATE
;
でいいような気がするが。
003735
2007/11/06(火) 02:07:29ID:???ご教示ありがとうございます。
今、徹夜中で頭がもうろうとしているので、
明日、あらためて試させていただきたいと思います。
重ね重ねありがとうございます。
003835
2007/11/06(火) 10:18:59ID:???さっそく試してみたところ、望んでいた結果が得られ
見事うまくいきました(号泣)
本当にありがとうございました。
JOINの使い方をよく理解してないので、
これからJOINを勉強してみます。
0039NAME IS NULL
2007/11/06(火) 10:19:04ID:XhrkB73vデータベースに接続指定を書き込んだファイルを用意する形で、ファイルは同一サーバー上ですが、セキュリテリの面から直接プログラムファイルに書き込まず、別ディレクトリに設置し読み込ませます。
0SはLinuxです。
その読み込みファイル1枚に、MySQlとPostgleに同時接続させるような設定を書いた場合、同時にDBを操作できるのでしょうか。
0040NAME IS NULL
2007/11/06(火) 10:39:09ID:???日本語でOK
つか、何をしたいのか全く読み取れんよ。
> 1つのファイルにmysqlとPostgreSQLから同時にアクセス
1つのファイルに2つのRDBMSからアクセスするの?
> その読み込みファイル1枚に、MySQlとPostgleに同時接続させるような
1つのスクリプト or PGから2つのRDBMSに接続するの?
後者だとして、明示的に別なConnectionとかで扱えば、
個別のDataSourceとして扱うと思うがな。
それとも2つのRDBMSを1つの物として扱いたいって事か?
0041NAME IS NULL
2007/11/06(火) 10:47:24ID:???pgsql:server=localhost/dbname=hoge...
musql:server=loclahost/dbanme=hoge...
って書いておいて、それを読み込んで接続したいってことかな?
そりゃ、ホスト言語の仕様次第だろ。単純な読み込みならまず問題ないと思うが。
んで、スレ違いだな。
0042NAME IS NULL
2007/11/06(火) 10:48:02ID:???0043NAME IS NULL
2007/11/07(水) 00:24:57ID:jxOaFgZrをよく見ると数字のゼロなのがウケル。
からかってんのか??
0044NAME IS NULL
2007/11/08(木) 01:29:29ID:???date | customer | paper | pen | cable
------------------------------------
2007/11/01 | Mr.AAA | 100 | 200 | 400
2007/11/01 | Mr.BBB | 150 | 300 | 350
2007/11/01 | Mr.CCC | 500 | 250 | 600
paper,pen,cableなどの列名を先頭に持ってきて
列com_name,priceを追加して、
下のような表を作ることはSQLまたは、PL/SQLでできるのでしょうか?
com_name | date | customer | price
----------------------------------
paper | 2007/11/01 | Mr.AAA | 100
paper | 2007/11/01 | Mr.BBB | 150
paper | 2007/11/01 | Mr.CCC| 500
pen | 2007/11/01 | Mr.AAA | 200
pen | 2007/11/01 | Mr.BBB | 300
pen | 2007/11/01 | Mr.CCC| 250
cable | 2007/11/01 | Mr.AAA | 400
cable | 2007/11/01 | Mr.BBB | 350
cable | 2007/11/01 | Mr.CCC| 600
カーソル使って中は何とかなるけど、
肝心の両端がどうにもならんのです。
SQL PL/SQLやり始めて1月程度。
この辺が限界です。
どなたかお力を・・・
0045NAME IS NULL
2007/11/08(木) 04:32:45ID:???カラムが決め打ちでいいなら可能
0046NAME IS NULL
2007/11/08(木) 05:30:03ID:???PL/SQLでSQL組み立てれば可能かな。(カラム決め打ちじゃない場合)
Oracleスレで聞いた方がいいんじゃね。
0047NAME IS NULL
2007/11/08(木) 21:07:22ID:nXrq+1YJ元に取得したい結果を抽出したいのですがご教授お願いします。
テーブルA
ID1 |ID2 |ID3 |MONEY
-----------------------
010101|020202|030101|1000
010101|020202|030201|2000
010101|020202|030301|3000
010101|020202|030502|4000
010101|030202|040601|5000
010101|030202|040701|6000
テーブルB
ID1 |ID2 |ID3 |NAME
-----------------------
010101|020202|030101|A
010101|020202|030201|B
010101|020202|030301|C
010101|020202|030502|D
010101|030202|040601|E
010101|030202|040701|F
テーブルAの重複行を得る。
ID1 |ID2 |ID3_1|ID3_2|COUNT
-----------------------------
010101|020202|03 |01 |3
010101|030202|04 |01 |2
ID3_1 は SUBSTR(ID3,1,2)
ID3_2 は SUBSTR(ID3,5,2)
取得したい結果
ID1 |ID2 |ID3 |NAME|MONEY
------------------------------
010101|020202|030303|A |1000
010101|020202|030403|B |2000
010101|020202|030301|C |3000
010101|030202|040601|E |5000
010101|030202|040701|F |6000
004847
2007/11/08(木) 21:08:04ID:nXrq+1YJSELECT A.ID1,A.ID2,A.ID3,B.NAME,A.MONEY
FROM テーブルA A,テーブルB B
WHERE
(A.ID1
,A.ID2
,SUBSTR(A.ID3,1,2)
,SUBSTR(A.ID3,5,2)
) IN
(SELECT
A2.ID1
,A2.ID2
,SUBSTR(A2.ID3,1,2)
,SUBSTR(A2.ID3,5,2)
FROM テーブルA A2
WHERE
A2.ID1
AND A2.ID2
AND SUBSTR(A2.ID3,1,2)
AND SUBSTR(A2.ID3,5,2)
GROUP BY
A2.ID1
,A2.ID2
,SUBSTR(A2.ID3,1,2)
,SUBSTR(A2.ID3,5,2)
HAVING COUNT(*) > 1
)
上記のようなSQLを作成したのですが
テーブルBと結合した際に重複行以外も取得してしまいます。
長文で申し訳ありませんでしたがどなたかご教授ください。
0049NAME IS NULL
2007/11/08(木) 21:18:11ID:???でも、それとテーブルBをどう結合するのかが
理解できん。
まず日本語できちんと説明してみれ
005047
2007/11/08(木) 22:03:41ID:nXrq+1YJテーブルBの使用用途としては名称取得の為に使います。
取得したい結果はテーブルAの重複行の結果を元に名称が違うものだけを
抽出するというものです。
グループ化した後にグループ化された結果のデータの詳細を
表示するのですが、その際にテーブルAの重複行として取得した結果以外
のものが取得されてしまうのです。
日本語が下手で分かりにくいと思いますがすいません。
0051NAME IS NULL
2007/11/08(木) 22:06:24ID:???箇条書きでいいから条件羅列してみれ
0052NAME IS NULL
2007/11/08(木) 22:12:33ID:???ID1 |ID2 |ID3 |NAME|MONEY
------------------------------
010101|020202|030303|A |1000
このID3=030303ってデータはどこからくるの?
テーブルAにもBにも存在しないんだけど。
0053NAME IS NULL
2007/11/08(木) 22:35:30ID:???「取得したい結果」は、
ID1 |ID2 |ID3 |NAME|MONEY
------------------------------
010101|020202|030101|A |1000
010101|020202|030201|B |2000
010101|020202|030301|C |3000
010101|030202|040601|E |5000
010101|030202|040701|F |6000
の間違いじゃないのか?(1行目と2行目のID3)
そうだとしたら、ほぼ>>48のまま
select A.ID1, A.ID2, A.ID3, B.NAME, A.MONEY
from テーブルA A, テーブルB B
where (A.ID1, A.ID2, substr(A.ID3, 1, 2), substr(A.ID3, 5, 2))
in
(select A2.ID1, A2.ID2, substr(A2.ID3, 1, 2), substr(A2.ID3, 5, 2)
from テーブルA A2
group by A2.ID1, A2.ID2, substr(A2.ID3, 1, 2), substr(A2.ID3, 5, 2)
having count(*) > 1
)
and A.ID1 = B.ID1
and A.ID2 = B.ID2
and A.ID3 = B.ID3
で良さそうなもんだけど。
005447
2007/11/08(木) 22:44:46ID:nXrq+1YJ・テーブルAのID3の1,2桁目と5,6桁でグループ化をする。
・グループ化したID3を元に重複している名称を抽出する。
・名称を抽出した際にグループ化した結果以外が抽出されてしまう。
取得したい結果 は間違ってました。すいません。
以下が本当の取得したい結果です。
ID1 |ID2 |ID3 |NAME|MONEY
------------------------------
010101|020202|030101|A |1000
010101|020202|030201|B |2000
010101|020202|030301|C |3000
010101|030202|040601|E |5000
010101|030202|040701|F |6000
0055NAME IS NULL
2007/11/09(金) 00:22:12ID:???ID3_1|ID3_2|COUNT
03 |01 |3
03 |02 |1
04 |01 |2
>・グループ化したID3を元に重複している名称を抽出する。
上の結果からCOUNTが2以上(重複がある行)を抽出。
ID3_1|ID3_2|COUNT
03 |01 |3
04 |01 |2
テーブルAのID3の1,2桁目と5,6桁が上の結果のID3_1|ID3_2と一致する行を抽出。
ID1 |ID2 |ID3 |MONEY
-----------------------
010101|020202|030101|1000
010101|020202|030201|2000
010101|020202|030301|3000
010101|030202|040601|5000
010101|030202|040701|6000
テーブルBと合わせる。
ID1 |ID2 |ID3 |NAME|MONEY
------------------------------
010101|020202|030101|A |1000
010101|020202|030201|B |2000
010101|020202|030301|C |3000
010101|030202|040601|E |5000
010101|030202|040701|F |6000
って事?>>47
0056NAME IS NULL
2007/11/12(月) 00:31:35ID:tKheOgZeCREATE TABLE test_tbl (
id int(11) NOT NULL auto_increment,
name varchar(255) default NULL,
mydate date NOT NULL,
PRIMARY KEY (id),
);
こんなテーブルがあり
毎日定時にSELECT文を実行して mydateから30日後,60日後,90日・・・・と
mydate から本日が30日間隔のidを永遠に抽出したいんですが、どういう風に記述すればよいでしょうか?
0057NAME IS NULL
2007/11/12(月) 01:13:30ID:???select * from test_tbl where mydate<sysdate() and (sysdate()-mydate)%30=0
0058NAME IS NULL
2007/11/12(月) 18:49:35ID:3CGhHvj/--+----------+-----
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の書き方を教えてください。
0059NAME IS NULL
2007/11/12(月) 19:55:42ID:???>>35-36
0060NAME IS NULL
2007/11/12(月) 20:08:04ID:3CGhHvj/サブクエリーでMaxとった後に、同じテーブルを当てるのですね。
やってみたら上手くいきました。
有難う御座いました。
0061NAME IS NULL
2007/11/12(月) 22:51:57ID:???以下の二つのテーブルがあるとします。
(1)user_tbl
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 1 | tarou |
| 2 | jirou |
| 3 | saburou |
+---------+-----------+
(2)question_tbl
mysql> select * from question_tbl;
+-------------+---------+--------+
| question_id | user_id | answer |
+-------------+---------+--------+
| 1 | 1 | yes |
| 2 | 1 | yes |
| 3 | 1 | yes |
| 4 | 1 | no |
| 5 | 1 | no |
+-------------+---------+--------+
5 rows in set (0.00 sec)
この二つのテーブルから以下の結果を導き出したいです。
+----------+-----------+--------+-----+
| _user_id | user_name | yes | no |
+----------+-----------+--------+-----+
| 1 | tarou | 3 | 2 |
| 2 | jirou | 0 | 0 |
| 3 | saburou | 0 | 0 |
+----------+-----------+--------+-----+
このような結果を作るSQLはどのようになりますでしょうか?
よろしくお願い致します。
0062NAME IS NULL
2007/11/12(月) 23:14:33ID:???ヒント:sum(case when answer = 'yes' then 1 else 0 end) as yes
0064RrLJfFysqaTB
2007/11/13(火) 12:50:19ID:???0065NAME IS NULL
2007/11/14(水) 01:15:06ID:???以下のようなテーブルがあったとします。
GROUP_ID│USER_NO│SALARY
-────┼────┼────
A001 │ 17040│200000
A001 │ 18302│190000
A002 │ 28321│200000
A002 │ 23434│200000
A003 │ 56787│210000
A003 │ 98908│200000
A003 │ 67589│210000
このテーブルから
GROUP_ID毎のSALARYの最大値を取得したいのですが、
あわせてSALARYが最大値であるUSER_NOも取得したいのです。
結果のイメージとしては
GROUP_ID│USER_NO│SALARY
-────┼────┼────
A001 │ 17040│200000
A002 │ 28321│200000
A003 │ 67589│210000
となります。
select GROUP_ID, MAX(SALARY)
from TABLE
group by GROUP_ID
ここから先どのように記述してよいのかわかりません。
教えていただけないでしょうか?
よろしくお願いします。
ちなみにSALARYが重複した場合はUSER_NOが大きい方を表示するようにしたいです。
0066NAME IS NULL
2007/11/14(水) 01:20:21ID:???のようなことをしたいのですが、できますでしょうか?
mysqlをつかっております。
0067NAME IS NULL
2007/11/14(水) 01:23:29ID:???GROUP_ID と SALARY がわかってるんだから、
元のテーブルと JOIN すれば OK。
0068NAME IS NULL
2007/11/14(水) 01:24:00ID:???試してみればいいんじゃね?
0069NAME IS NULL
2007/11/14(水) 01:32:41ID:???MySQLじゃなくてもできないよ。
SELECT *,(a+b)AS c FROM (SELECT 10 AS a,20 AS b ...) AS T1
のようにすれば桶。
0070NAME IS NULL
2007/11/14(水) 01:43:11ID:???こうやるんだよ。
select
b.gid,
max(b.uid),
b.salary
from
(select gid, max(salary) as salary from TABLE group by gid) as a
left join
TABLE as b
on a.salary=b.salary
group by gid;
0072ElCkbafdouVDbF
2007/11/14(水) 03:04:05ID:???0073fKgpGQOBRC
2007/11/14(水) 10:41:27ID:???0075GnmKqIiRbSoLHQvXsv
2007/11/14(水) 12:30:56ID:???0076NAME IS NULL
2007/11/15(木) 01:18:33ID:???TBL1
ID(PK)
----
001
002
003
TBL2
※IDはPKでない
ID NAME
---------
001 NAME1
002 NAME2
002 NAME3
テーブル1と2を結合して
ID NAME
----------
001 NAME1
002 NAME2
003 NULL
といった具合にTBL1の件数は維持して
NAMEには一致したIDの先頭(でなくてもいい)のものを
引っ張ってきたいです。
外部結合だと
SELECT *
FROM
TBL1, TBL2
WHERE
TBL1.ID = TBL2.ID(*)
ID NAME
----------
001 NAME1
002 NAME2
002 NAME3
003 NULL
といった具合にID:002がダブってしまいます。
(002は1件でNAME2かNAME3のうち1つだけ表示したい)
何かよい解決策はないでしょうか。
0077NAME IS NULL
2007/11/15(木) 01:21:33ID:???Group By した結果と JOIN すればOK。
って、ちょっと前に似たような例があったような・・・
0078NAME IS NULL
2007/11/15(木) 01:48:23ID:???回答ありがとうございます。
こんな感じでしょうか。
今は手元に環境がないので動作確認できませんが
MAXに違和感を感じます。
SELECT *
FROM
TBL1,
(
SELECT MAX(NAME)
FROM
TBL2
GROUP BY
NAME
)TBL2
WHERE
TBL1.ID = TBL2.ID(+)
>って、ちょっと前に似たような例があったような・・・
すみません。このスレでしょうか。
教えていただけるとありがたいです。
(パっと見どれだかわからない)
0079NAME IS NULL
2007/11/15(木) 04:14:56ID:???0080NAME IS NULL
2007/11/15(木) 07:44:36ID:???ログ持ってる方、貼っていただけるとありがたいです。
008165
2007/11/15(木) 16:45:32ID:???前のテーブルに付け足したテーブルがあるとします。
GROUP_ID│USER_NO│SALARY │USER_NAME
-────┼────┼────┼──────
A001 │ 17040│ 200000│ 田中
A001 │ 18302│ 190000│ 田所
A002 │ 28321│ 200000│ 田端
A002 │ 23434│ 200000│ 田原
A003 │ 56787│ 210000│ 田井
A003 │ 98908│ 200000│ 田木
A003 │ 67589│ 210000│ 田守
取得条件は前の質問と同じで結果は以下になります。
GROUP_ID│USER_NO│SALARY │USER_NAME
-────┼────┼────┼──────
A001 │ 17040│ 200000│ 田中
A002 │ 28321│ 200000│ 田端
A003 │ 67589│ 210000│ 田守
自分で作ったSQLは
select T4.*
from T4,
(select T3.GROUP_ID,
MAX(T3.USER_NO) as USER_NO,
select T4.*
from T4,
(select
T2.GROUP_ID,
max(T2.USER_NO)
from (select GROUP_ID,
max(SALARY) as SALARY
from TABLE
group by GROUP_ID) as T1,
TABLE as T2
on T1.SALARY = T2SALARY
group by T2.GROUP_ID) T3
where T4.GROUP_ID = T3.GROUP_ID
and T4.USER_NO = T3.USER_NO
select T4. *
from TABLE T4,
(select T2.GROUP_ID,
max(T2.USER_NO) as USER_NO,
T2.SALALY
from (select GROUP_ID,
max(SALALY) as SALALY
from TABLE
group by GROUP_ID) T1,
TABLE T2
where T1.SALALY = T2.SALALY
and T1.GROUP_ID = T2.GROUP_ID
group by T2.GROUP_ID, T2.SALALY) T3
where T3.GROUP_ID = T4.GROUP_ID
and T3.USER_NO = T4.USER_NO
です。もうちょっとスマートにかけないものかなと思って質問しました。
よろしくお願いします。
0082xjQscgvGjNP
2007/11/15(木) 17:57:09ID:???0083QYuScmbNhprG
2007/11/15(木) 17:57:58ID:???0084NAME IS NULL
2007/11/15(木) 18:37:40ID:???select A.ID, B.MAX_NAME
from TBL1 A
left outer join
(select ID, max(NAME) as MAX_NAME
from TBL2
group by ID
) B
on A.ID = B.ID
>>81
>>35-36
0085NAME IS NULL
2007/11/15(木) 20:06:51ID:???SELECT * FROM
(SELECT max(user_no) AS user_no FROM Table AS T1
WHERE SALARY=(SELECT max(salary) FROM Table WHERE group_id=T1.group_id)
GROUP BY group_id) AS T2
LEFT JOIN Table USING(user_no);
スマートかどうかは...?
0086sage
2007/11/15(木) 20:16:36ID:f/zLBRc9かなり初歩的なことかと思いますが。。。
IFIXなるものを現在会社で使ってまして制御系(FA)なのですが
まったく経験がなく、データベースなるものもあまり判っていませんorz
もし、詳しく判りやすいサイトや、板誘導などがありましたら、お願いします
板汚し板違いスイマセン
0087NAME IS NULL
2007/11/15(木) 21:21:59ID:???0088NAME IS NULL
2007/11/15(木) 22:41:17ID:NMabm+GOいっしょですか?
008986
2007/11/15(木) 23:38:43ID:???サゲミスッテマスタorz
タグの種類でPGがあって、その中に「ADDOUT」や「SETMAN」などがあるのですが
それらの説明、使い方、このときはこの文法?みたいのがわかればと思いまして。。。
まったく持って初歩的な事でスイマセン
0090NAME IS NULL
2007/11/16(金) 01:06:53ID:???ttp://www.proface.co.jp/product/soft/fix/ifix.htm
これのことかな?それ向けのスレはないだろうな。
中でSQL−SERVERを使ってるようだけど直接は関係ないな。
ベンダーのユーザー会とかあるんじゃね?
営業に聴いて見たら。
0091NAME IS NULL
2007/11/17(土) 18:57:59ID:???id typeid name
---------------------------------
1 1 aaaa
2 1 bbbb
3 2 cccc
4 2 dddd
5 2 eeee
6 3 ffff
というテーブルがあった場合、typeidが多い("大きい"ではない)順番にソートする方法はあるでしょうか?
上のテーブルでいえば、
id typeid name
---------------------------------
3 2 cccc
4 2 dddd
5 2 eeee
1 1 aaaa
2 1 bbbb
6 3 ffff
となって欲しいのです。
今まではtypeidでgroup byしてcount(*)の数値を元に手作業?でどろどろとソートしていたのですが、
実は1回のselectで簡単に出来るんじゃないかと思って、色々頑張って見ましたがorzでした。
よろしくお願いします。
0092NAME IS NULL
2007/11/17(土) 19:04:25ID:???B.cnt
,A.id
,A.typeid
,A.name
from table A,
(
select
count(*) as cnt
,typeid
from table
group by typeid
) b
where A.typeid = A.typeid
order by
B.cnt
,A.id
0093NAME IS NULL
2007/11/17(土) 19:11:56ID:???本当にありがとう。次会ったらメシおごるノシ
0094msYFQKruZmljezmxU
2007/11/18(日) 04:12:25ID:???0095sEDptiCGfsyR
2007/11/18(日) 04:12:41ID:???0096UkbWCnYjjHy
2007/11/18(日) 04:13:37ID:???0097DBevzLOEcfuRezMQzKm
2007/11/18(日) 04:14:08ID:???0098NAME IS NULL
2007/11/19(月) 21:41:56ID:???table uriage
kaisha int(4),
kyaku int(9),
torihikiYMD date,
oder_number int(5)
kingaku int(9)
taishaku int(1)
というのがあって客毎に金額を集計するなら
select kyaku,sum(kingaku) from uriage
group by kyaku;
になると思うのですが、そこにtaishakuが1なら減算
9なら加算するというのをどうやったら付け加えられますか
教えてください。
0099NAME IS NULL
2007/11/19(月) 22:06:14ID:???0100NAME IS NULL
2007/11/19(月) 22:08:45ID:???010198
2007/11/19(月) 22:17:57ID:???何で4で割るのかしばし考えましたが、なるほどですね。
>>99
すいません、本見ましたけど、decodeって複号化する奴では?
0102NAME IS NULL
2007/11/19(月) 23:03:01ID:???一応case文に書き換え可能。
sum(case taisyaku when 1 then kingaku * -1 when 9 then kingaku end)
0103NAME IS NULL
2007/11/20(火) 06:36:35ID:???あ〜、固有のやつでしたか。ありがとです。
0104twavXWUFslz
2007/11/20(火) 21:57:37ID:???0105StfyyUJvYsI
2007/11/20(火) 21:57:45ID:???0106HStXqNGT
2007/11/20(火) 21:58:26ID:???0107OWiqHPJDpfe
2007/11/20(火) 22:01:42ID:???0108rrFELpiUaz
2007/11/23(金) 00:24:35ID:???0109QuyNWHZjnp
2007/11/23(金) 01:56:58ID:???0110mvfhwciOqYgTQlKScw
2007/11/23(金) 21:18:56ID:???http://kgnsye.cn/california-dept-of-corporation-htm.html California dept of corporation htm
http://kgnsye.cn/single-family-homes-carlsbad-california.html Single family homes carlsbad california
http://kgnsye.cn/archangel-tattoo-design.html Archangel tattoo design
http://kgnsye.cn/blue-book-pricings-for-atv.html Blue book pricings for atv
0111ObnIPIqgSyv
2007/11/24(土) 10:51:11ID:???0112OzbYNNxQZr
2007/11/24(土) 19:10:57ID:???0113NAME IS NULL
2007/11/25(日) 04:46:04ID:???WHERE field LIKE 'hoge%'
と
WHERE field REGEXP '^hoge'
って全く同じ条件になる、と考えてよいでしょうか?
0114XwnWVoMqtvaefKbr
2007/11/27(火) 18:49:38ID:???0115NAME IS NULL
2007/11/27(火) 21:59:57ID:JprxOidq0116NAME IS NULL
2007/11/27(火) 22:20:59ID:???ストアドプロシジャはDBMSによって構文が全く違うので
DBMS名を示さなければその質問は無意味。
SQLに限って言っても、日付・時刻に関する構文は
DBMSによって違う。
あと、やりたいことをもっと具体的に言ったほうがいいかと。
0117bVukSlOdGjiEKqu
2007/11/28(水) 12:10:38ID:???0118NAME IS NULL
2007/11/28(水) 14:21:20ID:dhNS0GoFDEPEND_ID INTEGER,
DEPEND_NAME VARCHAR(50),
DEPEND_AGE INTEGER,
DEPEND_RELATION VARCHAR(20),
EMP_ID INTEGER,
DEPT_ID INTEGER,
PRIMARY KEY (DEPEND_ID, EMP_ID, DEPT_ID),
FOREIGN KEY (EMP_ID) REFERENCES EMPLOYEE(EMP_ID),
FOREIGN KEY (DEPT_ID) REFERENCES DEPARTMENT(DEPT_ID)
)
こいつを実行すると、Unique Primary not foundと言ってくるんですが、
何がまずいのでしょうか?
0119NAME IS NULL
2007/11/28(水) 19:18:06ID:???上のSQL文ですべての質問を取り出す際、ユーザがこの質問に答えているか、調べたいのですが下のSQL文を併せて調べるよう連結させるにはどうすればいいでしょうか?
select COUNT(user_tbl) FROM answer_tbl where qid=$qid and title IS NOT NULL;
0120NAME IS NULL
2007/11/28(水) 20:42:14ID:???http://pc11.2ch.net/test/read.cgi/db/1194742799/78
0121NAME IS NULL
2007/11/29(木) 01:31:59ID:???丁寧にお手数多謝です。
SQLServer2005です。GETDATE関数でおkですね。
もっと自分で調べてから質問するようにします。ご指摘ありがとうございます。
0122NAME IS NULL
2007/11/29(木) 01:53:38ID:???-----------------------
A001 │ A1 │
A002 │ A2 │
A003 │ A3 │
A004 │ A4 │
B_ID │A_ID │ B_NAME
-----------------------------
B001 │ A001│山田
B002 │ A001│山田
B003 │ A001│山田
B004 │ A002│高橋
B005 │ A002│島田
B006 │ A002│中村
B007 │ A003│中村
B008 │ A004│山田
C_ID │B_NANE │COUNT
-------------------------------
C001 │ 山田 │ 3
C002 │ 田中 │ 1
C003 │ 高橋 │ 1
このような3つのテーブルを結合して、C_ID = C001 を抽出した際に
A_ID │A_NAME│B_NAME| C_ID
---------------------------------
A001 │ A1 │山田 │C001
A004 │ A4 │山田 │C001
と、A_IDが重複しないようなSQLの結合が上手く行かなくて悩んでおります。
こんな遅い時間で恐縮ですが、どなたかお教え願えないでしょうか。
日が昇ったら、これを講師に提出しなくてはならなくて・・・。
よろしくお願い致します。
0123NAME IS NULL
2007/11/29(木) 01:54:29ID:???使用しているプラットホームはpostgresqlでした。
0124NAME IS NULL
2007/11/29(木) 02:41:49ID:???上から TableA,TableB TableCとして
SELECT * FROM
(SELECT c_id,b_name FROM TableC WHERE c_id='C001') AS T1
JOIN (SELECT a_id,b_name FROM TableB GROUP BY a_id,b_name) AS T2 USING(b_name)
JOIN TableA USING(a_id);
0125NAME IS NULL
2007/11/29(木) 02:45:00ID:???SELECT * FROM TableC
JOIN (SELECT a_id,b_name FROM TableB GROUP BY a_id,b_name) AS T2 USING(b_name)
JOIN TableA USING(a_id)
WHERE c_id='C001';
でいいか。(このままだとTableC.countまででるけど)
0126NAME IS NULL
2007/11/29(木) 03:03:57ID:???したいんですがうまい書き方はないでしょうか?
UPDATE HOGE SET HAGE=(SELECT HAGE FROM FOO WHERE ID=?), ...
0127NAME IS NULL
2007/11/29(木) 03:12:55ID:???SELECT Hoge SET hage=COALESCE((SELECT hage FROM Foo WHERE id=?),0);
0128NAME IS NULL
2007/11/29(木) 03:13:38ID:???UPDATE Hoge SET hage=COALESCE((SELECT hage FROM Foo WHERE id=?),0);
0129NAME IS NULL
2007/11/29(木) 03:17:30ID:???ありがとうございます!
0131122
2007/11/29(木) 15:43:22ID:???遅レスで申し訳ないです。
おかげで、何とか合格しましたですよ。本当に有難うございました。
まだまだSQLが使いこなせてないので、ちょっとSQLの本買って冬休みは
勉強します。
0132FgUIzWJFDelHSJxvY
2007/11/29(木) 22:51:54ID:???http://zerozeroone.at.tut.by/gruppovoj-seks-foto.html 胙�粽 �
http://zerozeroone.at.tut.by/foto-gruppovogo-seksa.html 胙�粽胛 �
http://zerozeroone.at.tut.by/foto-grupavuha.html 胙珞
http://zerozeroone.at.tut.by/grupavoj-seks.html 胙珞�H �
http://zerozeroone.at.tut.by/foto-gruppovjih-orgij.html 胙�糺 �A肛
http://zerozeroone.at.tut.by/pjanoe-gruppovoe-orgii-foto.html ��M 胙�粽 �A肛
http://zerozeroone.at.tut.by/gruppovjie-orgii-foto-galereja.html 胙�糺 �A肛 聰�
http://zerozeroone.at.tut.by/porno-foto-seks-gruppovoj.html � � 胙�粽
0133NAME IS NULL
2007/11/30(金) 00:08:38ID:IiAQc5hj・DBとバージョン
MySQL4.0.24 です
・テーブルデータ
p_id,p_name(ペット用テーブル:pet)
-----------------
1,シロ
2,ぽち
3,タマ
s_id,s_name(社員用テーブル:syain)
-----------------
1,山田
2,小林
3,三木
t_id[auto_increment],p_id,s_id(担当者テーブル:tanto)
-----------------
1,1,1
2,2,2
3,1,3
・欲しい結果
一覧表示
=================
シロ | 三木
ぽち | 小林
タマ | (空欄)
・説明
シロの担当はは山田から後に三木に変更になっています
タマの担当者はまだ決まっていません
今はphpを使っていて
SELECT * FROM pet (ペットをすべて取得してループ開始)
SELECT * FROM tanto WHERE p_id ORDER BY t_id DESC LIMIT 1
SELECT * FROM syain WHERE s_id LIMIT 1
(ループ終わり)
としているのですが一回で出来るのでしょうか?
以前ペット用テーブルは
p_id,p_name,s_id
となっていて LEFT OUTER JOIN を使っていましたが
担当者の変更履歴が分かるようにと言われて考えてみたのですが、
そもそもやり方(構造?)がおかしいでしょうか?
よろしくお願いいたします
0134NAME IS NULL
2007/11/30(金) 01:24:57ID:???その Max(t_id) と t_id を結合し、p_id で ペット用テーブルと
Left Outer Join
0135NAME IS NULL
2007/11/30(金) 01:40:36ID:???担当者テーブルは担当者テーブルとして、現状のペットと社員の関係だけ保存し、
別にログのテーブル用意して、担当代わるときに書き込めばいいんじゃないか?
あとダミーとして社員(空欄)をs_id 0 で登録しておくとLEFT JOINで目的の
一覧表示がすぐ出せていいかと思うが、どうかね?
0136133
2007/11/30(金) 07:51:32ID:???5時間くらい格闘してみたのですが、なかなか々々で今日は休みます
担当者ありがなしになった時などダミーが必要とか
ものすごく参考になりました
データベースは個人的にアクセスを使っていただけな僕が
前任者のを引き継いだような感じで、悪戦苦闘なのですが
うまくいかないことがある反面、ものすごく面白いなと感じていますので
もうちょっとがんばってみます
レスありがとうございました!
0137NAME IS NULL
2007/11/30(金) 13:35:30ID:???mysql> select p.p_name, s.s_name
-> from pet p
-> left outer join tanto t
-> on p.p_id = t.p_id
-> and t.t_id =
-> (
-> select max(t_id)
-> from tanto t2
-> where t2.p_id = t.p_id
-> )
-> left outer join syain s
-> on t.s_id = s.s_id
-> order by p.p_id;
+--------+--------+
| p_name | s_name |
+--------+--------+
| シロ | 三木 |
| ぽち | 小林 |
| タマ | NULL |
+--------+--------+
3 rows in set (0.00 sec)
0138NAME IS NULL
2007/11/30(金) 18:26:43ID:???0139NAME IS NULL
2007/11/30(金) 18:30:32ID:???0140133
2007/11/30(金) 22:08:39ID:???>けっこうムズいね
うーん、やっぱり僕のテーブルの作り方がマズいのかなあ…
わざわざ書いてもらって本当にありがとうございました
>>138-139
昨日いろいろやっていてどうにも納得できなかった部分が釈然としました
本を2冊買って、ネットの情報も元にしていたのですが、
サブクエリが使えないバージョンだったのですね、、、
ちょっと構成を見直すことと、サブクエリを使った例文が
結構ありますので、前任者に連絡をとってみてMySQLを
4.1以降にすることをやってみたいと思います
皆様ありがとうございました
0141NAME IS NULL
2007/12/02(日) 22:23:46ID:SHn+jsyg下さい。
以下のSQL文のaとbの結果がイマイチ理解できません。
aをGROUP BYしたあとbをGROUP BYして、異なった値があれば付け足して
表示しているのでしょうか?
SELECT a , b
FROM c
GROUP BY a , b;
0142NAME IS NULL
2007/12/03(月) 02:19:33ID:???0143初心者
2007/12/03(月) 03:30:55ID:ukVIXvlY突然ですが質問があります。
SQL SERVER 2005 で、自動的(1時間ごとに)にバックアップをとり、48時
間分のファイルを保存しておきたい時はどのようにしたらいいのですか。
基本的にフルバックアップです。
サイズはは100メガくらいです。
スケジューラは使います。
ログもそのまま保存します。
みなさまのお力をお貸しください。(__)
0144NAME IS NULL
2007/12/03(月) 03:32:56ID:???SQL Server スレへ Go
0145初心者
2007/12/03(月) 03:38:14ID:ukVIXvlY0146NAME IS NULL
2007/12/04(火) 15:54:19ID:V8j0VlBH変わりになるようなものは用意されていないのでしょうか?
0147NAME IS NULL
2007/12/04(火) 19:34:23ID:g6rhgp+gDECIMAL型について勉強しているんですが、
salary DECIMAL(5,2)
この例で、5 (precision) は、値に対して格納される
10 進数の桁数を表わし、2 (scale) は、小数点に続いて
格納される桁数を表わします。したがって、この場合、
salary カラムに格納できる値の範囲は、-99.99 〜 99.99 になります。(MySQL では、正数の符号を格納する必要がないため、
このカラムには、実際には、999.99 までの数値を格納することができす)。
とあったんですが、
5桁まで格納できるなら
-999.99~999.99じゃないんですか?
0148NAME IS NULL
2007/12/04(火) 23:27:25ID:???RULEかTRIGGERを使うしかないと思う。
参考 ttp://codingforums.com/archive/index.php?t-52346.html
続きはPostgreSQLスレで。
>>147
SQL的には-999.99~999.99が正しかったと思う。
>(MySQL では、正数の符号を格納する必要がないため、
言い換えれば、「MySQLは負の符号を格納する分ため-99.99~999.99までしか扱えない」
ということかな。MySQLスレで聞いた方がよかね。
0150NAME IS NULL
2007/12/05(水) 19:32:19ID:???SELECTは2回発行するしかないよね?テーブルの全行を2回スキャンするしかない
と思ってンだけど。
0151NAME IS NULL
2007/12/05(水) 19:49:55ID:???>>62
0152NAME IS NULL
2007/12/06(木) 13:07:14ID:0iWlbZYzあるゲームがあるとして、ユーザー数千人の各一人一人の
行動をログに取りたい場合なんですが、
全員のユーザーのログを、ユーザーIDとログIDをキーとして
一つのテーブルに入れると、膨大なレコード数になっちゃいますよね。
そうなるとインサートの時や索引張るときに
かなり負荷がかかりそうだし
さらにその詳細情報も…。
なんてことになったら詳細テーブルには更に指数的にレコードが増えてしまいます。
そこで、ユーザーごとにログテーブルと
ログ詳細テーブルを作ってやればいいんじゃね?
と思ったのですが
こういうやり方ってどうなんでしょう?
テーブルがめちゃくちゃ増えるだけで
結局情報量は変わらないですが、
負荷は減りそうな気はするんですが…。
他にもっとスマートなやり方があれば
教えて頂きたいッス〜m(_ _)m
0153NAME IS NULL
2007/12/06(木) 14:20:20ID:???0154NAME IS NULL
2007/12/06(木) 15:21:13ID:???テーブルを管理するあたりの部分が大量のテーブルに耐えられるつくりに
なっているかどうかはわからんな。巨大な1テーブルとユーザごとの大量の
テーブルの中間が現実的な落としどころじゃない? 実際のところは具体的
にやってみないとわからんと思う。
0155NAME IS NULL
2007/12/06(木) 15:53:02ID:0iWlbZYzありがとうございます。
確かに問題はテーブルの管理部分ですよね。
テーブルが増えるとシステム管理系のテーブルが重くなって
全体的な負荷が上がることは考えられますね…。
DBの構造にインスタンス的な情報を入れると
DBの保守性もあまりよろしくない感じなので、やっぱり難しいですかね…。
書き込みが多く、見ることは少ないので、
イベントの種類別でテーブル作って、
見るときはそのテーブルを
マージするSELECT文作るあたりが中間の落としどころですかね…。
0156NAME IS NULL
2007/12/06(木) 17:02:54ID:pzP20kpshttp://video.nifty.com/cs/catalog/video_metadata/catalog_071205047052_1.htm
0157NAME IS NULL
2007/12/06(木) 21:47:31ID:???0158NAME IS NULL
2007/12/06(木) 23:33:06ID:???ユーザごとにログファイルを置いてもいいような。
ユーザごとなら同時書き込みなんて起こらないし。
0159NAME IS NULL
2007/12/07(金) 01:16:48ID:???どの程度の頻度で更新されるのか、データ量はどれくらいあるのか、によると思う。
MMORPGのように、例えば1秒とか数秒ごとに記録をするのもあれば、
PBWのように月1で記録するものもあるだろう。
0160NAME IS NULL
2007/12/07(金) 14:00:12ID:V9WCgeuV>>157
パーティションは名前だけで良く知りませんでした、
ちょいと調べてみたところ、検討する価値がありそうですね。
>>158
ログから今度統計を取ったりするので、DB化した方が良いかなと…。
例えば全ユーザーが一番苦手とする敵とか。
>>159
MMO程じゃないですが、ログ書き込みは平均10秒に1度程度を予定してます。
また、ロギングするイベントの種類も
せいぜい15個程度なので…。
0161NAME IS NULL
2007/12/08(土) 20:30:33ID:jFBCt3fk普通どうやって回避するの?
ShiftJIS以外を使うしかないの?
一応今使ってるDBはMySQL
0162NAME IS NULL
2007/12/08(土) 20:51:38ID:???0163NAME IS NULL
2007/12/08(土) 20:54:38ID:M+oCyQsjDBは、Oracle9です。
取り扱いメニュー(T_MENU)
店舗Code | メニューコード | 適用開始日
101 | 001 | 20071001
メニューマスタ(MENU)
メニューコード | 副番 | メニュー名 | 適用開始日 | 適用終了日
001 | 1 | メニューA | 20070901 | 20070930
001 | 2 | メニューB | 20070931 | 20071020
001 | 3 | メニューC | 20071001 | 20071015
とある場合に、「取り扱いメニュー」を基に結合してメニュー名を取得したい
のですが、業務用件として取得するメニュー名は、取り扱いメニューテーブル
の適用開始日時点で有効なメニューの副番のうち、一番若い副番のものという
指示がありました。
つまり、結果として得たいクエリは、
店舗コード | メニューコード | メニュー名
101 | 001 | メニューB
というものです。
副問い合わせで
SELECT MIN(MENU.副番) FROM MENU
WHERE MENU.適用開始日 <= T_MENU.適用開始日
AND MENU.適用終了日 >= T_MENU.適用開始日
GROUP BY MENU.メニューコード
みたいなことをしたいのですが、うまくいきません。
どうぞ皆さんのお知恵をお貸しください。
0164NAME IS NULL
2007/12/10(月) 15:50:02ID:???レス付かないようなので。
とりあえずmysqlだとたぶんこんな感じ。
select 店舗Code, メニューコード,
(select メニュー名 FROM MENU
WHERE MENU.適用開始日 <= T_MENU.適用開始日
AND MENU.適用終了日 >= T_MENU.適用開始日 order by 副番 limit 1)
from T_MENU
Oracleだと、limitではなくRow_Number()とか使うことになるんかな。
0165NAME IS NULL
2007/12/10(月) 23:49:34ID:???SELECT T_menu.店舗コード,メニューコード,
(SELECT メニュー名 FROM Menu WHERE (メニューコード,副番)=(SELECT min(メニューコード)AS メニューコード,min(副番) AS 副番 FROM Menu WHERE メニューコード=T_menu.メニューコード AND T_menu.適用開始日 BETWEEN 適用開始日 AND 適用終了日))
FROM T_menu;
0166NAME IS NULL
2007/12/12(水) 16:21:41ID:???Select文の中にバインド変数を使用したのですが
SELECT 得意先名 FROM 得意先マスタ WHERE 得意先コード =: 得意先
を実行すると
':' 付近に不適切な構文があります
とエラーが出ます。
=: のやり方はoracleだけなのでしょうか?
0167NAME IS NULL
2007/12/12(水) 17:24:45ID:???MSSQLでは、変数のプレフィクスは「@」じゃないっけ?
ちなみにOracleでも、「=:」が演算子なわけではなく、
「:」が変数のプレフィクスなだけだよね。
その質問の仕方だと、代入演算をしたがってるように誤解される(てか俺もした)。
0168166
2007/12/12(水) 18:22:37ID:???トンクス!
「@」でした!
ちなみに、CSEでやろうとすると
スカラ変数 "@得意先" を宣言してください。
と出るのですが、どうしたらよいですか?
今までずっとOracleの現場でosqleditを使っていましたが
今回、初めてSQLServerなので、最初で苦労してます。。。
0169NAME IS NULL
2007/12/12(水) 20:39:36ID:???CSE ってのが何のことやらわからんけど、
パラメータについて調べるとよいかもしれん。
で、このスレは SQL についてのスレで、
SQL Server についてのスレではない。
専用スレに Go!
0170168
2007/12/12(水) 20:51:21ID:???CSEってこれです
http://www.hi-ho.ne.jp/tsumiki/image_odbc.html
http://www.hi-ho.ne.jp/tsumiki
一応SQL(ツール)の質問だけとちと違いましたかな。。。
0171NAME IS NULL
2007/12/12(水) 21:09:11ID:???はい。違います。
0172NAME IS NULL
2007/12/13(木) 00:27:39ID:???SQL Serverなら、クエリアナライザという優秀な標準GUIツールがあるというのに・・・
MSDEならその限りではないが。
0173NAME IS NULL
2007/12/13(木) 01:07:51ID:???テーブルの上からn行目を指定、したりできますか?
0174NAME IS NULL
2007/12/13(木) 11:33:43ID:???データの取り出し順はソートしない限り保証されないので
「テーブルの上からn行目」ってのはできない。
ソートした結果からn番目ってのはいくらでもやりようがある。
0175NAME IS NULL
2007/12/14(金) 01:31:20ID:nj9wJu5DSHOW TABLES FROM db_name;
となり、更にテーブル名が「dtb」から始まるものを同様に取得するには、
SHOW TABLES FROM db_name LIKE 'dtb%";
になると思いますが、
逆にテーブル名が「dtb」から始まるもの以外の一覧を取得するには
どのような SQL 表現となりますでしょうか?
間違っているとは分かっていながら、あえて書くと
SHOW TABLES FROM db_name NOT LIKE 'dtb%";
のような感じのことをしたいのです。
どなたかご教示ください。
0176NAME IS NULL
2007/12/14(金) 12:58:44ID:???SHOW TABLESってMySQLの方言じゃないのか?
0177NAME IS NULL
2007/12/14(金) 14:50:23ID:???0179NAME IS NULL
2007/12/16(日) 14:03:00ID:???to_date('20071216','YYYYMMDD') - to_number(T.STRINGDATE)
というのがあったのですが、
日付型から数値を引くとどのような演算がされるのですか?
0180NAME IS NULL
2007/12/16(日) 14:13:47ID:???日数が引かれる
0181NAME IS NULL
2007/12/16(日) 14:27:46ID:???ありがとう、ネットで暗黙の型変換に関するドキュメントがなかったので助かりました。
0182NAME IS NULL
2007/12/17(月) 20:47:44ID:???朝から調べてたけど見つけられなかった。orz
0183NAME IS NULL
2007/12/18(火) 01:02:00ID:???0184NAME IS NULL
2007/12/18(火) 09:38:36ID:???0185NAME IS NULL
2007/12/19(水) 01:05:47ID:???ID VALUE
----------
0 NULL
1 NULL
2 1
3 NULL
4 NULL
5 0
6 NULL
7 NULL
8 2
9 NULL
10 NULL
があったとして、
ID VALUE
----------
0 NULL
1 NULL
2 1
3 1
4 1
5 0
6 0
7 0
8 2
9 2
10 2
のようにNULLの箇所を直近の値で埋めるような方法はありますか?
0186NAME IS NULL
2007/12/19(水) 01:11:03ID:???件数によっては果てしなく時間がかかる
0187NAME IS NULL
2007/12/19(水) 02:00:20ID:???UPDATE Table AS T1
SET value=(SELECT value FROM Table WHERE id=(SELECT max(id) FROM Table WHERE id<T1.id AND value IS NOT NULL))
WHERE value IS NULL;
DBによってはちょっと変えないとダメかな。
0188NAME IS NULL
2007/12/20(木) 14:52:00ID:???できました。どうもありがとう。
0189NAME IS NULL
2007/12/20(木) 15:29:03ID:WQA8NgrI----------------
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というデータがあっても無視して構いません。
環境はSQLServer2005です。
よろしくお願いします。
0190NAME IS NULL
2007/12/20(木) 16:12:54ID:???SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table GROUP BY key ORDER BY key;
とかでいいのかな?
0191NAME IS NULL
2007/12/20(木) 19:14:43ID:???{1, 1, 0}
{1, 2, 0}
{1, 3, 0}
{1, 3, 0}
{1, 3, 0}
{1, 4, 0}
{1, 5, 0}
:
で、ID, SUBID でみた時に重複していればSEQに連番を振りたい(SEQの初期
値は0)んですが、これをカーソルを使わずに処理可能でしょうか?
{1, 1, 0}
{1, 2, 0}
{1, 3, 0}
{1, 3, 1}
{1, 3, 2}
{1, 4, 0}
{1, 5, 0}
:
0192NAME IS NULL
2007/12/20(木) 20:13:24ID:???RANK関数を使えば結果セットを得ることはできるから
それを一旦別テーブルに突っ込んで元テーブルと総入れ替えするとか。。。
0193NAME IS NULL
2007/12/21(金) 01:10:18ID:???そこまでするなら普通にcursor使うけど。
最初はこう考えたんですよ
update tab A
set A.seq = (select count(*) from tab B where A.id = B.id and A.subid = B.subid and B.seq = 0)
1行目から順番に処理してるとして、3行目の処理の時点で
{1, 1, 1} 1
{1, 2, 1} 2
{1, 3, 3} 3 ←今ここ
{1, 3, 0} 4
{1, 3, 0} 5
{1, 4, 0} 6
{1, 5, 0} 7
すると、4行目を処理する際にはseq=0の行は1行減ってるから
{1, 1, 1} 1
{1, 2, 1} 2
{1, 3, 3} 3
{1, 3, 2} 4 ←今ここ
{1, 3, 0} 5
{1, 4, 0} 6
{1, 5, 0} 7
まあ、やってみたらダメだったわけだがw
0194NAME IS NULL
2007/12/21(金) 01:55:49ID:???まぁ複数行のバッチ処理には違いないが。
CREATE TEMP SEQUENCE t_seq;
UPDATE Table AS T1 set c3=nextval('t_seq') WHERE 1<(SELECT count(*) FROM Table AS T0 WHERE (T0.c1,T0.c2)=(T1.c1,T1.c2));
UPDATE Table AS T1 SET c3=c3-(SELECT min(c3) FROM Table WHERE (T.c1,T.c2)=(T1.c1,T1.c2)) WHERE 1<(SELECT counT(*) FROM Table AS T0 WHERE (T0.c1,T0.c2)=(T1.c1,T1.c2));
0195NAME IS NULL
2007/12/21(金) 07:48:40ID:vB2UAvni0196NAME IS NULL
2007/12/21(金) 18:36:46ID:???数件しかなければインデックス使わない、数万件ならインデックスを使う、み
たいな。
0197NAME IS NULL
2007/12/21(金) 18:46:11ID:???オプティマイザの実装次第だろ。
オプティマイザヒント使うとか
幾らでも変えようのあるRDBMSも存在するしな。
0198NAME IS NULL
2007/12/23(日) 01:32:21ID:HZ1Naom1DBはオラクル10gです
以下のレコードが格納されていまして、
1 10 A
2 20 B
3 10 C
4 10 A
5 20 B
6 30 A
取得したいのは
1 10 A
2 20 B
6 30 C
2列目の重複を省きたいのです。重複さえ省ければどの行を取得しても
大丈夫です。(例えばAに関しては4 10 Aの行でもOK)
自己結合を使って取得することはできたのですが、
出来ればサブクエリは使いたくありません…
(実際は50万行くらいある表なのでできるだけパフォーマンスを良くしたいのです)
オラクルの関数などを使って取得できないでしょうか?
よろしくお願いします。
※自分が考えたのは以下のSQLです
select * from A a1 where 1列目=(select max(1列目) from A a2 where a1.2列目=a2.2列目)
0199NAME IS NULL
2007/12/23(日) 02:14:35ID:???0200NAME IS NULL
2007/12/23(日) 02:23:12ID:???DISTINCTは行全体が一致しないと無理っぽいです…
0201NAME IS NULL
2007/12/23(日) 02:37:26ID:???って存在しないのだが?
0202NAME IS NULL
2007/12/23(日) 02:48:43ID:???6 30 Aの間違いでした。すみません。
0203NAME IS NULL
2007/12/23(日) 03:05:09ID:???1+50万回(行数分)のseqスキャンが走ってそうだな。
で、Oracle独自の関数でいいのならOracleスレで聞いた方がいいかも。
ちなみにPostgreSQLなら DISTINCT ON を使えば1回のスキャンで済むので、
「Oracle "DISTINCT ON"」でググれば何かわかるかもしれない。
0204NAME IS NULL
2007/12/23(日) 04:11:22ID:???DISTINCT ONっていうのがあるんですか!それはかなり便利ですね。
postgreSQLはまだ一度も使ったことないですが、覚えておいていざというときに使いたいと思います!
「Oracle "DISTINCT ON"」で調べたところ、やはり自己結合を使う方法しかないっぽいです…
とりあえず自己結合をする形で進めて、パフォーマンスに影響がでるようだったら他の方法を
考えてみます。ありがとうございました!
0205NAME IS NULL
2007/12/23(日) 04:58:53ID:???PostgreSQLのDISTINCT ONは目的カラムでORDER BYして
一つ目をとったら出力して違った値が出るまでスキップ、
そして出力の繰り返し。ORDER BY 2列目,1列目 DESCをつけると
各2列目の値で1列目が最大の行をとってくれると云うことになる。
と言うことで、そんなに難しい訳でもないからPL/SQL等でで自作関数
でも作った方がいいんじゃね。
0206NAME IS NULL
2007/12/23(日) 08:45:39ID:???WHERE
0208NAME IS NULL
2007/12/23(日) 11:37:01ID:???from tbl
group by b1
じゃだめなん?
0209仕様書無しさん
2007/12/23(日) 11:40:43ID:???すまね。>>207で言ってたROWID擬似列はいらなかった。
select *
from ( select row_number()
over (partition by col3
order by col3) grp_num
,col1
,col2
,col3
from test
)
where grp_num=1
order by col1
;
結果↓
GRP_NUM COL1 COL2 COL3
---------- ---------- ---------- ----------
1 1 10 A
1 2 20 B
1 3 10 C
ずれまくりなのは勘弁。
0210NAME IS NULL
2007/12/23(日) 17:17:42ID:???123 あ
223 い
555 う
上記の状態でたとえばユーザIDを昇順で並べた時に3行目の名前を変更する方法ありますか?
UPDATE NAME set 名前='AAA' (ここの書き方がわからない)
ORDER BY ユーザID LIMIT 2,1←これで一応3行目が指定出来ると
0211NAME IS NULL
2007/12/23(日) 17:56:53ID:???where ユーザID=(select ユーザID from NAME order by ユーザID limit 2,1)
じゃダメなん?
0212NAME IS NULL
2007/12/23(日) 23:17:35ID:???UPDATE name SET 名前='AAA' WHERE ユーザID=(SELECT ユーザID ORDER BY ユーザID LIMIT 3, 1);
これでやってみたんですが,更新されません・・・
まだ勉強不足だorz
0213NAME IS NULL
2007/12/23(日) 23:42:06ID:???select ユーザID from NAME order by ユーザID limit 3,1
で何も結果が出てこなければもちろん何も更新されない。
0214NAME IS NULL
2007/12/23(日) 23:48:34ID:???特定の1行を更新できれば良いので番号はなんでもOKです(汗
調べたらUPDATE … WHERE ユーザID IN (SELECT … LIMIT)って方式で可能みたいなんですが
INを使用するとLIMITが併用出来ないらしいです.
他の方法でなんとか任意の行を選択するのを考えます・・・
0215NAME IS NULL
2007/12/25(火) 11:34:20ID:???UPDATE Table AS T1
SET name = 'AAA'
FROM (SELECT id,(SELECT count(*) FROM Table WHERE id<T2.id) AS cnt FROM Table AS T2) AS T3
WHERE T1.id=T3.id AND cnt=2;
ユーザIDは当然ユニークで、不等号で順列通りの比較が可能という条件で、
cnt=2というのは3列目な。
でも、MySQL(かな?)で動くかどうかは知らん。
0216NAME IS NULL
2007/12/25(火) 17:25:26ID:8tRohosM0217NAME IS NULL
2007/12/26(水) 06:12:18ID:???・テーブルデータ comment テーブル
post_id, comment
1, テストコメント
2, コメント
・欲しい結果
該当結果がなくても、post_id, nullの形で3を含めた結果が欲しい
・実行しているSQL分
SELECT
post_id, COUNT(*) AS count
FROM
comment
WHERE
post_id IN (1,2,3)
GROUP BY
post_id
現状、post_id 1,2の結果しか出ない
post_id 3も0または、nullの形で出したい。
0218NAME IS NULL
2007/12/26(水) 06:35:38ID:???ないものを出せと言われてもな・・・
コメントテーブルに 3, NULL のレコードを入れとくか、
必要な post_id を列挙した別テーブルを用意しといて OUTER JOIN するか
じゃない?
0219NAME IS NULL
2007/12/26(水) 11:27:42ID:???Aの内容をBにコピーしたいのですが、AのSEQ順を崩さず、かつBにコピーする
際のB.SEQはSEQオブジェクトを使いたいのです
INSERT INTO TBL_B
SELECT
SEQ.NEXTVAL,
〜
FROM
TBL_A
ORDER BY
TBL_A.SEQ
これでTBL_Bの順序は必ず保証されるのでしょうか?
カーソルで回して1行ずつinsertしないとだめでしょうか?
0220NAME IS NULL
2007/12/27(木) 17:47:28ID:EI8HSTceSELECT * FROM t1
LEFT JOIN t2 ON t1.id=t2.t1_id
WHERE t1.id=1
といった結合の場合、t1.id=t2.t1_id の条件に合致するレコードが、t2テーブルに複数ある場合、
結果セットとして、複数レコード(t1のデータは同一)が返ってきますが、
1件しか返ってきてほしくない場合は
GROUP BY t1.id
とするのが、普通の方法でしょうか?
他に、もっと適切な方法はあるのでしょうか?
0221NAME IS NULL
2007/12/27(木) 19:45:38ID:???t2テーブルのどの1レコードを選ぶの?
t1.id, t2.id, t2.id2, t2.data
1, 1, 1, あああ
1, 1, 2, いいい
2, 2, 1, ううう
3, null, null, null
ここからどんな結果を出したいの?
0222NAME IS NULL
2007/12/27(木) 22:33:07ID:???1件だけにしたい場合はどういう条件で1件に絞るのかを記述するのが普通です。
よく使うのはmaxとかminとかです。
この場合は必然的にgroup byも使うことになります。
0223NAME IS NULL
2007/12/27(木) 23:56:04ID:???0224220
2007/12/28(金) 10:22:49ID:p8DR0nlD今回の場合、
関連するt2のデータが1件以上存在することさえ確かめられればいいので、
t2のデータについては、どれが取れてきても構いません。
(t2のデータ自体は使わない)
t1とt2の関係は1対多です。
とすると、やっぱりGROUP BYのみでOKですかね?
0225NAME IS NULL
2007/12/28(金) 10:48:27ID:???0226NAME IS NULL
2007/12/28(金) 12:21:56ID:???number INTEGER -- 登録番号
PRIMARY KEY
,dataA DECIMAL(13,6) -- aの値
NOT NULL
,datab DECIMAL(13,6) -- bの値
NOT NULL
,dataC DECIMAL(13,6) -- cの値
NOT NULL
,name TEXT -- 名前
NOT NULL
,today TEXT -- 日付
NOT NULL
);
というテーブルが有ります。
例えばこの中には、
1, 100, 500, 400, マサル, 12/23
2, 200, 400, 300, メソ, 12/24
3, 300, 430, 200, フーミン, 12/25
4, 200, 300, 600, マサル, 12/26
5, 500, 250, 400, モエモエ 12/27
のようなデータが入っています。
そして、
SELECT * FROM foo WHERE dataA > 90 AND dataA < 210
というクエリーを発行しています。
しかしこの方法だと、
1, 100, 500, 400, マサル, 12/23
2, 200, 400, 300, メソ, 12/24
4, 200, 300, 600, マサル, 12/26
とマサルが二回出てきてしまいます。
データベースの設計が悪いと思うんですが、
どのように正規化すれば、宜しいでしょうか?
また、
6, 150, 500, 400, マサル, 12/28
のような感じでnumber,dataA,dataB,dataC,todayは違うけれどnameが同じ場合、
うまくnameの重複を無くして、INSERT出来るようにしたいです。
0227221
2007/12/28(金) 12:34:26ID:???t2に該当レコードがなくてもt1のレコードは返してほしいんだよね。
select distinct t1.id from t1, t2
where t1.id = t2
これだとt2に該当するレコードが無いとt1も出ないからダメなんだよね。
SQL> select * from t1;
ID
----------
1
2
3
SQL> select * from t2;
ID ID2 DATA
---------- ---------- --------------------
1 1 a
1 2 b
2 1 c
SQL> r
1 select t1.id, nvl(tmp.flag, 'NO HIT')
2 from t1
3 left outer join
4 (
5 select distinct t1.id, 'HIT' flag from t1, t2
6 where t1.id = t2.id
7 ) tmp
8 on t1.id = tmp.id
9* order by 1, 2
ID NVL(TM
---------- ------
1 HIT
2 HIT
3 NO HIT
これでよい?
nvlはOracleの独自ファンクションだから適当に改造してくれ。
0228226
2007/12/28(金) 13:33:19ID:???0229NAME IS NULL
2007/12/28(金) 13:37:33ID:???きちんと要件定義するのが先。
0230NAME IS NULL
2007/12/28(金) 13:39:46ID:???俺もわからん。
0231NAME IS NULL
2007/12/28(金) 13:47:30ID:???どっちのマサルが欲しいのかが不明。
0232220
2007/12/28(金) 14:23:58ID:p8DR0nlDあ、そうか。
こういう場合はGROUP BYじゃなくて、
DISTINCTの方が正しいですね。
(結果は変わらないようですが)
>>227
> t2に該当レコードがなくてもt1のレコードは返してほしいんだよね。
その通りです。
確かに、書いていただいたSQL文だと、やりたい意図がかなり明確ですね。
(でもちょっと重そうなSQL文)
うーむ。どうしようかな。
>>226
エスパー向け問題ですね。
正規化の話としては、userテーブルなどを作って、
名前はそっちに持たせて、
fooテーブルにはそのidだけ入れとくってのが正解だと思います。
user (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
foo(
number INTEGER PRIMARY KEY
,dataA DECIMAL(13,6) NOT NULL
,datab DECIMAL(13,6) NOT NULL
,dataC DECIMAL(13,6) NOT NULL
,user_id INTEGER NOT NULL
,today TEXT NOT NULL
);
0233220
2007/12/28(金) 15:08:57ID:p8DR0nlDすみません。急いで訂正。
いまのところ、GROUP BYで意図していた結果が得られていたので、
そのままにしていたのですが、実際に書いていたSQL文が、
文法的に間違いだということが分かりました。
t1 (
id INTEGER PRIMARY KEY,
name TEXT,
description TEXT
)
t2 (
id INTEGER PRIMARY KEY,
t1_id INTEGER,
data TEXT
)
SELECT t1.id, t1.name, t1.description, t2.id
FROM t1 LEFT JOIN t2 ON t1.id=t2.t1_id
GROUP BY t1.id
というクエリを投げて、
t2.idがNULLかどうかを見てt1の特定レコードに関連する
t2テーブルのレコードがあるか?を見ていました。
意図通りの結果を得られていたわけです(SQLite3)。
でも、SQLの文法としては間違いのようです。
間違い1:GROUP BYは集合関数なんだからDISTINCT使えよ
間違い2:GROUP BYには取得するカラム全部指定しなきゃダメ
というわけで、正しくは>>227以外にないということですかね?
0234227
2007/12/28(金) 19:51:20ID:???たしかMySQLもGROUP BYの指定漏れは動く仕様だったと思う。
SQL標準からすると誤りなのは確か。
もちろんOracleではエラー。
なんか227は冗長な気がしてきた。
SQL> select * from t1;
ID NAME DESCRIPTIO
---------- ---------- ----------
1 tanaka manager
2 takahashi sales
3 satou developer
SQL> select * from t2;
ID T1_ID DATA
---------- ---------- ----------
1 1 computer
2 1 foma
3 2 wimax
SQL> r
1 select distinct t1.id,
2 t1.name,
3 t1.description,
4 nvl(t2.t1_id, -999) flag
5 from t1 left outer join t2
6 on t1.id = t2.t1_id
7* order by t1.id
ID NAME DESCRIPTIO FLAG
---------- ---------- ---------- ----------
1 tanaka manager 1
2 takahashi sales 2
3 satou developer -999
これでどうか
0235NAME IS NULL
2007/12/28(金) 21:51:43ID:???そこまでわかってたら、これでいいんじゃ?
select t1.id, t1.name, count(t2.id)
from t1
left outer join t2 on t2.id = t1.id
group by t1.id, t1.name
0236NAME IS NULL
2007/12/28(金) 22:15:29ID:???株価の週足を作ろうとする場合、
kabukaテーブルが
stockcode 銘柄コード
vol_date 出来高年月日
startingprice 始値
highprice 高値
lowprice 安値
closingprice 終値
volume 出来高
とあったとして
select max(highprice),min(lowprice),
sum(volume) from kabuka
where stockcode=〜
and vol_date between yyyy-mm-dd1 and yyyy-mm-dd2
で週間高値・安値・出来高は得られますけど、yyyy-mm-dd1
とyyyy-mm-dd2は予め判っているとして、週初始値、週末終値
をこのsqlのなかで求める事って出来ますか?
0237NAME IS NULL
2007/12/29(土) 00:52:30ID:???スカラー副問合せを書けばできると思うけど。
それかselect句の中でcase文を使ってごにょごにょやるとか。
0238NAME IS NULL
2007/12/29(土) 14:39:28ID:???名前 都道府県 年齢
AAA 東京 32
BBB 東京 31
BBB 千葉 30
BBB 千葉 29
CCC 千葉 28
CCC null 27
名前と都道府県の両者が一致しているものを1件と数える場合、
3,4行目は同じなので、5を得たいです。
DBはDerbyで、
select count(distinct 名前, 都道府県) …
select count(名前) from (select 名前, 都道府県 from テーブル group by 名前, 都道府県)
はどちらも使えないみたいです…。
select count(distinct 名前)ならできるのに><
0239NAME IS NULL
2007/12/29(土) 14:59:01ID:???0240NAME IS NULL
2007/12/29(土) 17:51:32ID:???select count(distinct 名前||都道府県)
0241NAME IS NULL
2007/12/29(土) 21:15:50ID:???__________
id,name
_________
123,aa
456,bb
789,cc
234,dd
____________
という表にSELECT * FROM tbl WHERE id=456でid直打ちした場合、
前後の行の有無を調べる方法を教えてください(idは不連続です)
0242NAME IS NULL
2007/12/29(土) 21:50:38ID:???0243NAME IS NULL
2007/12/29(土) 23:09:04ID:???>>238をよく読め
0244239
2007/12/29(土) 23:53:36ID:???> 名前と都道府県の両者が一致しているものを1件と数える場合、
> 3,4行目は同じなので、5を得たいです。
で、>>239だと思ったんだが、あぁ、1行目の意味はさっぱりだし、
Derbyもしらんので、>>239で違うのなら俺にはさっぱりわからんわ。
0245NAME IS NULL
2007/12/30(日) 05:57:29ID:???>>238の下から3行目。すでにダメだと書いてあるだろ。
0246NAME IS NULL
2007/12/30(日) 17:15:18ID:???直後は
SELECT min(id) FROM tbl WHERE id>456
直前は
SELECT max(id) FROM tbl WHERE id<456
で返り血の有無を判断すればいいんじゃね?
0247NAME IS NULL
2007/12/31(月) 11:36:08ID:???頭いいなオマエ
0248NAME IS NULL
2007/12/31(月) 13:15:27ID:+l9W5+We年内のデータから、年初めと年終わりのデータを欲しいと思っています。
つまり
select * from hoge where hiduke >= '2007/1/1'
その中から hiduke = min( hiduke ) とmax(hiduke) したいのですが
どうすればいいのでしょう?
0249NAME IS NULL
2007/12/31(月) 15:34:47ID:???where hiduke =
(select min(hiduke) from hoge where hiduke >= '2007-01-01' and hiduke < '2008-01-01')
union
select * from hoge
where hiduke =
(select max(hiduke) from hoge where hiduke >= '2007-01-01' and hiduke < '2008-01-01');
0250NAME IS NULL
2007/12/31(月) 15:35:02ID:5qw/Iwgf0251NAME IS NULL
2007/12/31(月) 17:44:17ID:???0252NAME IS NULL
2007/12/31(月) 19:55:12ID:???whereのandだと、なぜか引っかかるの0件。
たぶん、min(hiduke)で、はるか昔のとandになってるような。
>>249
サンクスです。
0253NAME IS NULL
2007/12/31(月) 21:18:19ID:???OR でいいのでは
0254NAME IS NULL
2008/01/01(火) 00:33:10ID:Q6OJPCZ+ところで1つの行から複数の行を返すSELECT文ってどう書くですか?
たとえばテーブルが
----+--
HOGE 3
のときに
----+--
HOGE 1
HOGE 2
HOGE 3
みたいな結果せっとが欲しいんですけど…
教えて!エロいひと!
0255254
2008/01/01(火) 01:30:53ID:???こんなダミーテーブル(FOO)を作る
REF
---
1
2
3
4
5
…
MAX(BAR.NUM)
んで抽出対象のテーブルBARに対して
NAME NUM
-----+---
HOGE 3
SELECT NAME,REF
FROM FOO,BAR
WHERE NUM >= REF
でいいのかな?
あんましCROSS JOHN使ったことないしなぁ…
(自宅には携帯しかないので判りにくくてすみません)
0256NAME IS NULL
2008/01/02(水) 05:19:27ID:8Xd67UwAmysql ver5
・テーブルデータ
aaa,bbb
-------
1,111
2,121
3,111
4,111
5,143
・欲しい結果
aaa,bbb
-------
2,121
4,111
5,143
・説明
2番目のカラムでかぶってるのがあったら
一番下から持ってくる方法をお願いします。
0257NAME IS NULL
2008/01/02(水) 05:51:31ID:???+------+------+
| aaa | bbb |
+------+------+
| 2 | 121 |
| 4 | 111 |
| 5 | 143 |
+------+------+
3 rows in set (0.00 sec)
0258NAME IS NULL
2008/01/02(水) 06:04:25ID:8Xd67UwAすばやい回答ありがとうございます。
0259NAME IS NULL
2008/01/02(水) 23:09:25ID:UHDITXaqmysql 5
・テーブルデータ
+------+------+
| id | bunrui-A | bunrui-B | bunrui-C.......................................
+------+------+
| 2 | aa | null | bb
| 4 | null | cc | dd
| 5 | ee | null | null
+------+------+
・欲しい結果
+------+------+
| id | youso1 | bunrui1 | youso2 | bunrui2.......
+------+------+
| 2 | aa | bunrui-A | bb | bunrui-C
| 4 | cc | bunrui-B | dd | bunrui-C
| 5 | ee | bunrui-A | null | null
+------+------+
・説明
類語データベースを作っています。
一つのレコードには同意語が品詞別にカラムに納められています。
新しい品詞が出る度に新しいカラムを足していき、品詞分類カラムが20を超えてしまいました。
一つのレコードあたり最大でも五種類の品詞の単語しか持たないため
一つのレコードで15以上のカラムがnullとなっています。
そのため、意味1、品詞1、意味2、品詞2、、、、という形にテーブルを整理し直したいのですが...
caseで場合分けしてnullで無い場合はinsertみたいにしようと思ったのですがうまくいきません...
教えて!エロイ人!
0260NAME IS NULL
2008/01/03(木) 07:53:56ID:???違いがないんだったら、その「欲しい結果」を第一正規形にしろ。
0261NAME IS NULL
2008/01/03(木) 16:37:08ID:qHl7adYmググってきました。第一正規形 = 繰り返しグループの排除でOK?
説明が足りなかったのですが、今のテーブルは
+------+------+
| id | 意味分類id | | 意味 | 一般語 | 敬語 | 文語.......
+------+------+
| 2 | 1 | 食べる| 食べる、食う、 | 召し上がる | ヌル
| 4 | 2 | 考える |考える |ヌル |思考する
| 5 | 2 | よく考える |よく考える、深く考える| ヌル|熟考する
+------+------+
+------+------+
| id |意味分類
| 1 | 食に関する言葉
| 2 | 考えることに関する言葉
+------+------+
一般語、敬語、等の語の分類カラムは外国語です。
実は、259で言った品詞分類とは語の分類のことで、文語、敬語、ことわざ、重語、王語....etcみたいな感じです。
正規化するとこんな感じですか↓?
意味分類テーブル→そのまま
意味テーブル
+------+------+
| id | 意味分類id |意味 |
+------+------+
| 1 | 1 | 食べる |
| 2 | 2 l 考える |
| 3 | 2 | よく考える |
+------+------+
単語テーブル
+------+------+
| id | 意味ID | 単語 | 語の分類|
+------+------+
| 1 | 1 | 食べる、食う | 一般語
| 2 | 1 | 召し上がる | 敬語
| 3 | 2 | 考える | 一般語
| 4 | 2 | 思考する |文語
+------+------+
0262NAME IS NULL
2008/01/03(木) 19:53:28ID:???> 品詞分類カラムが20を超えてしまいました。
だったら品詞分類テーブルも作っといたほうが。
+--+----------
|id|品詞分類名
+--+----------
| 1|一般語
| 2|敬語
| 3|文語
+--+-----------
単語テーブルに「食べる、食う」とあるのは
正規化できてないだろう。
+--+------+----------+------------
|id|意味ID|品詞分類ID|単語
+--+------+----------+------------
| 1| 1| 1|食べる
| 2| 1| 1|食う
| 3| 1| 2|召し上がる
| 4| 2| 1|考える
| 5| 2| 3|思考する
+--+------+----------+------------
こうじゃね?
0263NAME IS NULL
2008/01/05(土) 02:10:08ID:YdrW63jXそれぞれの所属に対して同じ名前の人はいないとします。
ID 所属 名前
--------------------
01 社員 菊池
02 社外 矢薙
03 社外 小暮
04 社員 田中
05 社外 田中
06 社員 矢野
社員の菊池さんと矢野さん、社外協力者の田中さんの3人を取得したい場合、条件式を
(所属=社員 AND 名前=菊池) OR (所属=社員 AND 名前=矢野) OR (所属=社外 AND 名前=田中)
にしなければならないと思いますが、これを IN のようにスマートに記述する方法はありませんでしょうか?
文字列合成して IN ……というのも考えましたが、速度的にマズそうですし。
ちなみにMySQL 3.23です。
0264NAME IS NULL
2008/01/05(土) 06:23:14ID:???(所属, 名前) in (('社員', '菊地), ('社外', '田中'), ...)
と書けることになっている。
MySQLで書けるかどうかはシラネ。
0265NAME IS NULL
2008/01/05(土) 15:40:34ID:nKj5MD+j> (所属, 名前) in (('社員', '菊地), ('社外', '田中'), ...)
>と書けることになっている。
MSSQL鯖使いの俺。
知らなかった!画期的だ!と思って試してみたが......
出来なかった.....orz
>文字列合成して IN ……というのも考えましたが、速度的にマズそうですし。
レコード数と抽出対象数でも変わると思うが、orでだらだら記述するより早いと思うよ。
あとはインデックスとか設計の問題だろ。
0266NAME IS NULL
2008/01/05(土) 15:43:01ID:???Oracle以外で使えるのを見たことがなかったので、
Oracleの拡張だと思ってた。
0267263
2008/01/05(土) 16:14:03ID:???>264
残念ながら、ウチの環境でも出来ませんでした……。
すげー便利そうなのに。
>265
ORってそんなに速くなかったんですね。
パターンとindexを変えつつ実測してみます。
0268NAME IS NULL
2008/01/05(土) 16:33:16ID:???文字列連結して...なんてtrickyな方法は初心者のうちはやらんほうが良い。
どっちにしろ、大してメリットはない。
0269NAME IS NULL
2008/01/05(土) 16:45:57ID:nKj5MD+j3レコード抽出
200万件のテーブルだと
文字連結 3秒
or 1秒以下
1万件のテーブルだと、どちらも1秒以下
実行プランを見ると、1万件だと同じ、200万件のorだと内部で最適化している。
俺は、レスポンスが同じなら文字連結には可読性が高いというメリットがあると思う。
0270264
2008/01/05(土) 18:18:36ID:???SQL92のBNF見てみたら
(所属, 名前) in (values ('社員', '菊地'), ('社外', '田中'), ...)
が正しいっぽい。
ちなみにこっちはUDBで動いた。
>>264のはOracleのみかな?(Oracleではvaluesつきは動かなかった。)
0271NAME IS NULL
2008/01/05(土) 19:10:08ID:???どうしても速度的にダメだったら考える方向でやってみます。
>269
僕も試してみましたが、インデックスの関係もあって速度差が大きかったです。
MySQLって関数インデックス無かったですよね……。
検索用のフィールドを作るという手段も検討してみます。
>270
どっちもダメでした orz
0272NAME IS NULL
2008/01/05(土) 20:43:19ID:Ible2iRH0273NAME IS NULL
2008/01/08(火) 22:28:00ID:???-------------------------------------
A 1 あいうえお
A 2 あいうえお
A 3 あいうえお
B 1 かきくけこ
B 2 かきくけこ
C 1 さしすせそ
D 1 たちつてと
となっている場合で表示を
タイトル アーティスト
---------------------
A あいうえお
B かきくけこ
C さしすせそ
D たちつてと
のように、どんな場合でも必ず一つ表示するようにしたいのですができません。
どうすればいいでしょうか?
0274NAME IS NULL
2008/01/08(火) 22:33:54ID:???0275NAME IS NULL
2008/01/08(火) 22:44:36ID:???こんな簡単な方法があったんですね、知りませんでした。。
ありがとうございました。
0276NAME IS NULL
2008/01/09(水) 11:46:51ID:0hzAlDFs2つのテーブルを結合した結果以外のデータを抽出する方法はありますか?
具体的には、
SELECT TABLE1.data_id,TABLE1.data
FROM TABLE1,TABLE2
WHERE TABLE1.data_id=TABLE2.data_id;
によって求められたTABLE1の結果以外のデータが欲しいのですが。
例えば、
TABLE1
data_id data
-----------
1 a
2 b
3 c
4 d
5 e
TABLE2
data_id
-------
1
3
5
のとき、結果として
TABLE1
data_id data
------------
2 b
4 d
を取得したいという意味です。
WHERE NOT でいいかと思ったら全然違いました。
0277NAME IS NULL
2008/01/09(水) 12:30:28ID:???2 from table1 left outer join table2
3 on table1.data_id = table2.data_id
4 where table2.data_id is null;
DATA_ID DATA
---------- ----------
2 b
4 d
SQL> select table1.data_id, table1.data
2 from table1
3 minus
4 select table1.data_id, table1.data
5 from table1, table2
6 where table1.data_id = table2.data_id;
DATA_ID DATA
---------- ----------
2 b
4 d
SQL> select table1.data_id, table1.data
2 from table1
3 where not exists
4 (
5 select 1
6 from table2
7 where table1.data_id = table2.data_id
8 );
DATA_ID DATA
---------- ----------
2 b
4 d
好きなの選べ
0278NAME IS NULL
2008/01/09(水) 12:37:46ID:???なるほど、left outer join を使うのですね。良く分かりました。
ありがとうございました。
0279NAME IS NULL
2008/01/10(木) 01:45:34ID:???INSERT INTO tbname value(NOW()-090000);
としてもデフォルトの0000-00-00 00:00:00となってしまいます。
SELECT NOW()-090000;
だと正しく表示されるのですが、何がいけないのでしょうか?
0280279
2008/01/10(木) 02:10:39ID:???MySQLスレに行ってきます。スレ汚しすみません。
0281NAME IS NULL
2008/01/10(木) 19:14:10ID:WGaCv2Wlexplainオプションで検索対象となっているテーブルを見てみるとちゃんとその条件に合ったテーブルのみを検索していました
なぜ処理時間が短くなっていないんでしょうか・・・
0282NAME IS NULL
2008/01/10(木) 23:46:23ID:???いうことはexplainで確認しているんだな?
だとすれば、その検索条件での「条件に合ってないテーブル」の検索
時間がほぼ0だったということだろうな。
パーティションキーと同じインデックスが設定されていたりしたら、そういう
こともあるだろうね。
つかスレ違い。
0283NAME IS NULL
2008/01/11(金) 03:22:11ID:8tmgKopy・Oracle10g
・テーブル
グループ 番号
-------------
A 2
B 1
B 2
A 1
C 1
C 2
・得たい結果
例)ログインユーザーのグループが、Aのとき
グループ 番号
-------------
A 1
A 2
B 1
B 2
C 1
C 2
例)ログインユーザーのグループが、Bのとき
グループ 番号
-------------
B 1
B 2
A 1
A 2
C 1
C 2
・説明
指定したグループをかならず一番上にまとめて表示させたい。
このグループ内の順番は番号順に並べる。
WHEREで指定すると指定されたグループしか表示されないが、
指定していなかったグループも指定したグループが終わった後に
表示させたい。
指定していないグループ内の順番は番号順でもそうでなくてもよい。
これをSELECT文一回で表示させたい。
よろしくお願いします。
0284NAME IS NULL
2008/01/11(金) 05:07:45ID:???> 例)ログインユーザーのグループが、Aのとき
SELECT * FROM Table ORDER BY CASE WHEN グループ = 'A' THEN '' ELSE グループ END,番号;
> 例)ログインユーザーのグループが、Bのとき
SELECT * FROM Table ORDER BY CASE WHEN グループ = 'B' THEN '' ELSE グループ END,番号;
該当グループなら空白('')に置き換えている。ORDER BY で空白が先頭に来ないなら他の文字とかに置き換えてみて。
グループがA-Zならスペース(' ')でもいいかな。
0285NAME IS NULL
2008/01/11(金) 09:18:24ID:n21xRFqNスレ汚しすみませんでした・・・
0286NAME IS NULL
2008/01/11(金) 15:05:39ID:???できた!すげえ
283じゃないが
ORDER BYにCASE文書けるの知って
感心したのでカキコ
0287NAME IS NULL
2008/01/14(月) 19:38:59ID:nql/697bSQLServer7
テーブルデータ
テーブルX
ID1 ID2 商品名
---------------------------------
001 111 あああ
001 222 いいい
002 111 ううう
002 222 えええ
テーブルY
ID 商品説明
--------------------------------------
001000111 aaa
001000222 bbb
002000111 ddd
002000222 ccc
説明
テーブルYのID列の値は「ID1列の値 + '000' + ID2列の値」になっています。
上記2つのテーブルを結合し、商品名と商品説明を1つのSQL文で取得することは可能でしょうか?
お分かりになる方がおられましたら、ご教授宜しくお願い致します。
0288NAME IS NULL
2008/01/15(火) 01:31:26ID:???X.商品名,
Y.商品説明
FROM
X INNER JOIN Y ON
X.ID1 + '000' + X.ID2 = Y.ID
SELECT
X.商品名,
Y.商品名
FROM
X, Y
WHERE
X.ID1 = LEFT(Y.ID 3)
AND X.ID2 = RIGHT(Y.ID, 3)
SQLServer7は触ったこと無いから、動作確認は取ってないが。
0289NAME IS NULL
2008/01/15(火) 03:33:19ID:hl8ko7ED条件によって範囲が異なる集計値を得たい場合のテーブル・クエリ設計をご指導ください。
たとえば以下のようなものです。
Table A
CondA CondB CondC Value
------------------------
. 1A 1B 1C 100
. 1A 1B 2C 200
. 1A 2B 3C 300
. 1A 2B 2C 400
というツリー状(?)のテーブルAに対して
Table B
ID CondLevel CondA CondB CondC
----------------------------
. 1 1 1A
. 2 2 1A 1B
. 3 3 1A 2B 2C
のような条件テーブルを作り、
各レコードに対してのValue合計を出すことは可能でしょうか。
結果
ID Sum(value)
------------
1 1000
2 300
3 400
それぞれの条件を事前に決めておいて、
各条件に見合った集計を出した後にUNIONで連結するしかないのでしょうか。
これらのテーブルは仮なので変更OKです。
どうぞ、よろしくお願いします。
0290NAME IS NULL
2008/01/15(火) 04:24:54ID:???TableBの空のところはNULLだとして
accessじゃIF NOT FALSEは無理かな。
SELECT B.id,sum(A.value)
FROM TableB AS B JOIN TableA AS A
ON (A.CondA=B.CondA)IS NOT FALSE
AND (A.CondB=B.CondB)IS NOT FALSE
AND (A.CondC=B.CondC)IS NOT FALSE
GROUP BY B.id;
Cond*を連結して前方一致でおkなら
SELECT B.id,sum(A.value)
FROM TableB AS B JOIN TableA AS A
ON A.CondA||A.CondB||A.CondC LIKE B.CondA||COALESCE(B.CondB,'')||COALESCE(B.CondC,'')||'%'
GROUP BY B.id;
0291NAME IS NULL
2008/01/15(火) 16:11:40ID:VmdUH5FgTableBの空白を「*」で埋めてから
SELECT B.ID, Sum(A.value) AS [sum(value)]
FROM TableB AS B, TableA AS A
WHERE ((A.CondA Like B.CondA)
AND (A.CondB Like B.CondB)
AND (A.CondC Like B.CondC))
GROUP BY B.ID
0292NAME IS NULL
2008/01/15(火) 16:16:36ID:VmdUH5Fg入る値によっては「*で埋めないでも」こっちでも可
SELECT B.ID, Sum(A.value) AS [sum(value)]
FROM TableB AS B, TableA AS A
WHERE ((A.CondA Like (B.CondA & "*"))
AND (A.CondB Like (B.CondB & "*"))
AND (A.CondC Like (B.CondC & "*")))
GROUP BY B.ID
0293NAME IS NULL
2008/01/15(火) 18:06:21ID:Az9jU2qhSNSの友達登録のような事をやりたいのですが、テーブル設計についてお聞きします。
テーブル 友達
依頼者 受諾者 承認
--------------------------
001 002 1
001 003 NULL
002 003 1
002 004 1
というようなテーブル設計で良いのでしょうか?
一度承認されたら依頼者・受諾者関係なく双方から友達を抽出したいのと、下記のような重複をさせたくないのですが。。
依頼者 受諾者 承認
---------------------------
001 002 1
002 001 1
0294NAME IS NULL
2008/01/15(火) 22:30:46ID:???元の設計じゃあ、2行目がどっちの承認が必要なのかわからんし。
0295NAME IS NULL
2008/01/15(火) 23:30:31ID:Az9jU2qhお返事ありがとうございます。
>>293では承認は常に依頼者→受諾者という風には考えているのですが、
重複の制御や双方からの抽出を考えたら、やはり全て重複させるほうが
いいんですかね?
という事は、
ユーザー1 ユーザー2
----------------
001 002
002 001
002 001
というような承認列を無くし、重複(双方向に)した場合のみ承認というような設計にすれば良いのでしょうか?
0296NAME IS NULL
2008/01/15(火) 23:33:01ID:Az9jU2qh>>294
お返事ありがとうございます。
>>293では承認は常に依頼者→受諾者という風には考えているのですが、
重複の制御や双方からの抽出を考えたら、やはり全て重複させるほうが
いいんですかね?
という事は、
ユーザー1 ユーザー2
----------------
001 002
002 001
002 003
というような承認列を無くし、重複(双方向に)した場合のみ承認というような設計にすれば良いのでしょうか?
上の場合001と002は承認済み、002は003に依頼中。
0297NAME IS NULL
2008/01/16(水) 00:01:43ID:???最初の>>293で良くね?
お友達一覧は、
あるIDが依頼して承認された受諾者一覧
UNION
あるIDが受諾承認した依頼者一覧
で出来るし。
SQLにすると、
SELECT 受諾者 FROM Table WHERE 依頼者='あるID' AND 承認=1
UNION
SELECT 依頼者 FROM Table WHERE 受諾者='あるID' AND 承認=1;
後で、どちらが依頼したのかわかるし、依頼中や承認待ちも出せる。
0298NAME IS NULL
2008/01/16(水) 07:21:15ID:???SELECT 受諾者 FROM Table WHERE (依頼者='あるID' OR 受諾者='あるID') AND 承認=1
テーブルの大きさによっては有意な差にはならんかもしれんけど。
0299NAME IS NULL
2008/01/16(水) 15:25:11ID:nIBpbjueありがとうございます。>>293の設計でやってみようと思います。
実は現在>>296のようなテーブルでお気に入り登録のような形(承認無しの一方向登録)で運用していまして、できればデータ移行をしたいのですが、
id1 id2
----------------
001 002
002 001
003 001
↓
id1 id2 承認
-----------------------
001 002 1
003 001 NULL
というようにテーブル移行したいのですが、これはどのようにしたら良いのでしょうか?
select id1,id2 from 友達 as A where A.id1 IN (select B.id2 from 友達 as B where A.id2=B.id1); で、双方向登録分
select id1,id2 from 友達 as A where A.id1 NOT IN (select B.id2 from 友達 as B where A.id2=B.id1); で、一方向登録分
で一応重複レコードは抽出できたのですが、その重複2レコードを1レコードにする方法がわかりません。
2レコード→1レコードする場合のid1とid2の方向は気にしません。
0300298
2008/01/16(水) 19:41:06ID:???select A.id1,
A.id2,
case when B.id1 is null then null else 1 end
from 友達 A
left outer join
友達 B
on A.id2 = B.id1
and A.id1 = B.id2
where A.id1 < A.id2
or B.id1 is null
;
あと、>>298はSELECT句にCASE文を入れてごにょごにょやるとかしないと
このままじゃダメだなって今気付いた。
0301NAME IS NULL
2008/01/16(水) 20:35:21ID:nIBpbjue298さん、多謝ですm(__)m
>where A.id1 < A.id2
の部分に目から鱗でした。
0302NAME IS NULL
2008/01/17(木) 13:07:15ID:BskMVrmk埼玉 麻生●郎
東京 麻生●郎
東京 安倍●三
東京 中川酒
東京 中川酒
↓
埼玉 麻生●郎
東京 麻生●郎
東京 安倍●三
東京 中川酒
のように、都道府県と住所が全く同一のデータがあった場合、
1つのデータとしてまとめたいのですが、
SQLでこの動作をさせるには
どのようにしたらよいでしょうか?
当方Accessなので、クエリのやり方でもかまいません。
0303NAME IS NULL
2008/01/17(木) 13:14:58ID:???0305289
2008/01/17(木) 17:22:31ID:Q2ceU5zIありがとうございました。
Accessでは is not null が使えなかったので、
>>292の方法を使わせていただきます。
0306NAME IS NULL
2008/01/17(木) 18:54:15ID:???WHEREで指定した条件に当てはまらない場合に0と表示させるにはどうしたらいいでしょうか?
具体的には、
SELECT DISTINCT 名前,count(*) FROM 表名
WHERE 条件 ←この条件に当てはまらない「名前」項目が存在する
GROUP BY 名前;
としたときに、全ての「名前」を表示させ、条件に当てはまらなかった場合は0と表示したいのです。
(正確にはこの条件でビューを作成したいので、条件に当てはまらない場合は0という値を入れたい)
isnullというのが必要なのかと思い試してみましたが上手くいきません。
SQLはMySQLです。よろしくお願いします。
0307NAME IS NULL
2008/01/17(木) 21:00:31ID:???WHERE句で絞るんじゃなくて、SELECT句の中でCASE文使って絞らないと無理かと。
0308NAME IS NULL
2008/01/17(木) 21:16:32ID:???サンプルデータがあればわかりやすいのだが。
0309306
2008/01/17(木) 21:26:34ID:???まだSQLを学習したばかりなのでCASE文というのを初めて聞きました。これから調べてみます。
>>308
テーブルの内容は、スポーツの試合結果で、「試合の通し番号」「チーム名」「チームの得点」
この3つのデータが入っています。WHERE文の中では自己結合を行い、
試合結果が引き分けであったもののみを抽出し、その数をチーム名ごとにcount(*)で数えています。
(条件:通し番号が等しい、チームの得点が等しい、チーム名が同一でない)
問題は、引き分けた試合がないチームが存在していて、そのチームの名前が出力されないことです。
307さんの仰っていたCASE文でできないかどうか試してみます。
0310NAME IS NULL
2008/01/17(木) 22:17:09ID:???CASE文を使い、SUM(条件式 THEN 1 ELSE 0)としたらできました!ありがとうございました。
0311NAME IS NULL
2008/01/18(金) 03:22:37ID:???0312NAME IS NULL
2008/01/18(金) 17:47:33ID:Izw6jTBj住所録から市(町村は無視)ごとの人数をカウントしたいのですが、
どのようにしたらよいでしょう?
データは↓のように市名以降の住所が1つのカラムに入っています。
さいたま市○○1−2−3
川越市○○4−5−6
所沢市○○7-8
秩父市○○10-11-12-103
さいたま市○○14-15-206
秩父市○○1−2○○マンション
さいたま市○○○○○センター
↑のDBから↓の結果を得たい
さいたま市 3
秩父市 2
川越市 1
所沢市 1
0313NAME IS NULL
2008/01/18(金) 18:06:55ID:???まじめにやると市名データを全部もつしかないような気がするな。
適当に手抜きをする場合でも市川市と四日市市に注意。
0314NAME IS NULL
2008/01/18(金) 18:34:19ID:???0315312
2008/01/18(金) 18:44:46ID:???0316NAME IS NULL
2008/01/18(金) 19:11:12ID:???市原市と廿日市市もね。
あと、伊達市(北海道、福島県)と府中市(東京都、広島県)も
場合によっては要注意かも。
0317NAME IS NULL
2008/01/18(金) 22:29:29ID:???1行だけ更新してすぐにコミットするような処理ではデッドロックは起きないのでしょうか?
また、1行だけ削除してすぐにコミットするような処理でもデッドロックは起きないのでしょうか?
デッドロックがトラウマになって眠れません。すいませんが教えてください
0318NAME IS NULL
2008/01/18(金) 23:44:14ID:???どっちかが落ちてロールバックされる。
0319NAME IS NULL
2008/01/18(金) 23:44:32ID:???デッドロックは起きませんがロック待ちはありえます
0320NAME IS NULL
2008/01/19(土) 02:07:23ID:???�dクス
これでゆっくり眠れる
0321NAME IS NULL
2008/01/19(土) 22:44:44ID:???データベースはOracle 8 です。
SQLは以下のようになります。
SELECT A.abc,A.def,B.ghg
FROM TEST_1 A INNER JOIN TEST_2 B ON A.fff_cd = B.fff_cd
WHERE A.ccc_cd = '1' AND (A.ddd_cd = '1234' OR A.ddd_cd = '2222' OR A.ddd_cd = '3333' OR A.ddd_cd = '4321' OR A.ddd_cd = '5555' OR A.ddd_cd = '6666' OR
A.ddd_cd = '9999')
ORDER BY A.bbb,A.hhh,A.kkk
現在問題になっているのは、TEST_1がFULL SCANになっており、参照時間が遅いようなのです。
INDEXは付与していますが、参照するデータ件数が多い場合は効果がありません。
TEST_1は今後データ件数が増えるので、参照データが多い場合でも効率がよくなるようにしたいと思っています。
ddd_cdはカーディナリティが高いためビットマップ索引は不向きと思われますので、これ以外で何かいい方法は
ないものでしょうか?
0322NAME IS NULL
2008/01/19(土) 22:49:21ID:???オプティマイザヒント与えればいいと思うけど。
それが嫌ならORをやめてUNION ALLにするとか。
てかOracle 8て。。。
0323NAME IS NULL
2008/01/19(土) 23:47:10ID:???ありがとうございます。
教えていただいた方法を試してみます。
確か8だったと思うんです。
ちなみにOracle 9以降だと別の方法があったりするのでしょうか?
現在環境がない為、すぐに試してみることができないのですが、
他にも案がある方がいらっしゃれば、教えて頂けないでしょうか?
よろしくお願いします。
0324NAME IS NULL
2008/01/20(日) 08:10:21ID:???indexがあるといっても、どういうindexがあるのか書かなきゃわからんだろ。
TEST_1.ddd_cdのカーディナリティが高いのなら普通のbtree-indexが効くはずだが、
これも「高い」じゃわからん。
0325NAME IS NULL
2008/01/20(日) 16:06:59ID:TfWLYbOjありがとうございます。また説明不足ですみませんでした。
現在、SI Object Browser9を使用して作業をしており、INDEXはこれで
付与したいオブジェクトを選択し、特に何の設定もなしで作成したものです。
このINDEXがどの種類なのか今現在は分かっていない状態です。
確認不足ですみません。
これがbtree-indexではないならば、試してみようと思います。
カーディナリティについても、現状では高いことしか認識しておらず、
詳しい回答ができません。今後の為にもどのような情報があれば
よいのか教えていただければ幸いです。
0326NAME IS NULL
2008/01/20(日) 17:23:28ID:???フィールドにindexを付与したのかということ。
その情報がないのにsqlだけ見せられて、indexが使われない理由を
答えられるわけがない。
full scan になってしまうのが期待と違うということならば、どのindexが
どう使われるか期待していたはずだから、なぜそうならなかったのか
調べてみればいい。
0327NAME IS NULL
2008/01/20(日) 17:31:49ID:???てのが気になるな。
参照するデータが少ないときはINDEX使ってるってことでしょ?
同じSQLで右辺の値が変わっただけでアクセスパスが変わることはない
(ヒストグラム取ってればありえるのかな?)から、
「参照するデータ件数が多い」ってのはOR条件を足していってると思うんだ。
だとすれば>>322のようにORをやめてUNION ALLにするってのは
効果あるかもしれん。
0328NAME IS NULL
2008/01/20(日) 19:57:10ID:TfWLYbOjWHERE句にある項目(ccc_cd,ddd_cd)に付与しています。
INDEXが期待通りに使われないのは、「OR」が連なっているところにあると思われます。
「OR」の数を減らすとFULL SCANではなくなりましたので。
>>327
ありがとうございます。
UNION ALLを使用してみます。
ちなみに「OR」を使用したまま少しでも効率を上げる方法(322の方から
教えていただいた「オプティマイザヒント」を試してみる以外)はありますでしょうか?
0329NAME IS NULL
2008/01/20(日) 23:50:06ID:68hHwUdb板違いならば、誘導御願いします。
動的SQLを作成し、DBMS_SQL.executeは正常にできているようなのですが、
DBMS_SQL.fetch_rowsの際に失敗してしまいます。
どうもEXCEPTIONにも飛んでいないようで、困っております。
動的SQLのWhere句の長さも大したことありませんし、取得してくるデータもそんなに沢山ではありません。
同様の現象に悩まされた方いらっしゃいますでしょうか?
現象としては、下記URLと同様です。
http://www7.big.or.jp/~pinball/discus/oracle/68425.html
以上、お力添えのほど御願いします。
0330NAME IS NULL
2008/01/21(月) 09:50:23ID:2Jz4cX3zテーブルは次のようになっています.
hizuke(日付)は timestamp without time zone 型
ecr_no(レジ番号)は integer 型
hizuke | ecr_no
2008/01/21 00:10:10 | 1
2008/01/21 00:31:00 | 1
2008/01/21 02:05:21 | 2
2008/01/21 03:24:18 | 1
2008/01/21 03:24:57 | 2
ここから以下のような結果を得たいのですが,
このようなときどのように書くのでしょうか?
yyyy/mm/dd hh | 1 | 2
2008/01/21 0 | 2 | 0
2008/01/21 1 | 0 | 0
2008/01/21 2 | 0 | 1
2080/01/21 3 | 1 | 1
0331NAME IS NULL
2008/01/21(月) 12:48:12ID:???SELECT
to_char(hizuke,'YYYY/MM/DD HH24')AS hidukeDesyo,
sum(CASE WHEN ecr_no=1 THEN 1 ELSE 0 END)AS "1",
sum(CASE WHEN ecr_no=2 THEN 1 ELSE 0 END)AS "2"
FROM Table
GROUP BY to_char(hizuke,'YYYY/MM/DD HH24');
但し、
>> 2008/01/21 1 | 0 | 0
は出ない。標準だったかオプションだったか忘れたけど、
数列を返すテーブル関数があったと思うので、
それを利用して結合させれば出るかな。
0332NAME IS NULL
2008/01/21(月) 16:52:29ID:???データ
番号,人,日付
1,aさん,2007-1-2
2,bさん,2007-1-3
3,aさん,2007-1-5
4,bさん,2006-1-1
で人でグループ化して日付がMINのときの人、番号を取得したいのですが。
結果
aさん,1
bさん,4
初心者の質問ですいません、よろしくお願いします。
0333グループ化って
2008/01/21(月) 16:53:15ID:HFSWx6s60334NAME IS NULL
2008/01/21(月) 16:56:15ID:2Jz4cX3zありがとうございます.
これから数列を返すテーブル関数について調査します.
0335NAME IS NULL
2008/01/21(月) 18:45:49ID:???>>36
0336NAME IS NULL
2008/01/22(火) 10:27:59ID:???ありがとうございます。できました。
0337NAME IS NULL
2008/01/22(火) 15:48:05ID:???MySQL 5
■テーブルデータ
[games]
date, point, player_id
-------------------------
'2007/1/2', 10, 1
'2007/11/3', -3, 1
'2008/11/3', 4, 1
'2006/10/9', 7, 2
'2005/11/9', 15, 2
'2007/8/20', -30, 2
'2007/9/20', -9, 3
[players]
-------------------------
id, name
1, 'taro'
2, 'hanako'
3, 'edogawa'
■欲しい結果 ('2008/1/1' までの場合)
name, sum(point)
'taro', 7
'hanako', -8
'edogawa', -9
■説明
特定の日付までのプレイヤー毎のポイントの合計を名前と一緒に出したいと思っています。
単に合計であれば、group by と sum で出来るのがわかるのですが、
名前を付加したい場合にどうすれば良いかわかりませんでした。
実際のデータが多いので、SQL一発出来ない物かと思いました。
(playersが約3000、gamesが20万くらい)
よろしくお願いします。
0338NAME IS NULL
2008/01/22(火) 16:59:06ID:???SELECT name,points FROM players
LEFT OUTER JOIN (SELECT player_id,sum(point) AS points FROM games
WHERE date1 <= '2008-1-1' GROUP BY player_id ORDER BY player_id) AS x
ON x.player_id = id
こんな感じ?
0339NAME IS NULL
2008/01/22(火) 18:19:03ID:???うまいことできました。ありがとうございます。
それにしても、結構時間がかかってしまうものなんですね。
0340NAME IS NULL
2008/01/22(火) 23:51:43ID:???ふつーにJOINしてGROUP BY nameじゃだめなのか?
同じnameの別idがいるとか?
0341NAME IS NULL
2008/01/23(水) 01:04:21ID:???なるほど、アドバイスありがとうございます。
自分で "join" で色々ググって書いてみました。
select name, sum(point)
from players
left join games
on games.player_id = id
where `date` < '2007/12/31'
group by id
name は被る可能性があるのでダメなんですが↑で出来たようです。
0342NAME IS NULL
2008/01/23(水) 11:00:18ID:+ZXzx9CZあるブックマーク(記事)を基にして、同じようにタグがついた類似記事を探す場合SQLはどのように書いたら良いのでしょうか?
タグはマスタ化してます。
記事テーブル D_BOOKMARK
BM_ID
BM_TITLE
...
記事のタグテーブル D_TAG
BM_ID
TAG_ID
※複数の人が記事に同じタグを付けることもありますが問題を簡単にするために、
記事にあるタグが件数に関わらずついていたらD_TAGに1レコード入ります。
タグマスタテーブル M_TAG
TAG_ID
TAG_NAME
0343NAME IS NULL
2008/01/23(水) 19:29:22ID:???「類似」をどう定義するかによると思うけど。
例えば「BM_IDが:hogeの記事に対して、3つ以上のタグが一致する」
みたいなので良ければ
select A.BM_ID, count(*)
from D_TAG A
inner join
(select TAG_ID from D_TAG where BM_ID = :hoge) B
on A.TAG_ID = B.TAG_ID
where A.BM_ID <> :hoge
group by A.BM_ID
having count(*) >= 3
;
とか。
0344NAME IS NULL
2008/01/24(木) 17:49:38ID:5OB0Vz41ありがとう。できそうです。
0345NAME IS NULL
2008/01/24(木) 20:28:44ID:M1TBm+9M下のような記述がいっぱいあるのですがどうも理解不足で説明できません。
特にwhileの条件部分が難しいです。配列に$resultの値を入れてさらにその値を$row
に渡すのが疑問です。
$result=mysql_query("select count(input) from abc where
input='100'",$mylink);
while($row=mysql_fetch_array($result)){
$coin100=$myrow[0];
}
質問内容もあいまいになってしまいましたが、なんとなくわかるかた↑の文の解説
お願いします
0346NAME IS NULL
2008/01/24(木) 20:34:11ID:cEy3KHbK自分でわからんものを論文に書くな。
わからないなら論文各のやめれ。
0347のぞみ
2008/01/24(木) 22:46:36ID:HV897WY2SQLで、聞きたい事があります。
VBを使用してデータベースにアクセスしてデータテーブルを取得してデータグリッドに表示させるのですが、
空のデータテーブルを取得するには、どうしたら良いのでしょうか?
列名が取得できれば良いのですが・・・。
例えば、私は、方法が思いつかなかったので、
VB側
Dim strSQL As String 'SQLを入れる変数
strSQL = _
"SELECT ID, NAME FROM Syain_Masuta WHERE =" & 有り得ない値
と言うようにWHEREで有り得ない値を取得しデータグリッドに表示させているのですが、
もし、 SQLerver等でINSERT文で有り得ない値を追加されてしまうとデータグリッドに表示されてしまいます。
データグリッドには、列名(ID, NAME)だけを表示させたいのです。
長文ですみませんが、解る方がいましたらよろしくお願いします。
0348NAME IS NULL
2008/01/24(木) 23:20:14ID:???where 1<>1 でいいんじゃね?
0349のぞみ
2008/01/24(木) 23:45:00ID:HV897WY2すみません。ありがとうございます。
「WHERE1<>1」の意味って、1は1と等しくないって意味でしたよね?
仕事で、急にSQLやらされて昨日から本を買って勉強して・・・。
助かりました。
0350NAME IS NULL
2008/01/25(金) 16:26:27ID:qwwMjCS6TABLE A
id date
--------------------------
1 2007/08/05
1 2007/03/03
2 2008/01/03
1 2006/12/12
3 2007/09/05
1 2008/01/03
2 2007/10/20
これをID毎に2件となるまでdateの古い方から削除したいのですが、
SQL一文で書く方法はありますでしょうか?
0351NAME IS NULL
2008/01/25(金) 23:06:13ID:???MySQLで動くかどうか不明ですが、
DELETE FROM TableA AS T1 WHERE 2 < (SELECT count(*) FROM TableA WHERE id = T1.id AND date > T1.date);
0352NAME IS NULL
2008/01/26(土) 18:46:20ID:???300 100
300 110
300 120
300 150
300 160
350 90
350 100
350 150
350 170
400 80
400 100
400 110
とある時に会社・店で選択する時、同じ会社であれば
例えば
where
companycode= 300 and shopcode between 120 and 160
と書けますが、300の150から400の80までを選択したい時
ってどう書けば良いでしょうか?
0353NAME IS NULL
2008/01/26(土) 22:35:31ID:???とか?
0355NAME IS NULL
2008/01/26(土) 23:46:35ID:???まて、そんなんで「やっぱり」とか納得すんなw
0356NAME IS NULL
2008/01/27(日) 00:18:44ID:???(companycode = 300 and shopcode >= 150) or
(companycode = 400 and shopcode <= 80)
0357NAME IS NULL
2008/01/27(日) 00:24:05ID:???0358NAME IS NULL
2008/01/27(日) 00:27:55ID:???(companycode = 300 and shopcode >= 150) or
(companycode > 300 and companycode < 400) or
(companycode = 400 and shopcode <= 80)
0359NAME IS NULL
2008/01/27(日) 00:29:54ID:???0360352
2008/01/27(日) 08:05:22ID:???0361NAME IS NULL
2008/01/28(月) 03:01:08ID:???SHOP_id products・・・set('1','2','3','4','5','6','7','8')
----------------------------------------------------------------
1 1,2,3
2 1,2,3,4,5
3 5,6,8
4 1,2,7
5 2,4,5,6,7,8
というようなTableがあるのですが、たとえばSHOP_idが1とproductsが多く重なるものでソートして抽出したいのですが可能でしょうか?
期待する結果はSHOP_idの順番で2,4,5なのですが。
0362NAME IS NULL
2008/01/31(木) 00:38:37ID:???名前 目的
山田 エアロビ
鈴木 水泳
佐藤 水泳
テーブルB
名前 目的
佐藤 エアロビ
田中 ランニング
山本 水泳
テーブルC
名前 目的
鈴木 ランニング
田中 水泳
というテーブルがあったとして、
名前 目的
山田 エアロビ
鈴木 水泳
佐藤 水泳
田中 ランニング
山本 水泳
という結果を得たいです。名前は一意に決まってます(テーブルAとテーブルBの佐藤は同一人物)
目的がテーブルごとにかわるような感じで、名前を重複なく、目的とセットで抽出したいです。
(同一人物の目的が複数ある場合はその中のどれでもよい)
select * from テーブルA union all select ・・・
とやって、最後に group by とやろうと思ったら、* を含む場合はダメと怒られてしまいました(access です)。
調べてもわからず途方にくれてます。何かよい方法ないでしょうか?
0363NAME IS NULL
2008/01/31(木) 01:19:52ID:???GROUP BY について質問があります。
----TABLE_A----
|DataA|DataB|DataC|
------------------
| AAA | WWW |1111
| BBB | XXX |2222
| AAA | YYY |3333
| DDD | ZZZ |4444
この様なテーブルがあった場合に、DataAカラムがAAAの物を選び出し、
更にDataCの中の最大値を調べ、最大値となった行のDataBを抜き出す方法はあるのでしょうか?
自分でやってみた方法として以下の様なSQLを試してみたのですが
SELECT DataB MAX(DataC) FROM TABLE_A WHERE(DataA=AAA) GROUP BY DataA
このSQLだとDataBのカラムがMAX(DataC)と同じ行の値にはならない様です。
なにか句が足りないのでしょうか?
また、上記の抽出をDataAがAAAであるカラムに限定せずに行いたいのですが、何か良い方法はありませんでしょうか。
具体的には以下の様な抽出結果を求めています。
----結果----
|DataA|DataB|DataC|
------------------
| AAA | YYY |3333 (AAAグループの中の最大値を持つ行を抽出)
| BBB | XXX |2222 (BBBグループの中の最大値を持つ行を抽出)
| DDD | ZZZ |4444 (CCCグループの中の最大値を持つ行を抽出)
0364NAME IS NULL
2008/01/31(木) 02:55:44ID:???SELECT * FROM TableA
UNION ALL
SELECT * FROM TableB WHERE 名前 IN (SELECT 名前 FROM TableB EXCEPT SELECT 名前 FROM TableA)
UNION ALL
SELECT * FROM TableC WHERE 名前 IN (SELECT 名前 FROM TableC EXCEPT SELECT 名前 FROM TableB EXCEPT SELECT 名前 FROM TableA);
AccessでEXCEPTが使えなかったら、EXISTS述語で相関クエリに置き換える。
(SELECT 名前 FROM TableB EXCEPT SELECT 名前 FROM TableA) は
(SELECT 名前 FROM TableB WHERE NOT EXISTS (SELECT * FROM TableA WHERE TableA.名前=TableB.名前))
>>363
SELECT * FROM Table_A AS T1 WHERE dataC =(SELECT max(dataC) FROM Table_A WHERE dataA=T1.dataA);
その他いろいろ...
0365362
2008/01/31(木) 23:52:29ID:???回答ありがとうございました!
これでできたのですが、実はテーブルは時がたつに連れて増えていくため、
教えていただいた方法で実行するのは(例えば一ヶ月分)かなり厳しいです…
そもそも私が望むことをSQLを使ってやろうとしているのが間違いでしょうか?
0366NAME IS NULL
2008/02/01(金) 00:02:47ID:???0367364
2008/02/01(金) 00:04:20ID:???なにが(例えば一ヶ月分)なのかよくわからないけど、
テーブル設計が間違っているっぽい。
まぁ、"目的"が複数の場合どれでもいいということなので、
SELECT 名前,max(目的) FROM (
SELECT * FROM TableA
UNION ALL
SELECT * FROM TableB
UNION ALL
....
) AS T1
GROUP BY 名前;
でいいかな。
0368NAME IS NULL
2008/02/03(日) 02:24:36ID:JW+WwUKEWHERE table1.id = table2.id
と
SELECT * FROM table1
WHERE EXISTS (SELECT * FROM table2 WHERE table1.id = table2.id)
とでは、一般にどちらが高速になりますか?
DB は PostgreSQL 7 です。
0369NAME IS NULL
2008/02/03(日) 03:13:33ID:???pg_dumpで拾い上げたデータをpgAdminIIIでリストアさせようとしても、
毎回応答無しになって死んでしまう。
ひとつだけ処理が怪しいテーブルがあって、それが原因だと思うんだけど、
特定のテーブルだけスキップさせたりとか出来る方法があったら教えてくれー。
ファイル直で弄れよ、という突っ込みがありそうなんだが、
dumpファイル10Gもあるんだor2
0370NAME IS NULL
2008/02/03(日) 03:45:58ID:???上のSQL、distinctつけないと結果が変わってしまう。
SELECT distinct table1.* FROM table1, table2
WHERE table1.id = table2.id
下のSQLも、副問い合わせ内の選択列が無駄。
SELECT * FROM table1
WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.id = table2.id)
一般には以下の傾向がある。
・EXISTSのヒット率が低い ⇒ 内部結合の方が速い
・EXISTSのヒット率が高い ⇒ EXISTSの方が速い
大概のデータでは内部結合の方が速い。
また、Oracleの場合は
EXISTSのSQLを内部結合に書き換える
「副問い合わせのネスト解除」機能がある。
そのためどっちのSQLでも同じ性能が出る。
MySQLにはこの最適化機能はない。
PostgreSQLはしらない。
0371NAME IS NULL
2008/02/03(日) 08:28:39ID:???table2.idのインデックスがちゃんと機能してればEXISTSの方が速いだろう。
テーブルの大きさにもよるけどさ。
インデックスが効かないのならどう転んでも結合の方が速い。
>>369
スレチだな。
>>370
> 下のSQLも、副問い合わせ内の選択列が無駄。
オプティマイザ任せで、SELECT * で十分。
PostgreSQL 8.3RC2確認してみたんだけど、ほんの僅かだがSELECT * の方が速かった。
たしかOracleでもSELECT * にした方がいいって、どこかでみたなぁ。
0372NAME IS NULL
2008/02/03(日) 11:59:36ID:???グループ(VARCHAR2) 開始日(DATE) 終了日(DATE) 削除フラグ(VARCHAR2) となっている場合で、
グループごとに開始日の昇順に並べたとして、終了日を同じグループの次のレコードの開始日の前日に
更新し、削除フラグが立っているなら、終了日をnull値にする。
また同じグループに次のレコードがなくてもnull値にする
という処理をしようと思ったらどうすればいいでしょうか?頭ではわかるのですが
それをSQLで実現しようと思うとできないのです。ご教授おねがいします
0373NAME IS NULL
2008/02/03(日) 15:38:06ID:JW+WwUKEこの日時が最近の順にレコードを取得したい。
SELECT * FROM table1 ORDER BY update_date DESC;
しかし、update_date は NULL の場合もある。
NULL の場合は、ORDER BY で一番最後になるようにソートしたい。
でも上記の SQL では NULL が一番上になってなってしまう。
さて、どうしたらいいでしょうか?
0374NAME IS NULL
2008/02/03(日) 16:49:56ID:P2xtVcgZupdate_date is not null
0375NAME IS NULL
2008/02/04(月) 00:59:36ID:YaEm3x7N0376NAME IS NULL
2008/02/05(火) 20:37:19ID:z0f3Z9+p重複したデータを削除したいのですが記述の仕方がわかりません..
条件が非常に縛られているので削除方法がわからないんです...
このようなデータベース
↓
○テーブル名:main1
・カラム:id, name
○テーブル名:main2
・カラム:id, info
○テーブル名:relation
・カラム:id, main1_id, main2_id, point
以上のような3つのデータベースを作りました.
relationはmain1とmain2の関連テーブルになっています.
ここで問題が起きたのですが,relationにはmain1とmain2のidを結びつけたインスタンスが
登録されています.
なのでmain1とmain2のidの組み合わせが重複することはないのですが,なぜか
存在してしまいました.
つまり,main1とmain2のidが等しいデータが違うidで存在しています.
この重複部分を削除したいのですがわからないのでカキコしました.
消すデータは後ろのidの方のデータを消したいと思っています.
このrelationのデータ数が非常に多いので,手動では時間がかかりすぎるのでSQLで解決したいんです!
どなたか教えてくれませんか??
一度,重複しているidをすべて1度selectしてからdeleteしても全然おkです.
0377NAME IS NULL
2008/02/05(火) 20:43:37ID:???0378NAME IS NULL
2008/02/05(火) 22:58:42ID:B/kVefGRKEY = IN (no1, no2, no3・・・)など、カッコ内が可変で、
数百個、もしくは数千個ある場合、IN句を使用しデータを
一度に取得するのではなく、PRO_KEY = no1のSELECT処理を発行、
PRO_KEY = no2のSELECT処理を発行・・・し、ARRAYに検索結果を
1つずつ詰めていく方が良いのでしょうか?
くは数千個あるかもしれない場合、INとORではどちらが速いのでしょうか?
INが速い場合、1000個までという制限があるので、KEY = no1・・・を
数千回発行した方がよいのでしょうか?
0379NAME IS NULL
2008/02/05(火) 23:23:45ID:???SELECT千回 < IN ≒ OR
じゃない?
まあ一概には言えんけど。
もしかしたら一時テーブル作ってJOINしたほうが速いかもしれんし。
0380NAME IS NULL
2008/02/07(木) 15:44:49ID:???+---+---------------+----------+----+------------+
|UID |PRODUCT_NAME|UNIT_PRICE |QTY |TOTAL_PRICE|
+---+---------------+----------+----+------------+
|001 |WindowsXP | 100| 5| 500|
+---+---------------+----------+----+------------+
|002 |WindowsXP | 100| -2| -200|
+---+---------------+----------+----+------------+
|003 |WindowsVista | 150| 1| 150|
+---+---------------+----------+----+------------+
|004 |Linux | 50| 2| 100|
+---+---------------+----------+----+------------+
同じPRODUCT_NAMEのものについて、unit_priceとqtyを計算した結果を
ここではWindowsXPについて、
+---------------+----------+----+------------+
|PRODUCT_NAME |UNIT_PRICE|QTY |TOTAL_PRICE|
+---------------+----------+----+------------+
|WindowsXP | 100| 3| 300|
+---------------+----------+----+------------+
|WindowsVista | 150| 1| 150|
+---------------+----------+----+------------+
|Linux | 50| 2| 100|
+---------------+----------+----+------------+
このような表で返すには、どのようにSQLを記述すればいいでしょうか?
0381NAME IS NULL
2008/02/07(木) 16:04:26ID:???UNIT_PRICEの金額を平均、最大値、最小値などどうもとめるかを決める。
あとはGROUP BYで教科書どおり。
0382380
2008/02/07(木) 16:22:53ID:???ありがとうございます。申し訳ないことに、
見直していたら、条件に抜けがありました。。。
下記のように、同一のPRODUCT_NAMEのものについては
TOTAL_PRICE=UNIT_PRICE * QTY
の計算をしてまとめつつ、UIDはそのPRODUCT_NAMEグループ?の
中の最大値を求める、という場合にはどう考えればいいでしょう。。。
+---+---------------+----------+----+------------+
|UID |PRODUCT_NAME |UNIT_PRICE|QTY |TOTAL_PRICE|
+---+---------------+----------+----+------------+
|002 |WindowsXP | 100| 3| 300|
+---+---------------+----------+----+------------+
|003 |WindowsVista | 150| 1| 150|
+---+---------------+----------+----+------------+
|004 |Linux | 50| 2| 100|
+---+---------------+----------+----+------------+
0383380
2008/02/07(木) 17:14:21ID:???0384NAME IS NULL
2008/02/07(木) 19:52:01ID:fdkVCoKH実は私は全くわからないんです
簡単(らしい)な2つだけの問題なので、誰か教えてください…お願いします
http://www.vipper.org/vip733236.zip
0385NAME IS NULL
2008/02/07(木) 20:39:52ID:???0386NAME IS NULL
2008/02/07(木) 20:43:52ID:fdkVCoKH違うよぉ…
0387NAME IS NULL
2008/02/07(木) 20:49:36ID:???手を抜かずに文章で書け。
0388NAME IS NULL
2008/02/07(木) 20:56:52ID:fdkVCoKHエクセルのファイルをインポートする問題なので
見てもらったほうが早いと思ったんですが
私は全くの無知なので、どこまで書けば回答できるようになるのかわからないんですが…
とりあえず書いてみますね
0389NAME IS NULL
2008/02/07(木) 21:07:50ID:fdkVCoKHこれがファイル1で http://www.vipper.org/vip733287.jpg
これがファイル2ですhttp://www.vipper.org/vip733284.jpg
もらったzipに入っていたのはこれだけでした
そして問題が
�@社員の性別を調べる表示:社員番号、氏名、年齢、性別
�A「経理部」と「営業部」の社員を調べる表示:社員番号、氏名、部署名.
この2つです
0390NAME IS NULL
2008/02/07(木) 21:56:25ID:???できればお願いします…
0391NAME IS NULL
2008/02/07(木) 22:00:12ID:???0392389
2008/02/07(木) 22:12:19ID:fdkVCoKH0393NAME IS NULL
2008/02/07(木) 23:36:11ID:???ACCESSを起動して新規MDBの作成→ファイルからインポートで拡張子をEXCELにして例題のEXCELをインポート。
これで分からないならあきらめなさい
0394389
2008/02/07(木) 23:38:38ID:fdkVCoKHそれは分かってます
知りたいのは1と2の問題です
0395389
2008/02/07(木) 23:39:31ID:fdkVCoKHこれがファイル1で http://www.vipper.org/vip733287.jpg
これがファイル2ですhttp://www.vipper.org/vip733284.jpg
もらったzipに入っていたのはこれだけでした
そして問題が
問題1 社員の性別を調べる表示:社員番号、氏名、年齢、性別
問題2 「経理部」と「営業部」の社員を調べる表示:社員番号、氏名、部署名.
↑これが知りたいんです
0396389
2008/02/07(木) 23:40:57ID:fdkVCoKH自分なりに調べてインポートして セレクト〜って書くのはわかりました
でも分かったのはそれだけです
0397389
2008/02/07(木) 23:41:28ID:fdkVCoKH問題2 「経理部」と「営業部」の社員を調べる表示:社員番号、氏名、部署名.
これを出すにはどういったSQL文?を書けばいいのですか?
0398NAME IS NULL
2008/02/07(木) 23:52:08ID:???∩___∩
| ノ ヽ
/ ● ● | クマクマ
| ( _●_) ミ
彡、 |∪| 、`\
/ __ ヽノ /´> )
(___)f^f^f^f^f^f^f^f^f^┐
| |~ ~ ~ ~ ~ ~ ~ ~ ~ │
| | 知ってるが │
| / | お前の熊度が |
| / | 気にクマない |
∪ |___________|
\_)
0399ヒント
2008/02/07(木) 23:57:57ID:???| 何について調べますか?
| ┌────────────┐
| | 問題1 社員の性別を調べる表示:社員番号、氏名、年齢、性別
| | 問題2 「経理部」と「営業部」の社員を調べる表示:社員番号、氏名、部署名.
| | これを出すにはどういったSQL文?を書けばいいのですか?
| └────────────┘
| [ オプション(O) ] [ 検索(S) ]
|
`──────────┐ ┌───
, '´l, ..| ./
, -─-'- 、i_ |/
__, '´ ヽ、
',ー-- ● ヽ、
`"'ゝ、_ ',
〈`'ー;==ヽ、〈ー- 、 !
`ー´ ヽi`ヽ iノ
! /
r'´、ヽ
`´ヽノ
0400389
2008/02/08(金) 00:14:23ID:7P/NUdqGすいません…直します…
0401389
2008/02/08(金) 00:14:56ID:7P/NUdqGそんなことできたら便利すぎるwwwwwww
0402NAME IS NULL
2008/02/08(金) 09:57:13ID:???サポートセンターではない。
「安請け合いしたけどやっぱ無理だから、
おまいらオレの代わりにいつまでにやってくれ」
ってのはアホすぎw
時間的制約などがあって急ぐなら、
MSのサポートセンターなどに問い合わせるべき。
業務でMS-Access使ってるなら、当然サポートも使えるだろ。
0403NAME IS NULL
2008/02/08(金) 11:21:18ID:???それで充分片づくから。
0404NAME IS NULL
2008/02/08(金) 18:49:02ID:???|「安請け合いしたけどやっぱ無理だから、おまいらオレの代わりにいつまでにやってくれ」ってのはアホすぎw
|
|・時間的制約などがあって急ぐなら、MSのサポートセンターなどに問い合わせるべき。
||業務でMS-Access使ってるなら、当然サポートも使えるだろ。
|
`──────────┐ ┌───
, '´l, ..| ./
, -─-'- 、i_ |/
__, '´ ヽ、
',ー-- ● ヽ、
`"'ゝ、_ ',
〈`'ー;==ヽ、〈ー- 、 !
`ー´ ヽi`ヽ iノ
! /
r'´、ヽ
`´ヽノ
0405NAME IS NULL
2008/02/08(金) 20:27:34ID:9uM6oTD/#mysql 〜とか#mysqladmin 〜とかうっても全部
mysql:unknown option '--ut mailing lists for MySQL discussion.'
と返ってくる不思議な現象に出会いました。どなたかご教授お願いします。
0406NAME IS NULL
2008/02/08(金) 23:04:04ID:9uM6oTD/なぜか/etc/my.cnfのコメントの#が5行ほど抜けていました。
0407NAME IS NULL
2008/02/09(土) 00:47:33ID:xrPHvNc00408NAME IS NULL
2008/02/09(土) 16:18:16ID:aOhFc46sタイトルに「%」が含まれているレコードを検索するにはどうしたらよいでしょうか?
title like '%%%' では全件が表示されてしまいます。
ちなみにDBはPostgreSQLを使ってます。
よろしくお願いいたします。
0409NAME IS NULL
2008/02/09(土) 16:25:54ID:???escape
0410NAME IS NULL
2008/02/09(土) 16:37:54ID:aOhFc46stitle like '%\%%' ではだめでした。(結果同じ)
何でエスケープしたらよいのでしょうか。
0411NAME IS NULL
2008/02/09(土) 16:41:33ID:???PostgresはよくしらんからANSI SQLで答えるけど
LIKE '%\%%' ESCAPE '\'
0412NAME IS NULL
2008/02/09(土) 16:44:12ID:aOhFc46s回答ありがとうございます。
でも残念ながらダメでした。。。
0413NAME IS NULL
2008/02/09(土) 16:49:45ID:aOhFc46s自己解決しました。
結論としては「title like '%\\%%'」で大丈夫なようです。
参考:
ttp://ml.postgresql.jp/pipermail/pgsql-jp/2002-June/010108.html
ありがとうございました。
0414NAME IS NULL
2008/02/09(土) 16:54:22ID:???0415NAME IS NULL
2008/02/09(土) 19:18:40ID:???1年1組、2年3組といった二つの整数を一組にして、主キーとして扱いたいのですがどのように
すればよいのでしょうか?
たとえば、文字列として「1-1」「2-3」とすれば良いと思うのですが、
これではソートする際にたとえば「11-1」「2-1」というデータで整列順がおかしくなってしまいます。
これを回避するには「0000-0000」といったフォーマットでデータを格納すればよいのですが、
これでは「9999-9999」以上のものを扱うことが出来ません。
それに文字列でやるというのも気持ちが悪いです。何か良い方法は無いでしょうか?
0416415
2008/02/09(土) 19:53:06ID:???主キーって複数列に設定できるんですね。
スレ汚し失礼しました
0417NAME IS NULL
2008/02/09(土) 19:55:00ID:???学校 STRING NOT NULL,
学年 INTEGER NOT NULL,
クラス INTEGER NOT NULL,
出席番号 INTEGER NOT NULL,
名前 STRING NOT NULL,
PRIMARY KEY(学校, 学年, クラス, 出席番号) );
こゆこと?
0418NAME IS NULL
2008/02/09(土) 21:00:58ID:???0419NAME IS NULL
2008/02/09(土) 21:32:03ID:???0420NAME IS NULL
2008/02/10(日) 02:24:23ID:???ある列に、半角文字が含まれているレコードを探し当てたいのですが、
以下のSQLで大丈夫でしょうか?
------------------------------------------
--前提条件:文字コードは「JA16SJIS」
SELECT *
FROM TBL
WHERE
LENGTH(COL) <> LENGTHB(COL)/2
OR COL LIKE '%゙%'
OR COL LIKE '%゚%'
;
------------------------------------------
どうぞよろしくです。
0421NAME IS NULL
2008/02/10(日) 17:09:38ID:???0422NAME IS NULL
2008/02/10(日) 17:36:59ID:JZWkGzXi二つのテーブルがあって、構成は以下の通りなんですが、
T商品(商品ID、商品名)、T価格変動(変動ID、商品ID、価格、更新日時)
これら二つのテーブルをもとに
商品ID、商品名、各商品の最新の価格
というふうに表示したいのですが、
どのようなSQL文を書けばよいのでしょう?
AccessのDMax関数を使った方法は調べられたのですが、
SQL文だとわからないです。
よろしくお願いします
0423NAME IS NULL
2008/02/10(日) 18:13:50ID:???0424NAME IS NULL
2008/02/10(日) 20:24:56ID:???0425NAME IS NULL
2008/02/10(日) 20:28:46ID:???max(T価格変動.価格) AS 最新価格
from T商品,T価格変動
where T商品.商品ID = T価格変動.商品ID
group by T商品.商品ID,T商品.商品名
もしくは
select T商品.商品ID AS 商品ID,T商品.商品名 AS 商品名,
T価格変動.価格 AS 最新価格
from T商品,T価格変動
where T商品.商品ID = T価格変動.商品ID
and T価格変動.価格 = (select max(価格) from T価格変動)
でいけますでしょうか?
0426NAME IS NULL
2008/02/10(日) 20:31:31ID:JZWkGzXi価格の変化するタイミングはすべて違うのと、
後になって商品ごとに価格変動の履歴を見たいので、こういう
テーブル構成にしています。
質問したかったのは、たとえば
「100個ある商品群のうち、ある条件を満たす商品をセレクトして、
その商品の現時点での価格を横に表示したい」
ということです。
SELECT 商品ID,商品名,MAX(更新日時)
FROM T価格変動
WHERE 商品ID.T価格変動=商品ID.T商品
GROUP BY 商品ID.T価格変動
でいいんですかね?ぜんぜんだめ?
0427NAME IS NULL
2008/02/10(日) 20:40:14ID:JZWkGzXi書き方もテーブル名とカラム名が逆になってしまってました。
AccessのクエリとDMaxやDLookupばかり使っていて、SQL勉強はじめた
ばかりです。すみません。
0428NAME IS NULL
2008/02/10(日) 21:04:49ID:???あとグループ関数使うときはそれ以外の列を
すべてSelect句に入れないと構文エラー
SELECT 商品ID,商品名,価格
FROM T価格変動,T商品
WHERE T価格変動.商品ID=T商品.商品ID
AND ある条件?
GROUP BY 商品ID,商品名,価格
HAVING 更新日時 >= ALL(select 更新日時 from T価格変動)
じゃない?
0429NAME IS NULL
2008/02/10(日) 21:06:24ID:???× あとグループ関数使うときはそれ以外の列を
すべてSelect句に入れないと構文エラー
○ あとグループ関数使うときは、その列以外でSelect句に挙げた列は
すべてGROUP BY句に入れないと構文エラー
でした
0430NAME IS NULL
2008/02/10(日) 21:26:39ID:JZWkGzXiHAVING 更新日時>=ALL(select 更新日時 from T価格変動) の部分は
その前のGROUP BY句があるので、それぞれの商品ごとの
価格変動の中で最新の更新日時のもの、ということに
なるんですね?
0431NAME IS NULL
2008/02/10(日) 22:22:41ID:???今考えてみたら、最新の更新日時を求めるのは
HAVING句じゃなくてWHERE句でも指定可か。
ともあれ簡単なテーブルを実際に作って
10件程度のデータを入れて試してみてください。
ACCESSに入れてSQLで問い合わせするだけでもいいので。
たぶんいけるでしょう。
SELECT 商品ID,商品名,価格
FROM T価格変動,T商品
WHERE T価格変動.商品ID=T商品.商品ID
AND 更新日時 >= ALL(select 更新日時 from T価格変動)
AND ある条件?
GROUP BY 商品ID,商品名,価格
0432NAME IS NULL
2008/02/10(日) 23:37:09ID:JZWkGzXiなるほど・・・
とても参考になりました
試してみます
ありがとうございました
0433NAME IS NULL
2008/02/11(月) 02:22:38ID:SPfJ3PrH以下のように書くともちろんエラーになってしまいます。
SET @p = 10
ALTER TABLE `temp` CHANGE COLUMN `列` CONCAT("列", @p);
#列「列」を「列10」に名前変更したい
何がしたいかというと、ちょっとした個人プロジェクトの仲間向けにモジュールの開発進行表を作るためです。
テーブル「モジュール」: モジュールID, モジュール名
テーブル「仕事の種類」: 仕事の種類ID, 仕事の名前
テーブル「タスク」: タスクID, 仕事の種類ID, モジュールID, タスクの担当者
という3つのテーブルがあって、テーブル「仕事の種類」には(1, "設計")(2, "コーディング") (3, "テスト")
などが入ります。
(これらを固定にしてしまえば話は簡単なんですが、事情があって運用開始まで
この項目がどうなるのか分からないのと、運用開始後にも変更が加わる可能性があります。)
この条件下で、
モジュールID, 仕事1の担当者, 仕事2の担当者, 仕事3の担当者, …
という列の出力を得たいのです。(担当者がいない場合はそのセルにはNULLが入る)
そこでストアドプロシージャをつくり、
1、仕事の種類をすべて列挙する
2、一時テーブルを二個用意する
3、「モジュール」と仕事の種類ごとにテーブル「タスク」よりフィルタした結果を
一時テーブルに入れて次々にLEFT JOINする
というふうにしようと考えました。
が、こうすると列「タスクの担当者」がダブってうまくいきません。
これ以外に、もっと上手な方法があればアドバイスしていただけると助かります。
0434NAME IS NULL
2008/02/11(月) 02:49:34ID:eKNtLRaHそういった表の加工はアプリケーション側で制御するものだと思う。
0435NAME IS NULL
2008/02/12(火) 16:03:59ID:Yl3+Idbd+----------+------
|1981-10-10| aaa
|1979-05-09| bbb
|1992-06-02| ccc
という情報ありbirthdayの4月から9月生まれの人を
西暦に関係なく取得したい場合はどのように
すればいいのでしょうか?
DBはmysqlを使用しています
0436NAME IS NULL
2008/02/12(火) 17:17:24ID:???0437NAME IS NULL
2008/02/12(火) 17:17:27ID:IyGxDC8iこんな感じじゃない?
SELECT * FROM table
WHERE ( 4 <= MONTH(birthday) AND MONTH(birthday) <= 9 )
0438NAME IS NULL
2008/02/12(火) 17:18:26ID:IyGxDC8iありがとう。へんなことするのはやめてプログラム側で制御することにしたよ。
0439NAME IS NULL
2008/02/12(火) 18:25:39ID:Yl3+Idbdありがとうございます
教えていただいたSQLで思ったとおりのことが出来ました
0440NAME IS NULL
2008/02/12(火) 23:00:06ID:???0441NAME IS NULL
2008/02/13(水) 01:54:45ID:???0442NAME IS NULL
2008/02/13(水) 07:23:21ID:???0443NAME IS NULL
2008/02/13(水) 20:04:15ID:I4UapyfH例えばプライマリキーの設定がA,Bとなっていて、
そのうちBについてのみ抽出条件の指定が必要だった場合、
Aについてはすべてのデータが取得できるような条件の指定があった方がいいのでしょうか?
DBはDB2です。バージョンは分かりませんが、古めだと思います。
0444NAME IS NULL
2008/02/13(水) 21:43:35ID:???とりあえず、実行計画見ればいいじゃん。すぐ答えがでるよ。
0445NAME IS NULL
2008/02/13(水) 22:08:01ID:I4UapyfHやっぱり意味ないですかね?規約であるんです。
プライマリキーやインデックスキーは(例え意味がなくても)すべて順番通りに
指定しなければならないと。
実行計画ですか。勉強してみます。
0446NAME IS NULL
2008/02/13(水) 22:28:41ID:???考えてみろってことだろ。
すべてのAに合致する条件なんて、他人に聞くまでもなく意味が
ないことくらい分かれ。
0447NAME IS NULL
2008/02/13(水) 22:50:58ID:USKASoPv以下のようなテーブルがあります。
テーブル名:member_item
member_id | item_id
1 | 1
1 | 2
1 | 3
2 | 1
2 | 3
2 | 4
3 | 4
4 | 1
4 | 2
item_id 1と2を持つ人を抜き出したいです。(この場合はmember_id 1と4)
MySQL4.0.27です。 サブクエリが使えません。
よろしくお願いします。
0448NAME IS NULL
2008/02/13(水) 23:48:46ID:???実行計画って別に勉強するほどのことじゃないよw
ツールの機能かなんかでボタンひとつででないの?
B列のみの条件で検索する要件があることをDB設計者が知らないか忘れてるだけでしょ、Bだけのインデックス張ってもらえばいいじゃん。
それだけの話だよ。
0449NAME IS NULL
2008/02/14(木) 01:54:49ID:???mysql> select a.member_id from member_item a, member_item b
where a.member_id = b.member_id and a.item_id = 1 and b.item_id = 2;
+-----------+
| member_id |
+-----------+
| 1 |
| 4 |
+-----------+
2 rows in set (0.00 sec)
0450NAME IS NULL
2008/02/14(木) 01:56:56ID:FPmSI381それを読み込んで、
1は>
2は>=
の関係演算子を同じSQL内で使うとするとエラーがでるんですが
このようなときはどのように記述すればよいか教えてください。
WHERE ZZZZZZ DECODE(AAAAA,'1',>,'2',>=) YYYYY
0451NAME IS NULL
2008/02/14(木) 20:58:23ID:???where (AAAAA='1' and ZZZZZZ>YYYYY) or (AAAAA='2' and ZZZZZZ>=YYYYY)
0452NAME IS NULL
2008/02/15(金) 02:24:59ID:???うちの会社のシステムは売り上げ実績が100万件くらいを超えると、
参照系にしろ更新系にしろパフォーマンスがぐっと下がります。
たぶん横長テーブルを3つくらいjoinして
全列を構造体につっこんでいるのがまずいのじゃないかと思うんですが・・・。
0453NAME IS NULL
2008/02/15(金) 06:35:26ID:???100万件程度は間違いなく「通常」の範囲内に入るだろう。
0454NAME IS NULL
2008/02/15(金) 23:47:52ID:???それに、
> たぶん横長テーブルを3つくらいjoinして
> 全列を構造体につっこんでいるのがまずいのじゃないかと思うんですが・・・。
これはRDBMSの問題じゃない
0455NAME IS NULL
2008/02/16(土) 10:04:11ID:ZAE8bFc6際に、オブジェクトエクスプローラに接続しようとすると、以下のような
エラーが出て、接続できません。
「SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、
SQL Server の既定の設定がリモート接続を許可しないようになっていること
がエラーの原因である可能性があります。」
「SQL Server Browser」を”無効”→”自動”に変え、「DatabaseEngine」
のリモート接続を、”ローカル接続のみ”→”ローカル接続及びリモート接続”
に変えましたが駄目です。
何か他に対処法はありますでしょうか?
0456NAME IS NULL
2008/02/16(土) 12:00:45ID:???0457NAME IS NULL
2008/02/16(土) 23:22:51ID:???001 A
001 A
001 A
002 A
002 A
003 B
003 B
003 B
003 B
003 B
こういうデータで名前Aのようにコードが分かれているグループ
だけを抽出したいです。名前Bのようにはコードと名前の
グループ件数が同じものは選ばない。どう書けばいいでしょうか?
欲しい結果
コード 名前
001 A
001 A
001 A
002 A
002 A
0458457
2008/02/16(土) 23:27:37ID:???0459NAME IS NULL
2008/02/16(土) 23:38:34ID:???from TableName A
where exists (
select *
from TableName B
where A.名前 = B.名前
and A.コード <> B.コード
)
0461447
2008/02/17(日) 00:25:26ID:MxRoVOZ3>>449様ので見事に取得できました。
ありがとうございます。
0462NAME IS NULL
2008/02/17(日) 07:39:26ID:???ストアドでもない普通のSQL文が300行〜1000行って常識なんでしょうか。
LEFT JOINだらけです。
ちなみに先輩に聞いたらそもそも設計がアレだから仕方ないとのことでした。
(アレが何かは詳しくは教えてもらえませんでした)
0463NAME IS NULL
2008/02/17(日) 08:50:03ID:???俺はテーブルいろいろ結合しまくって10行くらいになったとこでメゲた。
0464NAME IS NULL
2008/02/18(月) 04:51:14ID:???だいたいA4に印刷して1枚に収まらなくなってきたらなんかおかしい
0465NAME IS NULL
2008/02/18(月) 15:41:45ID:p0thSFUkmember_id menber_name
1 a-san
2 b-san
3 c-san
得点テーブル(points)
point_id member_id period points
1 1 1 20
2 1 2 40
3 1 3 70
4 2 1 10
5 2 2 20
6 2 3 30
7 3 1 80
8 3 2 50
この中から特定の期間における全てのメンバー名とポイントを取得したい(ポイントが無い場合も取得したいので左結合)のですが、
SELECT * FROM members LEFT JOIN points USING (menber_id) WHERE period = 3
とselectすると、period=3でデータがないCさんが取得できません。
データが無い場合はNULLでもいいので、Aさん〜Cさん+存在する場合はポイント、という形の出力を得るにはどうしたらいいですか
0466NAME IS NULL
2008/02/18(月) 15:51:54ID:???0467NAME IS NULL
2008/02/18(月) 19:19:28ID:p0thSFUkありがとうございます。
NULL値で条件を取るとインデックスが使われないという話を聞いたことがあるのですが、
大量のレコードに対して検索する場合に影響ないでしょうか?
0468NAME IS NULL
2008/02/18(月) 19:49:53ID:???どのみちインデックスはないから問題はないだろう。
オプティマイザが変に気を利かせてWHERE句を先にやろうとしたら
問題あるかもしれん。
まあやってみにゃ分からん。
0469468
2008/02/18(月) 20:14:46ID:???0470462
2008/02/18(月) 22:54:38ID:???ありがとうございます。そうですか、やっぱりちょっと大杉なんですね。
クエリとしてはよくある売り上げを店舗ごとにとかそんなのなんですが、
中身にはCASEごとで異なるテーブルから異なるフィールドを取得してくるような、
長大なSELECT CASE文やら、何かのカウント用の1 AS CountHogeやらが
たくさん入っていて結構混沌としています。
量を減らすには別途中間テーブルを作るか、
SQL Serverなのでビューを小分けに設けるかというのが定石なのでしょうか。
これから勉強してみたいと思います。ありがとうございました。
0471NAME IS NULL
2008/02/18(月) 23:32:28ID:???SQL文、あるいはpsqlのコマンドで、あるデータベース内にあるテーブルの一覧を取得するコマンドってありますか?
0472NAME IS NULL
2008/02/18(月) 23:38:20ID:???0474NAME IS NULL
2008/02/19(火) 11:51:52ID:???社員マスタ(全社員の社員番号と氏名等)、
資格テーブル(社員番号と資格)、
所属テーブル(社員番号と所属)、
業務テーブル(社員番号と業務)があります。
これを全社員について一覧表示できるようにしたいのですが、
LEFT JOIN あるいは RIGHT JOIN のネストは出来ないのでしょうか?
やってみたのですがエラーになってしまい・・・
すっきり書くにはどうしたら良いですか
0475NAME IS NULL
2008/02/19(火) 13:49:27ID:???できたようです。
お騒がせしました。
0476NAME IS NULL
2008/02/19(火) 15:09:15ID:V1WdCTqi0477NAME IS NULL
2008/02/19(火) 22:20:26ID:6GCK1zbsaaaa ''
bbbb ''
cccc ''
dddd ''
eeee ''
という状況で最初にnicknameを設定した人は
user aaaを割当て次の人はbbb・・・という風に
被らずに割り当てたいのですがどういうSQL文を発行すれば
いいですか?mysql5です。
0478NAME IS NULL
2008/02/20(水) 09:08:29ID:???case文でもいいけど
0479NAME IS NULL
2008/02/20(水) 18:37:03ID:0cdARB7/■前条件
####################################################################
create table t_product (
id serial not null primary key unique,
name text not null,
price integer not null
);
create table t_customer (
id serial not null primary key unique,
email text not null,
password text not null
);
create table t_order (
id serial not null primary key unique,
customer_id_fk integer not null
);
create table t_order detail (
id serial not null primary key unique,
order_id_fk integer not null
constraint orderdetail_order_id_constraint
references t_order(id)
product_id_fk integer not null
constraint orderdetail_product_id_constriant
number integer not null
);
0480NAME IS NULL
2008/02/20(水) 18:43:47ID:0cdARB7/t_product:
+---+--------------------+-----------+
| id | name | price |
+---+--------------------+-----------+
| 1 | gPod Classic 160G | 42,800 |
| 2 | gPod nano 8GB | 22,800 |
| 3 | gPod Shuffle 1GB | 9,800 |
+---+--------------------+-----------+
t_customer:
+---+------------------+-----------+
| id | email | password |
+---+------------------+-----------+
| 1 | [email protected]| okada_pw |
| 2 | [email protected] | suzuki_pw |
| 3 | [email protected] | tanaka_pw |
+---+------------------+-----------+
0481NAME IS NULL
2008/02/20(水) 18:44:18ID:0cdARB7/t_order:
+---+------------------+
| id | customer_id_fk |
+---+------------------+
| 1 | 1 |
| 2 | 2 |
+---+------------------+
t_orderdetail:
+---+-----------+---------------+---------+
| id | order_id_fk | product_id_fk | number |
+---+-----------+---------------+---------+
| 1 | 1 | 1 | 2 |
| 2 | 2 | 1 | 1 |
| 3 | 2 | 2 | 1 |
| 4 | 2 | 3 | 3 |
+---+-----------+---------------+---------+
####################################################################
0482NAME IS NULL
2008/02/20(水) 18:47:25ID:0cdARB7/上記の前条件から以下のSQL文を記述せよ。トランザクションは考慮しない。
(1)t_productに「gPod touch 16GB,4800円」を追加する。
(2)t_customerの「[email protected]」を削除する。
(3)gPod nano 8GB を22,800円から23,800円に更新する。
(4)t_customerの中で、メールアドレスが.comで終わるユーザ一覧を出力する。
0483NAME IS NULL
2008/02/20(水) 19:08:59ID:0cdARB7/(1) t_customerのpassword列は、本来では(md5でハッシュをとるなど)何らかの変換をして保存する事が望ましい。その理由は何か?
(2) t_orderのcustomer_id_fk列には、t_customerのid列に含まれる値をとる制約がかける必要がある。その制約を記述せよ。制約名は各自の自由とする。
(3) t_productのprice列と、t_orderdetailのnumber列には、ある制約があることが望ましい。それはどんな制約で、実際にcreate table ...の中に埋め込むとしたら、どんな記述になるか。それぞれの制約を記述せよ。
0484NAME IS NULL
2008/02/20(水) 19:12:50ID:0cdARB7/JECSHOPの状態では、「[email protected]のユーザがgPod Classic 160GBを1台購入した。」といえる。以下に解答せよ。
(1) 「[email protected]」のユーザのオーダ状況を、前述の文章に沿って説明せよ。
(2) 「[email protected]のユーザが、gPod nano 8GBを2台、gPod Shuffle 1GBを4台購入した」とする。
このときのSQLを記述せよ。トランザクションも考慮すること。
・[email protected]のパスワードはtakahashi_pwで、t_customerのidは、4つになったとする。
・このオーダに対して、t_orderのid列は3になったとする。
0485NAME IS NULL
2008/02/20(水) 19:18:44ID:0cdARB7/t_customerにユーザを加える作業をPHPから加えるとき、
$stmt = $dbh->prepare("insert into t_custtomer
(email,password) values(",$emai.",".$pass.")");
$stmt->execute();
この方法をAとする。方法Aよりも
$stmt = $dbh->prepare("insert into t_customer
(email,password) values(:EMAIL, :PASS)");
$stmt->bindParam(':EMAIL',$email);
$stmt->bindParam(':PASS',$pass);
$stmt->execute();
この方法をBとする。方法Bの方法が好ましい。
その理由をセキュリティの観点から説明せよ。
ここで、$dbhはPHPにおけるPDOのDBハンドル、$stmtはStatementオブジェクト、$email
と$passはPHPのフォームでテキスト形式で渡されたE-Mailアドレスとパスワードとする。
0486NAME IS NULL
2008/02/20(水) 19:21:12ID:0cdARB7/0487NAME IS NULL
2008/02/20(水) 19:27:07ID:???0488NAME IS NULL
2008/02/20(水) 20:23:29ID:???0489NAME IS NULL
2008/02/20(水) 20:34:02ID:???氏ねと言っておこうかw
0490NAME IS NULL
2008/02/20(水) 20:39:49ID:0cdARB7/失礼致しました。
0491NAME IS NULL
2008/02/20(水) 22:52:10ID:???0492NAME IS NULL
2008/02/21(木) 13:41:02ID:iDr1OTgxID DATA
001 ABC
002 AC
003 C
欲しい結果
ID A B C
001 ○ ○ ○
002 ○ ○
003 ○
このように文字列DATAの中に'A','B','C'があったら
それぞれ該当する列に○を出力したいのですが
どうしたらよいでしょうか?
0493NAME IS NULL
2008/02/21(木) 13:43:49ID:???0494NAME IS NULL
2008/02/21(木) 19:05:41ID:???ヒント:CASE
0495NAME IS NULL
2008/02/21(木) 19:14:14ID:oQVe31id0496NAME IS NULL
2008/02/21(木) 21:07:47ID:7djH4nfPテーブル1とテーブル2があり、
テーブル1には列a、列b、列c、列d、列e
テーブル2には列A、列B、列C、列D、列Eがあります。
テーブル1の列d、列eとテーブル2の列Dと列EはNOT NULLです。
テーブル1の列aとテーブル2の列A、
テーブル1の列bとテーブル2の列B、
テーブル1の列cとテーブル2の列Cが等しければ、
テーブル1の列dと列eをテーブル2の列Dと列Eで更新するというSQLを
作成したいのですが、うまく更新ができません。
(更新はできるのですが、NULLで更新されてしまう)
以下が私の考えたSQL文なのですが、何が悪いのか教えて頂けないでしょうか。
UPDATE テーブル1
SET
(列d, 列e) = (
SELECT
列D, 列E
FROM
テーブル2
WHERE
テーブル1.列a = テーブル2.列A
AND
テーブル1.列b = テーブル2.列B
AND
テーブル1.列c = テーブル2.列C
)
0497NAME IS NULL
2008/02/21(木) 22:00:05ID:???http://www2.moug.net/bbs/db/20080221000001.htm
http://www2.moug.net/bbs/db/20080221000003.htm
http://www2.moug.net/bbs/db/20080221000004.htm
もうね、死ねと。
0498NAME IS NULL
2008/02/21(木) 22:31:30ID:???「ゆとり」ってこういうのを言うのかね?
>>496
(列a、列b、列c)と等しい(列A、列B、列C)がない場合にNULLになるってこと?
だったら WHERE EXISTS (同じサブクエリ) をつければいいんでね?
0499NAME IS NULL
2008/02/21(木) 22:59:24ID:7djH4nfP回答ありがとうございます。
(列a、列b、列c)と等しい(列A、列B、列C)は必ず存在します。
それなのに、すべての行がNULLで更新されてしまいます。
0500NAME IS NULL
2008/02/21(木) 23:14:42ID:???サブクエリでtypoしてるとか?
0501NAME IS NULL
2008/02/21(木) 23:19:25ID:7djH4nfPサブクエリでtypoとは、どういうことでしょうか?
あまり知識がなくてすみません。
0502NAME IS NULL
2008/02/21(木) 23:43:59ID:???−名C(複〜s) 《口語》 誤植.
typographic error の短縮形
0503NAME IS NULL
2008/02/22(金) 00:06:46ID:hwdD2s1cSELECT
列D, 列E
FROM
テーブル2
WHERE
テーブル2.列A = 'aa'
AND
テーブル2.列B = 'bb'
AND
テーブル2.列C = 'cc'
これだと、しっかりと期待どおりの結果が返るんですけど。。。
0504NAME IS NULL
2008/02/22(金) 00:36:46ID:???なので、問題があるとすれば、例じゃなくて"本当"に実行しているサブクエリあたりだろうと言うこと。
SET (d,e)=(SELECT D,E ...)
な場合、サブクエリは1行だけ返さなくてはならないのだけど、本当に1行だけ返っているか?
0行ならNULLで、複数行ならエラーになると思うが、Oracleだとどうなのかな?
実は本当のSQLがsum(D),min(E)の様な集約関数になっていて結果がNULLになっていたり。
とまぁ、いろいろ考えられるので問題の切り分けをした方がよさそう。
>>503
どうせやるなら、
SELECT 列D,列E FROM テーブル2 JOIN テーブル1
ON テーブル2.列A = テーブル1.列a
...以下略
で確認してみてはどうか。
0505NAME IS NULL
2008/02/22(金) 14:29:22ID:???テーブルの項目に
・社員ID
・作業開始日
・作業終了日
があり、そのテーブルから社員ごとの、最も新しい情報が格納されているレコードを
抽出したいのですが、どのようなSQL文になるのでしょうか。
社員ID 開始日 終了日
1 1/1 1/31
1 2/1 2/29
2 1/1 2/29
↓抽出
社員ID 開始日 終了日
1 1/1 1/31
2 1/1 2/29
0506NAME IS NULL
2008/02/22(金) 15:07:36ID:???日付のどれを見ていってるの?
ほしい抽出結果が最も古い情報を取得してるように見えるけど
0507NAME IS NULL
2008/02/22(金) 15:51:16ID:???申し訳ない、ミスです。。。
抽出されるべきは
1 2/1 2/29
2 1/1 2/29
です。
0508NAME IS NULL
2008/02/22(金) 21:11:47ID:???同じ社員で同じ開始日が複数あったら欲しい結果はどうなるの?
0509NAME IS NULL
2008/02/22(金) 23:51:14ID:FAMACLRa0510NAME IS NULL
2008/02/24(日) 03:42:12ID:???ってかPL/SQLだがが…
デバッグ環境もないД
select
MAX(社員ID) 社員ID ,
CASE WHEN MAX(開始日) > MAX(終了日) THEN MAX(開始日) ELSE '' END 開始日,
CASE WHEN MAX(終了日) > MAX(開始日) THEN MAX(終了日) ELSE '' END 終了日
from テーブル名
group by 社員ID
0511NAME IS NULL
2008/02/24(日) 04:24:14ID:???開始日も終了日も年月日で、'2008/02/04'
みたいになってるとして、
終了日の方が開始日より強い(開始日 = 終了日のデータの場合)
っていう方針でいくと、
SELECT
MAX(社員ID) , MAX(開始日) , MAX(終了日)
from
テーブル名
where
CASE WHEN 終了日 >= 開始日 THEN 終了日 ELSE 開始日 END 更新日
IN
(select
CASE WHEN MAX(終了日) >= MAX(開始日) THEN MAX(終了日) ELSE MAX(開始日) END 最終更新日
from テーブル名
group by 社員ID )
group by
社員ID
これでおk?
0512NAME IS NULL
2008/02/24(日) 06:35:25ID:???0513NAME IS NULL
2008/02/25(月) 15:48:07ID:???テーブルをどのような構造にすればスマートに処理できるか悩んでいます。
:アンケートの内容は「好きな料理をいくつでも上げて下さい」
:欲しい値は 「各料理の総得票数」と、そ「の料理を選んだ人が他にどんな料理を好むか」
:データ数は1000件程
:モニターの答える料理名の数は不定。
[没案1] 各料理にコードを振って16進数で収納し正規表現で取り出す→CPU負荷高で不可
table1 モニター毎のデータ
|id(int)|cooknum(text)|
|1|0003(たこ焼き カレー)|
|2|000f(カレー たこ焼き シチュー 栗ご飯)|
table2 料理コード
|1|カレー|
|2|たこ焼き|
|4|シチュー|
|8|栗ご飯|
0514NAME IS NULL
2008/02/25(月) 15:49:43ID:???[没案2]各料理ごとにフィールドを作る→フィールド数が増えすぎて不可
|id|カレー|たこ焼き|シチュー|栗ご飯|
|1|1|1|null|null|
|2|1|1|1|1|
[没案3]料理一票毎にレコード→重複チェックが困難な為不可
|id|料理|
|1|カレー|
|1|たこ焼き|
|2|カレー| etc
[没案4]極端に多くの料理を上げるモニターがいた場合フィールド数が不足
|id|料理1|料理2|料理3|料理4|
|1|カレー|たこ焼き|null|null|
|2|カレー|たこ焼き|シチュー|栗ご飯|
0515NAME IS NULL
2008/02/25(月) 16:33:37ID:???>没案3
重複チェックはUNIQUE制約付けてDBにやらせればいいのでは?
0516NAME IS NULL
2008/02/25(月) 19:56:40ID:???モニターテーブル(monitor_id, 氏名など)
料理テーブル(food_id, 料理名など)
回答テーブル(monitor_id, food_id)
だろうな。
0517NAME IS NULL
2008/02/25(月) 22:25:06ID:???ビット演算でできんの?
0518NAME IS NULL
2008/02/25(月) 22:33:46ID:???没案1〜4ってすごいな
普通考えつかんでしょこんなのw
自然に考えたら516になると思うけど
0519NAME IS NULL
2008/02/26(火) 07:58:22ID:???>>516を参考にして
モニターテーブル(monitor_id, 回答数)
料理テーブル(food_id, 料理名)
回答テーブル(monitor_id, food_id)
こんな感じでやってみる。
とりあえず「紙」のアンケートを1000件、csvに打ち込んでくるわ
0520NAME IS NULL
2008/02/26(火) 17:55:00ID:jUEYC6cIテーブルのkeyをCSV形式に含まれるでIDで引き出す場合
IN ()とUNION ALLとではどちらが良いのでしょうか?
ちなみにkeyにはindexが張られています。
それともこういった場合別のもっと良いやり方があるのでしょうか?
0521NAME IS NULL
2008/02/26(火) 18:33:56ID:???テーブルを用意してCSVを流し込んでHASH JOINがいいと思う。
0522仕様書無しさん
2008/02/26(火) 23:07:37ID:uVBIAVZUALTER TABLE でデフォルト値を設定したいときは
ALTER TABLE テーブル名
ALTER 列名 SET DEFAULT デフォルト値 ;
でよろしいでしょうか?
0524NAME IS NULL
2008/02/28(木) 14:55:32ID:???回答待つよりヘルプみたほうがはやいと思われ
0525NAME IS NULL
2008/02/29(金) 11:53:19ID:oX/QaCte方法がわかりません
VBAを使って変更したいと思っています。
どなたか教えていただけませんでしょうか
0526NAME IS NULL
2008/02/29(金) 13:47:16ID:???実行時に切り替えるならデータを、そうでないならレジストリ直とか
0527NAME IS NULL
2008/03/02(日) 10:40:35ID:1J2fGyJN実行する度にテーブルfooのWHERE条件に該当するレコードのhoge列に
1加算するSQLを作りたいのですが、どう書けばよいか教えてください。
サブクエリで書いても同じテーブルは指定できないと怒られ出来ないようです。
環境はMySQL4.0.27です。
0528NAME IS NULL
2008/03/02(日) 11:08:33ID:???update foo set hoge=hoge+1 whre ほげほげ
じゃないの?
0529NAME IS NULL
2008/03/02(日) 11:24:31ID:???そんなシンプルだったとはっ・・・!
やってみたらできました。ありがとうございます。
0530ミミ
2008/03/03(月) 19:08:52ID:oS8vdq4tfruits.id : (主キー)
fruits.name : 果物名
fruits.date : 入荷日
これを、入荷日が最近のものからソートして一覧表示したいのだけど、
同じ果物名はひとまとまりで一覧表示したい。
同じ果物名の中で一番最近の入荷日でソートしたい。
つまり、
みかん, 2008-02-18
みかん, 2008-03-02
りんご, 2008-03-03
りんご, 2008-03-01
りんご, 2008-02-15
をソートしたら
りんご, 2008-03-03
りんご, 2008-03-01
みかん, 2008-02-18
みかん, 2008-03-02
りんご, 2008-02-15
になるようにしたい。
どうしたらいいかな?
0531ミミ
2008/03/03(月) 19:10:17ID:oS8vdq4tfruits テーブルがあります。
fruits.id : (主キー)
fruits.name : 果物名
fruits.date : 入荷日
これを、入荷日が最近のものからソートして一覧表示したいのだけど、
同じ果物名はひとまとまりで一覧表示したい。
同じ果物名の中で一番最近の入荷日でソートしたい。
つまり、
りんご, 2008-02-15
みかん, 2008-02-18
りんご, 2008-03-01
みかん, 2008-03-02
りんご, 2008-03-03
をソートしたら
りんご, 2008-03-03
りんご, 2008-03-01
りんご, 2008-02-15
みかん, 2008-03-02
みかん, 2008-02-18
になるようにしたい。
どうしたらいいかな?
0532NAME IS NULL
2008/03/03(月) 19:15:01ID:???普通に
order by fruits.name,fruits.date desc
で良いジャマイカ。
0533ミミ
2008/03/03(月) 19:16:47ID:oS8vdq4tそうじゃなくて、りんごとみかんの比較は、
りんごの最近の出荷日である 2008-03-03 と
みかんの最近の出荷日である 2008-03-02 で比較したいの。
もちろん、各果物の中では、出荷日でソートしたい。
0534NAME IS NULL
2008/03/03(月) 19:41:14ID:???SELECT * FROM fruits AS T1 ORDER BY (SELECT max(date) FROM fruits WHERE name=T1.name) DESC,date DESC;
0535ミミ
2008/03/03(月) 19:44:03ID:???select * from fruits,
(SELECT name AS name2, MAX(nyuka) AS recent
FROM fruits GROUP BY name) AS recent_table
WHERE fruits.name = recent_table.name2
order by recent, name, nyuka;
0536ミミ
2008/03/03(月) 19:46:34ID:???あ!それいいね。
ORDER BY 句だけで全部できると、
(SQL を埋め込んだ PHP の) コードの分離ができていい。
0537534
2008/03/03(月) 19:53:07ID:???データの内容(分布)やインデックスの張り方などで状況は変わるけど、
>>535の方が速い場合が多いかも。
>>354は相関クエリだからfruitsの行数分fruitsテーブルを走査してしまう。
0538NAME IS NULL
2008/03/06(木) 14:06:30ID:8vCwTipOテーブルAとテーブルBから
コード | 日付 | 項目名
−−−−−−−−−−−−−−−−
001 |2008/03/06|あああ
001 |2008/02/15|いいい
001 |2009/03/31|ううう
002 |2008/03/01|AAA
002 |2009/03/31|BBB
003 |2008/03/01|かかか
という結合表(T1)を UNION を使用して作成しました。
この T1 からコードでグループ化し、日付の最も小さな値をもつ行のみを
抽出したいのです。
コード | 日付 | 項目名
−−−−−−−−−−−−−−−−
001 |2008/02/15|いいい
002 |2008/03/01|AAA
003 |2008/03/01|かかか
このようにしたいのですが、GROUP BY でコードでグループ化し、
SELECT コード, MIN(日付), MIN(項目名)
FROM T1
GROUP BY コード
とすると
コード | 日付 | 項目名
−−−−−−−−−−−−−−−−
001 |2008/02/15|あああ
のように欲しい表ではなくなってしまいます。
どのようにSQLを記述すればいいでしょうか?
よろしくお願いします。
0539NAME IS NULL
2008/03/06(木) 15:25:15ID:???取り出せばおk
0540NAME IS NULL
2008/03/07(金) 00:14:06ID:???今までそんなのやった事なかったんだけど、今の現場でそんなのをばんばん投げててちょっとびびってます。
0541NAME IS NULL
2008/03/07(金) 00:16:02ID:???0542NAME IS NULL
2008/03/07(金) 00:24:55ID:???どのDB使ってるか言ってなかったですね。DB は Oracle です。
で、OracleだとIN句には1000個までしか書けないので、1000個ずつのIN句をORでつなげてます。
0543NAME IS NULL
2008/03/07(金) 00:59:13ID:???なしだと思う。
0544NAME IS NULL
2008/03/07(金) 09:25:32ID:???--------
MM07-1
MM07-10
MM07-11
MM07-2
となっているフィールドをソートして
MM07-1
MM07-2
MM07-10
MM07-11
としたのですが、order by A としたのでは思うような結果が得られません。
上記の結果を得るにはどのようにしたらよいのでしょうか?
使用しているのはT-SQLです
0545NAME IS NULL
2008/03/07(金) 09:26:32ID:???○ としたいのですが
0546NAME IS NULL
2008/03/07(金) 09:37:56ID:???6文字目以降をSUBSTRING命令などで切りだす。
切り出した文字列を数値型にCASTしてソート。
頻繁にこういう処理が必要なら最初から並び順のフィールドを準備しておく。
0547NAME IS NULL
2008/03/07(金) 09:39:24ID:???ハイフン以降の数値だけでいいのならそこだけ抜き出して整数に変換すりゃいい。
以下はハイフン前と後をそれぞれ正規表現で抜き出してハイフン後のみ数値変換してORDER BY
ORDER BY substring(a from '^[^-]+'),cast(substring(a from '[^-]+$') as int);
0548NAME IS NULL
2008/03/07(金) 10:18:01ID:???SQLで正規表現が使えるのは目からウロコだったのですが、
使用している環境がSQL Server2000なので残念ながら正規表現は
使用できないようです。これを先に言うべきでした。
0549NAME IS NULL
2008/03/07(金) 10:37:16ID:???INの中身をサブクエリにして、
内容を適当なテーブルに格納しておけ。
0550NAME IS NULL
2008/03/07(金) 11:19:18ID:???正規表現は使えなくても、文字(列)で分割するsplitやexplodeとかあったりしないのかな、
substring(a from 6 for 7) でもいけるわけだが、まぁAに入る規則次第かな。
0551NAME IS NULL
2008/03/07(金) 18:24:21ID:???って本当ですか?
0552NAME IS NULL
2008/03/07(金) 18:59:04ID:uMhc0dqSテーブル内でレコードを特定するために、
連番を採番する場合に、DBのオートインクリメント機能を使うのがいいのか、
それとも、採番テーブルを作ってそこから最新の番号を取るのがいいのでしょうか?
DBのオートインクリメント機能を使う方が楽だと思うのですが、
ずっと前に居たプロジェクトで採番テーブルを使っていたので、
何の為にそれを使う必要があるのか、お聞きしたいです。
宣しくお願いします。
0553NAME IS NULL
2008/03/07(金) 19:01:20ID:???いろいろ処理をしたければ(ビジネスロジックを挟みたいとか)、採番
テーブル、って感じで使い分けてる。
0554NAME IS NULL
2008/03/07(金) 22:12:18ID:uMhc0dqSアドバイスありがとうございます。
> いろいろ処理をしたければ(ビジネスロジックを挟みたいとか)、採番
> テーブル、って感じで使い分けてる。
よく分かりました。確かにそうですね。
一つ思うのは、採番テーブルから番号を取得した際に、
その番号を元にビジネスロジックで処理が確定するまで、
採番テーブルをロックする必要があると思うのですが、
これって、もっとスマートな方法はないでしょうか?
リアルタイムで大量の処理を要求される場合に、
ビジネスのトランザクションが確定するまで採番テーブルがロックされてしまうと、
待ち行列が大量に発生する可能性が出てきますよね。歯抜け可とすればいいのでしょうけど。
0555NAME IS NULL
2008/03/07(金) 23:33:06ID:???0556NAME IS NULL
2008/03/08(土) 00:13:49ID:???それならロックはほぼ一瞬で済む
0557NAME IS NULL
2008/03/08(土) 07:31:32ID:???スキップする必要があったので採番テーブルが必要だった。
面倒だった。
いやまあ、状況によってはテストや運用が楽だったりするので
どっちもどっちだと思うけど。
0558NAME IS NULL
2008/03/08(土) 14:56:55ID:???ただ、履歴データが溜まりに溜まり、3,000万件、4GBになっています。
分析の頻度は決して高くありませんが、必要に応じて解析につかいますので、
テーブルに残しておきたいと思います。
分割したいとは思っているのですが、同じ構造のテーブルを2006年度、
2007年度分とか分けるのって美しくないですよね?
集計する際にも、結合する手間がでますし。
このようなテーブルはどのように運用するべきなのでしょうか?
DBはMYSQL5.0です。宜しくお願いします。
0559NAME IS NULL
2008/03/08(土) 17:42:07ID:???member.name:参加者リストの名前
kirai.name:嫌いな人の名前
suki.name:好きな人の名前
というテーブル、フィールドを用意しています。
member.name から
kirai.name に存在しない名前、もしくは
kirai.name に存在していても suki.name に存在している名前
を取ってくるにはどんなSQLを書けばよいでしょうか?
数時間悩んでいるのですが、カッコカッコANDORとかしてたら
混乱してきました。
どなたかお願いします。
mysql5で使用予定です。
0560NAME IS NULL
2008/03/08(土) 17:49:04ID:???select name
from member
where
name in (select name from suki)
or
name not in (select name from kirai)
名前で好き嫌いを判断するのはよくないがな。
(後藤)真希は嫌いだが(堀北)真希は好きだ。
0562559
2008/03/08(土) 18:36:37ID:???560を
サブクエリなしでする方法ってありますか。。
ちょっとサブクエリが使えない事情がありまして。。。
0563NAME IS NULL
2008/03/08(土) 19:12:01ID:???select member.name
from member
left outer join
suki
on
member.name = suki.name
left outer join
kirai
on
member.name = kirai.name
where
suki.name is not null or kirain.name is null
0564NAME IS NULL
2008/03/09(日) 07:18:33ID:???その質問は自分で結論がでてるじゃん。
としかコメントできんが。
まあ、妥協案で過去年度分の情報はcsvにでも書き出して圧縮して保管し
テーブル上から削除、使うときに一時的に戻せば?くらいの事しか思いつかんが。
0565NAME IS NULL
2008/03/09(日) 15:17:42ID:???0566NAME IS NULL
2008/03/09(日) 15:58:32ID:???その判断が事前に出来ないんだったら、素直に設計するのが吉。
つか、4GBくらいだったらマシンスペックによっちゃあ
メインメモリに収まってしまうだろ。
0567NAME IS NULL
2008/03/09(日) 21:39:39ID:???結果表示↓
_________
|名前|住所 |Age|
| |
|_________
と 名前に 山田万太郎と表示されますが、この山田万太郎にリンクを付けて
山田万太郎のプロフィールを表示させたいのですが、どのようにリンクを付ければいいのでしょうか?
説明ばんばん下手で申し訳ないです。
0568NAME IS NULL
2008/03/09(日) 21:44:56ID:???0569NAME IS NULL
2008/03/09(日) 21:46:29ID:???0570NAME IS NULL
2008/03/09(日) 23:55:24ID:???0571NAME IS NULL
2008/03/10(月) 00:14:29ID:???ありがとうございます^^*
0572NAME IS NULL
2008/03/10(月) 18:00:13ID:???このクエリでちゃんと取得してくれないんですが
どこかおかしいのでしょうか。。
0573NAME IS NULL
2008/03/10(月) 18:09:02ID:???0574NAME IS NULL
2008/03/10(月) 18:14:26ID:???xに2~14がある行で、01~13の列の部分だけ表示したいのですけど
分かりますかね・・・。。
0575NAME IS NULL
2008/03/10(月) 18:24:20ID:???phpでMySQLを使ってるんですが
SELECTの部分を指定しているからか、何故かMySQLのフィールドの値を返さずに
添字配列の数字の1~13を返してきます。
SELECTを*に置き換えたら、フィールドの値が正常に返ってきたんですけども。
本当は>>574のようにしたいのですが。
単純な勉強不足でしょうか。
0576NAME IS NULL
2008/03/10(月) 18:31:08ID:???カラム名じゃなくて式だと思われてるんだと思う
0577NAME IS NULL
2008/03/10(月) 18:45:30ID:???うーん。。
0578NAME IS NULL
2008/03/10(月) 18:58:19ID:???だったらダブルクォートか、MySQLならバッククォートで括るんじゃない?
てか念のためdescribe mapの結果を貼ってもらったほうがいいかも。
0579NAME IS NULL
2008/03/10(月) 19:08:34ID:???0580NAME IS NULL
2008/03/10(月) 19:56:16ID:AZYyHfNJフィールド名: ID name age job date mail
ID以外を指定したいとき、
SELECT name, age, job, date, mail from …
ではない方法で、全体からIDだけを除いた指定の仕方ってあるのでしょうか
イメージで言えば↓みたいな感じでシンプルにできないのでしょうか
SELECT * - ID from …
0581NAME IS NULL
2008/03/10(月) 21:37:43ID:???ないだろ。
テーブルのカラム一覧から SQL を組み立てるパーサでも
書けよ。
0582NAME IS NULL
2008/03/10(月) 23:28:36ID:???>SELECT * - ID from …
時々でてくるネタなんだが、こういう発想するヤツは後でテーブルが変更になったときに
どうやって対処するのか聞いてみたいな。
0583580
2008/03/11(火) 09:10:36ID:???確かにテーブル変更時は面倒ですね
0584NAME IS NULL
2008/03/11(火) 09:54:17ID:???SELECTのカラム名をバックウォートで囲ってみたところちゃんと通りました。
皆さんご教授ありがとうございました。
0585NAME IS NULL
2008/03/11(火) 18:03:15ID:IX6430zP上記のようにただカウントをするSQLを書いたのですが
テーブルには3404800件データがあり結果出るまでに
56149.726 msかかります
(idはプライマリーキーです)
order by desc でひっくりかえして最終idを取得して
MAX値とするのも考えましたが、データには論理削除されている
物も含まれており、正しい数字にはなってくれません
こういった場合はどのようにすれば良いのでしょうか?
0586NAME IS NULL
2008/03/11(火) 18:59:38ID:???DBMSは何?
プライマリキーであっても自動的にはインデックスが張られないDBMSなのかもしれん。
インデックスがあってもOracleで言うanalyzeをしないと使われないDBMSなのかもしれん。
インデックスがあってかつ使っているけど遅いんなら単にスペック不足かもしれん。
0587NAME IS NULL
2008/03/11(火) 19:04:09ID:???0588585
2008/03/11(火) 19:27:10ID:IX6430zPDBMSはpostgresです
バージョンは8.0.13です
>>587
EXPLAIN ANALYZE した結果のトータルタイムが
Total runtime: 56149.726 ms
でした
0589585
2008/03/11(火) 19:35:39ID:IX6430zP一度それを試してみようと思います
(現在まではVACUUM ANALYZEまでしかやっていません)
ありがとうございました
>1週間に一度ほどの間隔で、レコードが全てが入れ替わるので
>CronでVACUUMを走らせていましたがVACUUM FULLすると
>見違える程高速になりました。
0590NAME IS NULL
2008/03/12(水) 19:14:20ID:???文字列の20080312を2008/03/12に変換したいのですが、
select convert(datetime,誕生日,111)
だと、結果が
2008-03-12 00:00:00.000
になるので
select CONVERT(CHAR,convert(datetime,誕生日),111)
にしてます
Oracleだと簡単にできるのに、SQLSEVERはconvertを2回しないと駄目ですか?
TO_DATE(誕生日, 'YYYY/MON/DD')
0591NAME IS NULL
2008/03/12(水) 20:17:29ID:2ioX00Cq「い」「ろ」「は」という列があります。
列単独ではユニークではありません。
3列をあわせるとユニークになります。
抽出したい対象は「い」列のある項目です。
「い」列だけでは1つに特定できないので、
「ろ」列の昇順、「は」列の降順で優先度を設けてその優先度の高い行を抽出対象とします。
このようなSQLを書きたいのですがどのように書けばよいのでしょうか?
0592NAME IS NULL
2008/03/12(水) 20:23:33ID:???where い = value
order by ろ, は desc
で上から取るしかないんじゃない?
0593NAME IS NULL
2008/03/12(水) 20:30:10ID:???「い」列の値が一致して「ろ」列の値がそれより大きい行が存在しなくて、かつ、
「い」列と「ろ」列の値がそれぞれ一致して「は」列の値がそれより小さい行が存在しない
行。
肝心な部分を書き忘れましたが、
抽出される行を対象行だけ(1行)にしたいのです。
0596NAME IS NULL
2008/03/12(水) 21:33:38ID:???Oracle専用の手抜き。
select * from (select * from TableName where い = SomeValue order by ろ, は desc) where rownum = 1;
0597NAME IS NULL
2008/03/12(水) 21:37:36ID:???0598NAME IS NULL
2008/03/12(水) 21:41:45ID:KqWYWQmiテーブルAとテーブルBがあり1:nの関係です。
フィールドhogeが両テーブルのキーになっています。
但しテーブルBのキー値はテーブルAにない可能性があります。
このときテーブルAにないキー値をテーブルBから削除するSQLを教えてください。
(テーブルBに同一キーが一つしかない場合はすぐ思いつきますが、
複数ある場合、スマートな方法が思い浮かびません。)
面倒なんですが副問合せでお願いします。
0600NAME IS NULL
2008/03/12(水) 21:56:33ID:???delete from B where hoge not in (select hoge from A)
0601NAME IS NULL
2008/03/12(水) 22:13:42ID:???ありがとうございました。
試してみました。
・・・がそこそこスペックのいいPC(CPU2.4GHz MEM2G)で実行しているのですが
めちゃくちゃ処理が重いです。
(テーブルAが5万レコード テーブルBが24万レコード程)
処理速度重視で見た場合、代替SQL文はありますでしょうか?
0602NAME IS NULL
2008/03/12(水) 22:21:01ID:???どんくらい時間かかるん? インデックスが壊れてるとかじゃないよね?
0603598,601
2008/03/12(水) 22:23:15ID:???まだプログレスバーの半分くらいです・・・
テーブルBにはインデックス設定してなかったような。。
0604NAME IS NULL
2008/03/12(水) 22:27:50ID:???インデックスがないのにキー? インデックスつけてやり直してみ。
0605601
2008/03/12(水) 22:41:08ID:???すみません、DBのことまだよくわかってないです。
テーブルAのhogeについては主キーに設定、インデックスあり(重複なし)
テーブルBについてはインデックスあり(重複あり)に設定しました。
上記設定で
delete from B where hoge not in (select hoge from A);
しましたが、重いです・・・
0606NAME IS NULL
2008/03/12(水) 22:43:54ID:???のほうが速いんじゃない?
0608NAME IS NULL
2008/03/12(水) 22:56:45ID:???直訳しろ
0609NAME IS NULL
2008/03/13(木) 10:54:03ID:???答えをSQLで要求するのってどうなんだ
0610NAME IS NULL
2008/03/13(木) 23:07:16ID:???itm (
id TEXT NOT NULL,
tid INTEGER NOT NULL,
PRIMARY KEY (id, tid)
);
id, tid
------
de31, 001
de31, 002
6884, 001
5e96, 002
7f72, 001
7f72, 003
このテーブルから、tidが001と002の両方を持つid(この場合はde31)を取得するのは
どうすればいいんでしょうか…?
0611NAME IS NULL
2008/03/13(木) 23:45:35ID:???> PRIMARY KEY (id, tid)
なので
SELECT id FROM itm WHERE tid in(1,2) GROUP BY id HAVING count(id)=2;
0612NAME IS NULL
2008/03/14(金) 11:53:01ID:???ありがとうございます。
SQLもしっかり勉強しよう…
0613NAME IS NULL
2008/03/14(金) 12:53:36ID:???0614NAME IS NULL
2008/03/15(土) 08:37:32ID:vdIcUnbN↓このページの例って間違ってないですか?
http://oracle.se-free.com/dml/06_rollup.html
「GUROUP BY ROLLUP」とか「GROUP ID」とか解りやすく解説してあるページを教えてくださいませ
0615NAME IS NULL
2008/03/15(土) 18:44:42ID:???その辺は方言が多いから対象のデータベースをしぼって探したほうがいいと思う。
でOracleでいいの?
0616NAME IS NULL
2008/03/16(日) 09:29:34ID:???numberというauto_incrimentなprimary keyがあったとします。
それの0〜50をクエリーすると削除された列はクエリーされず45個など中途半端に表示されてしまいます。
データの列一番上から数えて50列目まで指定してクエリーするSQL文ってありますか?
0617NAME IS NULL
2008/03/16(日) 09:36:40ID:???列じゃなくて行のことを言ってるんだと思うけど、
Postgresだったらlimitが使えるだろう。
0618NAME IS NULL
2008/03/16(日) 09:38:33ID:???0619614
2008/03/16(日) 12:37:17ID:???失礼しました。
間違っていると思っていたサイトですが正解でした。
ごめんなさい
0620NAME IS NULL
2008/03/17(月) 00:34:13ID:???下記のようなTableAとTableBがあります。
TableBの4番目のレコード(104 , 3 , aaa)から見て、
・TableBのD列が同じ
・TableAのB列がTableBの4番目のレコードからみて一番近い過去
の条件でTableBのC列の値を取得したいのですが、一番簡潔なSQL文を教えてくださいませ。
この例だと、101が期待する結果です。
TableA
A(int) , B(datetime)
----------------
1 , 08/03/10
2 , 08/03/11
3 , 08/03/12
4 , 08/03/13
5 , 08/03/14
TableB
C(int) , A(int) , D(varchar(3))
------------------------------
101 , 2 , aaa
102 , 4 , bbb
103 , 1 , aaa
104 , 3 , aaa
105 , 5 , bbb
0621NAME IS NULL
2008/03/17(月) 01:21:46ID:???select b2.C
from TableB b1
join TableB b2
on b1.D=b2.D
where b1.C=104
and b1.A=3
and b1.D='aaa'
and b2.A=(
select a.A
from TableA a
where a.A=b2.A
and a.B=(
select max(a2.B)
from TableA a2
where a2.A=a.A
)
)
0622NAME IS NULL
2008/03/17(月) 23:02:39ID:???解答通りに打っても、フィールド定義の構文エラー、と出てしまいます。
スペル間違いもうち忘れもないかと思います。どうやらcheck句で引っかかっているようなのですが、
なぜでしょうか?
0623NAME IS NULL
2008/03/17(月) 23:20:12ID:???その判断材料となるエラーメッセージを
教えてほしいです
あと、DBMSは何ですか?
0625NAME IS NULL
2008/03/17(月) 23:29:02ID:???列名とデータ値のみを記入した表なら問題なく作れました。
そこからprimary key, not null,...と順に試して作っていくと
check句を記入した時のみエラーが出ます。
0626NAME IS NULL
2008/03/17(月) 23:33:08ID:???そんなんじゃねーの?
0627NAME IS NULL
2008/03/17(月) 23:33:14ID:???「ステートメントの構文エラー」(エラー3290)
・予約語または引数名のつづりに誤りがあるか不足している
・区切り記号に誤りがある
の二つです
0628NAME IS NULL
2008/03/18(火) 09:33:30ID:???どちらも回答をそのままコピペしたら成功しましたよ。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
SQL> ed
file afiedt.bufが書き込まれました。
1 CREATE TABLE employee
2 (
3 e_num CHAR(4) PRIMARY KEY ,
4 e_name VARCHAR(40) NOT NULL ,
5 year INTEGER CHECK(year >= 1970) ,
6 gender CHAR(1) CHECK(gender = '0' OR gender = '1') ,
7 office CHAR(2)
8* )
SQL> /
表が作成されました。
0629NAME IS NULL
2008/03/18(火) 23:27:31ID:???ID=1の行のうち、値がNULLの列に“0”に更新するってことは可能ですか?
ループ処理使わないと無理ですか?
0630NAME IS NULL
2008/03/18(火) 23:41:34ID:???0631NAME IS NULL
2008/03/18(火) 23:48:42ID:???0632NAME IS NULL
2008/03/18(火) 23:59:56ID:???UPDATE Table SET A=CASE WHEN A IS NULL THEN 0 ELSE A END, SET B=CASE WHEN B IS NULL THEN 0 ELSE B END WHERE ID=1;
0633NAME IS NULL
2008/03/19(水) 10:25:44ID:???ということは、>>632的な方法でやると set A= ・・・, B= ・・・が100以上になるから
面倒で嫌だということだよね?
考えてみたけど一発のSQLで自動的にNULLのセルを検出するのは
難しそうだったから、やっぱりプログラミングするとか一回エクセルにデータ吐き出して
一斉置換してからCSV形式にして読み込ませるとかが楽な気がするけど。
一応考える過程で俺だったらこうする的なエクセルツールをつくってしまったのでうp
http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=pwdwin&no=728
DLパス=sql
黄色いセルに必要事項を入力すれば自動的にUPDATE文を生成してくれます
列名はデータディクショナリなりテーブル設計書なりから持ってきて
エクセル使えんならもう知らん
0634NAME IS NULL
2008/03/19(水) 19:52:21ID:vKyZWKXy0635NAME IS NULL
2008/03/19(水) 23:20:15ID:???0636NAME IS NULL
2008/03/19(水) 23:25:52ID:cnxNmH+f0637NAME IS NULL
2008/03/19(水) 23:44:52ID:???0638NAME IS NULL
2008/03/20(木) 00:04:34ID:???でいいんじゃないの。
0639NAME IS NULL
2008/03/20(木) 00:28:38ID:???処理系依存の回答をするのはどうかと思うが。
0640NAME IS NULL
2008/03/20(木) 00:37:21ID:???0641NAME IS NULL
2008/03/20(木) 00:40:33ID:???ISNULLなりIFNULLなり置き換えて読めばいいだろ。
そもそも何使ってるか書かない側が悪いんだし。
0642NAME IS NULL
2008/03/20(木) 00:46:41ID:???0643NAME IS NULL
2008/03/20(木) 01:01:10ID:???馬鹿は喋るな。
0644632
2008/03/20(木) 01:25:21ID:???今頃気づいたつーか、思い出したよ(´・ω・`)
100行っても、わざわざExcelとか持ち出さなくても、
ホスト言語側でループしてSET句を書き連ねればいいだけじゃね。
0645NAME IS NULL
2008/03/20(木) 17:56:01ID:???またFKを使用していますか?
宜しくお願いします。
0646NAME IS NULL
2008/03/20(木) 18:19:46ID:???メリット:せっかくだから
自分は付けない。
付けてるの見かけることもあんまり無い。
0647NAME IS NULL
2008/03/20(木) 18:26:11ID:???FOREIGN KEY A_ID REFERENCES TABLE_A(ID)でA_IDに索引をつけるかどうかは
ケースによるのだが結構悩む。
0648NAME IS NULL
2008/03/20(木) 18:33:13ID:???0649NAME IS NULL
2008/03/20(木) 19:33:55ID:J4BXwI7W0650NAME IS NULL
2008/03/20(木) 20:21:09ID:???外部キーをもつテーブルにデータを追加するか外部キーの内容を変更しようとすると、
リファレンス先(TABLE_A)で存在チェックをする。
リファレンス先は当然主キーかそれに準じるキーなのでチェックには索引が使われる。
一方TABLE_Aのレコードを削除またはキーの内容を変更しようとすると、
外部のテーブルから参照がないことを確認するために、
外部キーを持つテーブルをサーチすることになるが、
このフィールドに索引がない場合はデータレコードの全件サーチとなる。
索引があるばあいは索引でのチェックになるので高速ではあるが、
カーディナルが低い索引が作られることになるためこれによる同時実行性の低下が問題になる。
0651NAME IS NULL
2008/03/20(木) 22:38:43ID:???0652NAME IS NULL
2008/03/20(木) 22:42:23ID:???それをすることはできませんか?
0653NAME IS NULL
2008/03/20(木) 22:53:09ID:???0654NAME IS NULL
2008/03/21(金) 05:47:39ID:???この時生成されたSQLをコピーして、C#などの言語からADO.NETを
通してSQLを実行すると、ACCESS上での結果と違うのですが、
どのような原因が考えられるでしょうか?
(あいまい検索の*は変換してます)
対象はmdbです
具体的には以下のようなSQLです
SELECT TBL_A.箇所, TBL_A.番号, TBL_A.品名, Count(TBL_A.番号) AS DataCount
FROM (TBL_B INNER JOIN TBL_A ON TBL_B.受付 = TBL_A.受付)
INNER JOIN TBL_C ON TBL_B.品目 = TBL_C.品目
WHERE (((TBL_C.形名) Like "hoge%") AND ((TBL_A.箇所)="fuga")
AND ((TBL_A.箇所)<>"A"))
GROUP BY TBL_A.箇所, TBL_A.番号, TBL_A.品名
ORDER BY Count(TBL_A.番号) DESC;
抽出されるレコード数、集計される値も違います
0655NAME IS NULL
2008/03/21(金) 22:54:24ID:???0656NAME IS NULL
2008/03/21(金) 23:02:35ID:???SELECT
A.箇所,
A.番号,
A.品名,
Count(A.番号) AS DataCount
FROM
TBL_A A,
TBL_B B,
TBL_C C
WHERE C.形名 Like "hoge%"
AND B.品目 = C.品目
AND A.受付 = B.受付
AND A.箇所 = "fuga"
AND A.箇所 <> "A"
GROUP BY
A.箇所,
A.番号,
A.品名
ORDER BY
Count(A.番号) DESC;
0657NAME IS NULL
2008/03/21(金) 23:09:20ID:???0658NAME IS NULL
2008/03/21(金) 23:33:23ID:???他テーブル参照するキーとして、つまり外部キーとして
使ってはいますが、特に設定したことないのですが
0659NAME IS NULL
2008/03/21(金) 23:39:22ID:???詳しくはforeign keyで検索
0660NAME IS NULL
2008/03/21(金) 23:53:43ID:???でも上に書かれてますが、場合によってはパフォーマンス悪くなるんですね
0661NAME IS NULL
2008/03/22(土) 21:12:55ID:???http://support.microsoft.com/kb/225048/ja
DAOとADOで使用できるワイルドカードは違う。
0662NAME IS NULL
2008/03/23(日) 00:31:54ID:iZ/v0z4FSQL発行時にエラーとなります。IN句は900個ずつに区切って10行を指定しています。
テーブルにフラグ等を設定することはでません。
SQLを正常に実行できる方法はないでしょうか。
環境 Oracle10g
0663NAME IS NULL
2008/03/23(日) 00:47:54ID:???0664NAME IS NULL
2008/03/23(日) 03:18:47ID:???0665NAME IS NULL
2008/03/23(日) 10:03:23ID:???エラーメッセージkwsk
0666NAME IS NULL
2008/03/23(日) 13:31:54ID:???0667NAME IS NULL
2008/03/23(日) 22:38:37ID:???まともなSQLに直せばOK
0668NAME IS NULL
2008/03/28(金) 20:54:29ID:3+8kTwhZid integer,
data text
);
tb (
id integer,
ta_id integer,
data text,
update_at timestamp,
);
のような感じで、以下のような結合を行ってta,tbのdataを取得したいと思います。ta → tb は1対多です。
SELECT ta.data, tb.data FROM ta LEFT JOIN tb ON ta.id=tb.ta_id;
このとき、tbの最新のデータ(update_at DESC)1件を取得したいと思います。
どのようなSQLを書けばよいのでしょうか?
0669NAME IS NULL
2008/03/28(金) 21:20:42ID:???max(update_at)じゃダメなの?
0670668
2008/03/28(金) 21:36:52ID:3+8kTwhZ具体的にはどう書くのでしょうか?
SQL詳しくないので、max(update_at)を使う場面というのが、
update_atの最大値を表示したい場合しか思いつきません…。
0671668
2008/03/28(金) 21:44:51ID:3+8kTwhZSELECT * FROM ta;
の結果に
SELECT * FROM tb ORDER BY update_at DESC LIMIT 1;
の結果をta.id=tb.ta_idでJOINする感じです。
0672NAME IS NULL
2008/03/28(金) 22:53:05ID:???>>36
0673NAME IS NULL
2008/03/29(土) 01:42:13ID:???具体的な書き方は「詳しくないので」とか言わずに調べろ
0674NAME IS NULL
2008/03/29(土) 13:30:20ID:???where tb.updated_at = (select max(updated_at) from tb)
0675念のため
2008/03/29(土) 13:32:58ID:???0676668
2008/03/31(月) 13:30:03ID:???うまくいくかっ!?と思ったんですがtb.dataを取得することができませんでしたorz
tbをもうひとつJOINしたら行けないことも無かったのですがそんなに力づくでいいのでしょうか
と思って検索してみたら、同じような解決策を見つけました
http://oshiete1.goo.ne.jp/qa2798343.html
ということは、SQL的にはこれが普通の方法でしょうか?
>>673
ROW_NUMBERとROWNUMは使えないようでした
>>674
それだとtaのリストにならないのでorz
0677NAME IS NULL
2008/04/01(火) 13:02:30ID:???2を0002と出力させるに便利な関数ってありませんでしょうか?
ご存知の方いましたらお願いします。
oracleで
LPAD(数値,桁数,左側に埋めたい文字)
LPAD(2,4,'0')
や
VBでいうFORMAT(数値,'0000')みたいな感じです。
0678NAME IS NULL
2008/04/01(火) 20:18:43ID:???そのものの関数はないと思うから以下で
declare @a int
set @a = 2
select right('0000'+cast(@a as varchar),4)
0679NAME IS NULL
2008/04/03(木) 01:03:05ID:???某書で、SQLの基本的な説明として
----------↓抜粋
成績([k]クラス番号、[k]出席番号、氏名、点数)
SELECT クラス番号, SUM(点数)
FROM 成績
GROUP BY クラス番号
ORDER BY 2
ORDER BY 句には集合関数を指定できないという制約がある。
したがって、ORDER BY SUM(点数) DESC という記述はできないため、
代わりに列番号を指定する。
----------↑抜粋
とあるのですが、次のようなSQLは問題なく通りました。
(ただし oracle xe で、ですが)
SELECT SUM(SAL)
FROM EMP
GROUP BY DEPTNO
ORDER BY SUM(SAL)
本の内容と矛盾するように思えます。
二つのSQLは別物で自分の勘違いでしょうか?
0680NAME IS NULL
2008/04/03(木) 02:30:20ID:???SQL99という規格上ORDER BY句に集約関数は書けられないとなっているのかどうか知らないけど、
もしそうなっているのであれば、上は規格上の話で、下はOracleの拡張ってことでいいんじゃね。
にしても、これを「制約」と云うには語弊があるような気がする。
本来SQLの処理手順からすると、ORDER BY句に集約関数を書くことは出来ない。
しかし、手元にあるPostgreSQL8.0で試すと、
SELECT クラス番号 FROM 成績 GROUP BY クラス番号 ORDER BY SUM(点数);
なんてSQLも通ったりする。内部的にはオプチマイザあたりが
SELECT クラス番号,SUM(点数) AS 合計 FROM 成績 GROUP BY クラス番号 ORDER BY 合計;
って書き換えて実行しているんだろうな。さすがに
SELECT クラス番号 AS CN,.... FROM 成績 WHERE CN=1;
は通らないけどねw。
0681NAME IS NULL
2008/04/03(木) 23:52:31ID:???FROM句は結合条件、WHERE句は抽出条件を書く場所なのでINNER JOINが正しいあり方なんでしょうか?
0682679
2008/04/04(金) 00:35:50ID:???思いついて試したところ、oracle xe 環境で
SELECT SUM(SAL)
FROM EMP
GROUP BY DEPTNO
ORDER BY AVG(SAL)
これすらも通りました。
ORDER BY は取得列以外もいろいろ対象にできる
という基本は私が勉強したoracle以外でも当てはまると予想していますが・・・
とここで次に思いついたのが、
もしかしたら本当に言いたかったのは
GROUP BY 句がないのに ORDER BY で集計関数を使うことはできない
ではないかと。(これは言うまでもなく正しい)
でも GROUP BY の内容に沿って指定していれば通ると。
それを執筆者がどこかで間違ってしまったと。
?
0683NAME IS NULL
2008/04/04(金) 01:33:01ID:???速度の差はないと思うけど、認識としてはそれでいいんじゃね。
>>682
> それを執筆者がどこかで間違ってしまったと。
ぃゃぃゃ、SQL99という規格とベンダー実装の差だろ。SQL99でどうなったか知らないが、本来SQLでは
「ORDER BY句はSELECT文の一部じゃなくてCURSORの一部」 By セルコ
つまり集約関数どころか、
SELECT 氏名 FROM 成績 ORDER BY 点数 ;
もダメ。SELECTリストに無いものはORDER BY句では使えようがないのが規格上の仕様。
0684NAME IS NULL
2008/04/04(金) 03:32:01ID:???> とここで次に思いついたのが、
> もしかしたら本当に言いたかったのは
> GROUP BY 句がないのに ORDER BY で集計関数を使うことはできない
> ではないかと。(これは言うまでもなく正しい)
Oracleなら、
GROUP BY がなくても、ORDER BY で集計関数を使うことはできる。
GROUP BY がない場合に集計関数を使うと1行しか返さないので意味はないが。
SELECT SUM(SAL)
FROM EMP
ORDER BY AVG(SAL)
0686NAME IS NULL
2008/04/04(金) 11:43:16ID:???-------
A, 25日・・・(2/26〜3/25)
B, 15日・・・(2/16〜3/15)
C, 月末・・・(3/01〜3/31)
D, 月末
というようなテーブルと
namae, date, shouhin
-------
A, 2008/03/10, 商品A
A, 2008/03/26, 商品B
B, 2008/03/10, 商品C
B, 2008/03/26, 商品D
C, 2008/03/31, 商品E
D, 2008/03/26, 商品F
D, 2008/04/01, 商品G
というようなテーブルがあって、
3月分で抽出すると
namae, date, shouhin
-------
A, 2008/03/10, 商品A
B, 2008/03/10, 商品C
C, 2008/03/31, 商品E
D, 2008/03/10, 商品F
というようなのを取得するにはどうすればいいのでしょうか。
お願いします。
0687NAME IS NULL
2008/04/04(金) 16:03:57ID:???0688NAME IS NULL
2008/04/04(金) 22:07:14ID:uQGlKR8g0689NAME IS NULL
2008/04/04(金) 22:10:09ID:???0690NAME IS NULL
2008/04/04(金) 22:12:01ID:uQGlKR8gありがとうございました!
0691NAME IS NULL
2008/04/05(土) 00:13:43ID:???namae, shime
-------
A, 25日・・・(2/26〜3/25)
このテーブルには2カラムしかなくて、
1個目のカラムには「A」
2個目のカラムには「25日・・・(2/26〜3/25)」
が入ってるって事?
0692NAME IS NULL
2008/04/05(土) 10:19:46ID:???名前 住所
山田 東京都世田谷区
山田 東京都千代田区
山田 神奈川県横浜市
鈴木 東京都北区
鈴木 東京都葛飾区
というデータがあったとして、
名前 住所
山田 東京都世田谷区、千代田区、神奈川県横浜市
鈴木 東京都北区、葛飾区
上のような出力(もしくは近い形)を得る方法はあるでしょうか?
0693NAME IS NULL
2008/04/05(土) 10:34:38ID:???select
名前
,fnc_xxx(名前)
from
テーブル
group by 名前
みたいに書けば取れる
0694692
2008/04/05(土) 11:50:48ID:???> 名前を元にくっつけた住所を取得するファンクションをあらかじめつくっておいて
これは、
山田 東京都世田谷区東京都千代田区神奈川県横浜市
鈴木 東京都北区東京都葛飾区
というものをあらかじめ作るということでしょうか?
列と行を入れ替えるとか結合で調べたのですが、処理の方法がやはり
よくわかりませんでした
0695NAME IS NULL
2008/04/05(土) 12:18:54ID:???単なるSQLで一発取得は難しいと思う
0696682
2008/04/05(土) 15:37:52ID:???こうやって詰めると
いまいち分かってないですね自分は
ANSIの英語の有料pdfか、よい本か
何かありますか
0697692
2008/04/06(日) 13:49:33ID:???いろいろどうもです。
その部分が一番わからなかったのですが、もうちょっと調べてみます
SQL に固執しないで、Perl で整形する方法も検討してみたいと思います
0698NAME IS NULL
2008/04/06(日) 22:38:07ID:???シングルクォーテーションを二重化したり、色々してますがどれも上手く逝きません。
SQLServer2005です。HELP ME
項目 IN ( CASE @hoge
WHEN 1 THEN 'A'
WHEN 2 THEN 'B'
WHEN 3 THEN 'C,D'
END
)
0699NAME IS NULL
2008/04/06(日) 22:39:08ID:???NGなのは、最後のWHEN 3 THEN 'C,D' でIN句に二つ以上指定する場合です。
0700NAME IS NULL
2008/04/06(日) 22:46:24ID:???@hoge の中に入るのがカラム名なら無理。
素直に複数の SQL を使うか、SQL を組み立てて Exec すれ
0701NAME IS NULL
2008/04/06(日) 22:49:52ID:???or (@hoge = 2 and 項目 = 'B')
or …
0702NAME IS NULL
2008/04/06(日) 22:50:07ID:???そのテーブルに IN (SELECT) したらどう?
0703NAME IS NULL
2008/04/06(日) 22:59:27ID:KZufWnQNレコードがあればTRUEなかったらFALSE返すにはどうすればいいの?
0704NAME IS NULL
2008/04/06(日) 23:06:31ID:???ROWCOUNTが無いならCOUNT(*)を変数に入れて…
て、「こうやってみたけど何が悪いでしょうか」ならともかく
ゼロから手取り足取り、ってスレじゃないだろう。
0705NAME IS NULL
2008/04/06(日) 23:11:38ID:???0706698
2008/04/07(月) 00:16:26ID:???SQL を組み立てて Exec
やはり、それですかねえ・・・。
>>702
テンポラリテーブル
これも検討してみます。
皆さんありがとうございます。
0707NAME IS NULL
2008/04/07(月) 00:28:55ID:???まて、>>701で何が不満なのか教えれ
0708NAME IS NULL
2008/04/07(月) 15:10:51ID:???number, name
--------
1, 名前a
2, 名前b
3, 名前c
と言うようなテーブルがあって
2と3の間に「名前d」を挿入して
number, name
--------
1, 名前a
2, 名前b
3, 名前d
4, 名前c
という風に、任意の場所に挿入してもnumberが1から連番になるようにするには
挿入位置以降のnumberをいちいち書き換えるしかないのでしょうか?
0709NAME IS NULL
2008/04/07(月) 19:49:32ID:???0710708
2008/04/07(月) 20:18:24ID:iZiy2Fgcまた別の要素が必要になってしまいませんか?
0711NAME IS NULL
2008/04/07(月) 21:09:07ID:???てのがよくわからん。
テーブルに「この順番で格納されてます」なんてのは無いぞ。
order by 付けずにselectかければ
取得順番が毎回同じである保障は一切無い
0712NAME IS NULL
2008/04/07(月) 21:13:26ID:iZiy2FgcなのでORDER BY numberにしようかと思っているんですが
末尾追加でなく挿入の場合INSERTの度にnumberを
いちいち書き換えなきゃいけないのか知りたいんです
0713NAME IS NULL
2008/04/07(月) 21:14:52ID:???連番ならそうだね。
0714NAME IS NULL
2008/04/07(月) 21:25:01ID:iZiy2Fgcnumberの割り振りに効率的な方法はありますか?
0715NAME IS NULL
2008/04/07(月) 21:26:09ID:???0716NAME IS NULL
2008/04/07(月) 21:31:01ID:iZiy2FgcROW_NUMBERを使うのであれば
nameの並び順以外の意味はないです
0717NAME IS NULL
2008/04/07(月) 21:31:07ID:???↓
> 末尾追加でなく挿入の場合
末尾とか(行と行の間に)挿入とか、こういう言葉が出てくること自体、
ぜんぜんわかってないから
頭の中がExcelだろ?
0718NAME IS NULL
2008/04/07(月) 21:36:16ID:???そもそもnumberは不要なんじゃないの?
0719NAME IS NULL
2008/04/07(月) 22:01:22ID:iZiy2Fgc教えていただいてるので
頭ごなしに言われるのも仕方ないと思います
すみません
>>718
PHPの添字配列にarray_spliceで挿入するような感じを想定していたんですが
”順序”自体に意味があるので
numberの書き換えで組んでみようと思います
お手数おかけしました
ありがとうございました。
0720NAME IS NULL
2008/04/07(月) 22:03:10ID:???0721NAME IS NULL
2008/04/07(月) 22:07:21ID:???0722NAME IS NULL
2008/04/07(月) 22:08:02ID:???”順序”自体に意味があるなら
それしかないね
0723NAME IS NULL
2008/04/07(月) 22:11:13ID:???帳票の2行目と3行目の間に新たに行を追加したい、とか。
0724NAME IS NULL
2008/04/07(月) 22:23:26ID:???・number付け替えする
の2つしか考えつかね。
0725NAME IS NULL
2008/04/07(月) 22:47:56ID:???それが現実的だろうけどすっきりしないねぇ
採番ロジックの設計からやり直したいところだね
0726NAME IS NULL
2008/04/07(月) 23:28:08ID:???0727NAME IS NULL
2008/04/07(月) 23:28:23ID:???以下のテーブルがあるとします。
Name Age A B
------------
Mike 15 1 2
Mona 19 2 1
Yumi 25 3 4
YUko 30 5 6
Ageが20以下の場合は、Aで昇順ソートして、
21以上の場合は、Bで昇順ソートしたいと考えてます。
このような場合、SQLにするにはどうすればよいでしょうか?
0728NAME IS NULL
2008/04/07(月) 23:30:43ID:???case
0729NAME IS NULL
2008/04/08(火) 00:25:04ID:???Name,
Age
FROM
AGE
ORDER BY
CASE WHEN AGE<=20 THEN A、
ELSE B
END
これでOK?
0730NAME IS NULL
2008/04/08(火) 00:37:55ID:???select Name,Age from
(select Name,Age,case …) a
order by …
とか書かないといけない気もする
0731NAME IS NULL
2008/04/08(火) 01:19:00ID:???ある一つの閉じたシステムで異なるベンダのDBへ
アクセスするなんていうのは普通にあるものなのでしょうか?
たとえば、受注マスタがOracleで発注マスタがSQL Serverだったり。
それをある一つのシステムから使い分けて接続する。
もしあるとした場合の注意点などありますでしょうか。
こういうのをADOが吸収してくれたりするのかな。
0732NAME IS NULL
2008/04/08(火) 01:24:41ID:???複数システムがある時は構成としてはあり得るんじゃないかな。
それぞれにコネクション張るんだから別に問題は無いと思うけど?
0733NAME IS NULL
2008/04/08(火) 01:25:14ID:???つかえるらしい
0734NAME IS NULL
2008/04/08(火) 23:20:15ID:???新規開発案件がSQLServerで、基幹DBがOracleとかよくあるけどね。
レイトバインディングでADOの汎用クラス使って、ベンダの違い意識せず
処理するのが理想だけど、実際のところ速度面やらコーディングのしやすさで無理
0735NAME IS NULL
2008/04/08(火) 23:32:44ID:???結局 SQL の違いが吸収できなかったな・・・
0736NAME IS NULL
2008/04/09(水) 04:34:07ID:???0737NAME IS NULL
2008/04/09(水) 04:34:35ID:???0738NAME IS NULL
2008/04/09(水) 21:57:09ID:???違うところなんて型変換とかだけだろ
0739NAME IS NULL
2008/04/09(水) 22:23:04ID:???0740NAME IS NULL
2008/04/09(水) 22:51:11ID:+aDl/n0V今以下のようなテーブルがあります
地域 県
−−−−−−−−−
東北 0
東北 青森
東北 秋田
東北 宮城
関東 0
関東 東京
関東 埼玉
関東 千葉
東海 0
東海 静岡
・
・
別表で
県 人口
−−−−−−−−−
青森 100000
秋田 150000
宮城 200000
東京 1200000
・
・
長いので続きます
0741NAME IS NULL
2008/04/09(水) 22:53:00ID:???0742740
2008/04/09(水) 22:57:11ID:???地域 県 人口
−−−−−−−−−
東北 450000(東北の総計)
東北 青森 100000
東北 秋田 150000
東北 宮城 200000
関東 2000000(関東の総計)
関東 東京 1200000
関東 埼玉 600000
関東 千葉 700000
東海 1000000
・
・
のような結果を導きたいのです。
ただし内部テーブルとUNIONを使わず、SQLは一回の発行で
行いたいのです。
GROUP BY だと 地域 をキーにするときと
地域 県 をキーにするときとで分かれてしまってこまってます。
どなたかヒントをお願いいたします。よろしくお願いします。
0743NAME IS NULL
2008/04/09(水) 23:02:06ID:???地域 地域の総計 県 県の人口
ならサブクエリで出せる
0744NAME IS NULL
2008/04/09(水) 23:18:51ID:???2個目のテーブルを人口テーブルとして、
A:
地域テーブルと人口テーブルを県名でINNER JOIN して
地域でGROUP BY して地域ごとの人口を出す
地域テーブルに対して
人口テーブルをLEFT OUTER JOIN
結合キーは県
地域テーブルに対して
上記AをLEFT OUTER JOIN
結合キーは地域。
WHERE 地域テーブル.県 = 0
取得項目は
SELECT
地域テーブル.地域
,CASE 地域テーブル.県 WHEN 0 THEN '' ELSE 地域テーブル.県 END
,CASE 地域テーブル.県 WHEN 0 THEN A.人口 ELSE 人口テーブル.人口 END
0745744
2008/04/09(水) 23:20:02ID:???0746NAME IS NULL
2008/04/09(水) 23:21:50ID:???0747740
2008/04/09(水) 23:25:01ID:+aDl/n0V早速明日やってみます。
やっぱり打たないとだめですね。
本当にありがとうございました。
0748NAME IS NULL
2008/04/09(水) 23:34:53ID:???と、何も考えずにレスしてみる
0749744
2008/04/10(木) 00:00:51ID:???0750NAME IS NULL
2008/04/10(木) 00:07:45ID:???でも存在くらいは覚えておこうな
0751NAME IS NULL
2008/04/11(金) 09:21:25ID:???SQLとはちょっと違うのですが、wikipediaの関係代数-商についてです。
http://ja.wikipedia.org/wiki/%E9%96%A2%E4%BF%82%E4%BB%A3%E6%95%B0#.E5.95.86
例として挙げられている
R:
father, mother, child, age (文字列などは略)に対して、
S:
child, age
Maria, 4
Sabine, 2
を計算し、R÷Sを実行すると、
father, mother
Martin, Malanie
が出力されるとあるのですが、
Rの表中には、
child, age
Maria, 4
Sabine, 2
に適合するものとして他に
father, mother
Hans, Helga
Hans, Ursula
があります。
なぜ商としてのR÷Sに、Hans, HelgaやHans, Ursulaが出力されないのでしょうか。
0752NAME IS NULL
2008/04/11(金) 19:07:37ID:???Hans, Helga は Sabine, 2 をもっていないし
Hans, Ursula は Maria, 4 をもっていないから。
0753NAME IS NULL
2008/04/12(土) 01:50:09ID:THUSkmHrツリー型掲示板のメッセージのテーブル「message」
+------+--------------+---------+
|msg_id|msg_id_parent |msg |
+------+--------------+---------+
| 1 | | カキコ |
+------+--------------+---------+
| 2 | 1 | 2GET |
+------+--------------+---------+
| 3 | 2 | 3だよ |
+------+--------------+---------+
| 4 | 2 | >>2 OK |
+------+--------------+---------+
| 5 | 4 | はい |
+------+--------------+---------+
| 6 | | カキコ2 |
+------+--------------+---------+
| 7 | 6 | 2GET |
+------+--------------+---------+
msg_id_parent は、親ノードの msg_id を指す
mdg_id=5,7 のレコードは、自分の下にぶら下がっているコメントなし=ツリーの末端になっている。
msg_id=5のレコードを抜き出す場合、msg_id=5 を msg_id_parent に持つデータがないということを、SQLで表現できれば良いと思いましたが、うまく取得できません。
副問い合わせ(サブクエリー)というのを使う必要があるのでしょうか?
0754NAME IS NULL
2008/04/12(土) 02:23:56ID:???おぼろげながら理解しました。ありがとうございました。
0755NAME IS NULL
2008/04/12(土) 02:30:35ID:???サブクエリまたはNOT EXISTSを使う必要有り。
NOT EXISTSの方が速い。
まあパフォーマンス気にするなら
(かつ参照回数の方が登録回数よりずっと多いのであれば)
末端です、というフラグでも持たせたほうがいいけど。
サブクエリだと
WHERE msg_id NOT IN (SELECT msg_id_parent FROM message)
0756753
2008/04/12(土) 14:47:56ID:THUSkmHrありがとうございます。
そのサブクエリでうまくできました。(・∀・)
参照回数が多いので、木の葉にフラグデータを持たせるやり方を試してみます。
0757NAME IS NULL
2008/04/14(月) 15:32:57ID:???ID STAFFID Num IoType
1 1 50 0
2 1 30 1
3 2 10 0
4 2 15 0
5 2 20 1
6 3 10 0
上記の様なテーブル(iotest)が有ります。
IoType 0=出庫 1=入庫 というフラグです。
これをStaffID毎にSUM集計したいと考えております。
select out_list.staffid, out_list.outsum, in_list.insum, (out_list.outsum - in_list.insum) as Sasi_hiki
from (select staffid, sum(num) as outsum from iotest where iotype = 0 group by staffid) out_list left join
(select staffid, sum(num) as insum from iotest where iotype = 1 group by staffid) in_list
on out_list.staffid = in_list.staffid
order by staffid;
STAFFID OutSum InSum Sasi_Hiki
1 50 30 20
2 25 20 5
3 10 -- --
StaffID=3は、出庫のデータしか無いため、InSumが集計されず、結果として、差引も
計算されません。
Sumで集計された結果が無い場合に0に置き換えて、
STAFFID OutSum InSum Sasi_Hiki
3 10 0 10
とする方法は有りますでしょうか?
0758NAME IS NULL
2008/04/14(月) 15:38:11ID:???DB書き忘れました。
Postgres 8.2.6です。
0759NAME IS NULL
2008/04/14(月) 18:17:22ID:???0760NAME IS NULL
2008/04/14(月) 20:05:18ID:???質問の本質とはズレるけどleft joinはfull joinの間違いじゃないの?
left joinだと入庫だけしたStaffIDが出てこないけど?
で、full joinでいいとすればこんな感じでいいと思う。
select staffid,
sum(case when iotype = 0 then num else 0 end) as outsum,
sum(case when iotype = 1 then num else 0 end) as insum,
sum(case when iotype = 0 then num else -num end) as Sasi_hiki
from iotest
group by staffid
order by staffid
;
0761NAME IS NULL
2008/04/14(月) 21:16:53ID:???>>759
こんな便利なものがあったとは・・・有難うございます
>>760
ご指摘のとおりです。
もちっと精進してまいります
有難うございました
0762NAME IS NULL
2008/04/16(水) 21:10:07ID:???select *
from
( select
case
when a is null then '○'
when r is null then '△'
else '□'
end as result
from d ) as d
としてデータを取得しています。
このとき
where d.result = '○'
とすればデータが抽出されるのですが、
where d.result = '△'
とするとデータが1件も取得できません。
whenの部分を入れ替えてテストして見ると、一番上の値以外は取得できないようでした。
すべての値を取得する方法はないでしょうか?
0763762
2008/04/16(水) 21:11:58ID:???SQL Server 2005になります
0764NAME IS NULL
2008/04/16(水) 21:16:40ID:???select count(*)
from d
where a is not null
and r is null
この結果は?
0765NAME IS NULL
2008/04/17(木) 06:22:59ID:???名前 日付 数字
A 4/1 1
A 4/2 0
B 4/1 1
B 4/2 3
B 4/3 2
というテーブルがあったとき、「各名前の最新の日付のデータ」を
取得するSQL文を教えてください。
この場合は
名前 日付 数字
A 4/2 0
B 4/3 2
こういうデータがほしいです。
0766NAME IS NULL
2008/04/17(木) 06:28:30ID:???>>36
0768NAME IS NULL
2008/04/17(木) 18:38:24ID:???遅くなりました
全データ1000件に対し、27件のデータが取得できました
条件に不備はなさそうな気がします
とりあえず状態を保存するカラムを一つ作成し、そちらを抽出することで対応しました
また他に方法があれば質問させてください
0769NAME IS NULL
2008/04/17(木) 22:36:38ID:9kZUJlvR--------------------
A 青
A 赤
というテーブルがあるとして
列1 列2
----------------------------
A 青・赤
という感じに
特定の列でグループ化し、
残りの列のデータを結合したいのですが、
SQL で可能でしょうか?
0770NAME IS NULL
2008/04/18(金) 00:52:51ID:???なければ似たような関数を自作する
0771NAME IS NULL
2008/04/18(金) 08:57:24ID:hKVau2G80772NAME IS NULL
2008/04/18(金) 16:55:20ID:XTKHrXny日本語カタカナのソートをしようと思い、
select * from テーブル名 order by フィールド名(カタカナしか入っていないフィールド)
とやってみたのですが、うまくなりません。
エンコードはどちらもSJISなのがいけないのでしょうか?
できれば、もうずいぶん作りこんでしまったので、このまま行きたいのですが。。。
宜しくお願い致します。
ちなみにサーバーはさくらインターネットを使っています。
0773NAME IS NULL
2008/04/18(金) 17:08:10ID:???そしてRDBMSはなに?
0774NAME IS NULL
2008/04/18(金) 17:28:16ID:XTKHrXnyすみません。
説明不足でした。
現在MySQLを使用していて、今回ユーザー登録画面を作成して、その登録した情報を一覧で見れるようにしたんです。
そしてそこから名前のソートができる機能を作ろうと思い、登録画面でカタカナで名前を入れていただき、それをDBに保存して、今回のSQL分を打ってみたのですがちゃんと「あ〜ん」の順に並んで表示をしてくれないため困っています。
0775NAME IS NULL
2008/04/18(金) 17:40:59ID:???質問する場合は最低限テンプレに目を通して書式を守りましょう
質問テンプレ
・DBとバージョン
・テーブルデータ
・欲しい結果
・説明
0776NAME IS NULL
2008/04/18(金) 17:48:31ID:???SET CHARACTER SET か SET NAMES で何とかなるかな?
まあMySQL特有の話なんで専門スレ行ったほうがいいかもね。
0777NAME IS NULL
2008/04/18(金) 17:55:22ID:XTKHrXny度々のご指摘申し訳ありません。
・DBとバージョン
mysql 4.1.20
・テーブルデータ
テーブル名 client_data
client_no client_kana_name
----------------------------
1 イソベ
2 アイダ
3 ツヤマ
4 タガワ
5 テライ
・欲しい結果
select * from cilent_data order by cilent_kana_name
と実行してカナ順にソートしようとしているのでが、なぜか
client_no client_kana_name
----------------------------
2 アイダ
3 ツヤマ
1 ウタガワ
5 テライ
4 タガワ
となってしまいます。
ちゃんとソートするにはどうしたらいいでしょうか?
0778NAME IS NULL
2008/04/18(金) 20:12:47ID:???このショートカットに当たる単語って何ていう名前なんでしょうか。
後、このショートカット名に当たる単語が同じものが2つあるんですが、
これって何か不具合になったりしますか?
0779NAME IS NULL
2008/04/18(金) 20:43:35ID:???正しくは「相関名」だけど普通は「別名」と呼ばれていると思う。
同じ相関名を使っても問題ない場合もあるにはあるけど
問題ある場合のほうが圧倒的に多いと思う。
0780NAME IS NULL
2008/04/18(金) 21:04:11ID:???SELECT
A.*
FROM
(
SELECT
A.名前,
MAX(A.日付)
FROM A
GROUP BY
A.名前
)B,
A
WHERE B.名前 = A.名前
AND B.日付 = A.日付
0781NAME IS NULL
2008/04/18(金) 21:07:48ID:???オレはエイリアス(別名)て言ってる。
問題がある場合と問題のない場合がある。
どれがどうとは簡単には言えんが、可読性の面から言って普通はかぶらないようにつけると思う。
0782NAME IS NULL
2008/04/18(金) 23:49:09ID:???元データ
ID 日付 名前
100 2008/04/01 AAAAA
100 2008/04/02 BBBBB
100 2008/04/03 CCCCC
101 2008/04/01 DDDDD
101 2008/04/02 EEEEE
101 2008/04/03 FFFFF
欲しい結果
ID 日付 名前
100 2008/04/03 CCCCC
101 2008/04/03 FFFFF
IDが同じグループで日付が一番大きいものを取得したいです。
よろしくお願いします。
0784778
2008/04/19(土) 00:47:33ID:???0785NAME IS NULL
2008/04/19(土) 00:53:37ID:???オラクルの独自文法で外部結合をあらわす
0786NAME IS NULL
2008/04/19(土) 00:57:00ID:???ありがとうございます。できました。
SELECT A.*
FROM [SELECT ID, MAX(日付) AS 最大日付 FROM A GROUP BY ID]. AS B, A
WHERE (B.ID=[A].[ID]) AND (B.最大日付=[A].[日付]);
0787778
2008/04/19(土) 01:18:19ID:???やっぱり別名の重複に関する事がわかんねぇんですが、
FROM
T_tbl_DTL A,
(
SELECT
A. * ,
procedure1( K_SDATE ) ||'0123' K_F
FROM
Mast_Tbl1 A
) B,
みたいな流れの文法ってOKなんでしょうか、オラクルです。
0788NAME IS NULL
2008/04/19(土) 12:38:37ID:???以下のようなSQLになった場合にAがどちらのAをさしているかパッと見ただけじゃわからないから。
こんな短いSQLだとわかるけどね。
SELECT
A.*
FROM
T_tbl_DTL A,
(
SELECT
A. * ,
procedure1( K_SDATE ) ||'0123' K_F
FROM
Mast_Tbl1 A
) B
WHERE
A.X = B.X
0789NAME IS NULL
2008/04/20(日) 22:38:52ID:???@pal1 = 引き数1
@pal2 = 引き数2
PREPARE tempSql FROM 'select * from t1 where f1 =? or f2 = ?';
EXECUTE tempSql USING @pal1 , @pal2;
PREPAREで?が2個あったら2個ともUSINGで与えないと駄目なんですか?
引き数1,2は両方受け取る、片方だけ受け取る、どっちも渡されないって場合でも動いて欲しいですけど
引き数1だけ受け取ったら
'select * from t1 where f1 = @pal1
引き数2だけ受け取ったら
'select * from t1 where f2 = @pal2
両方渡されなかったら
'select * from t1
という感じにしたいです。
0790NAME IS NULL
2008/04/20(日) 23:02:23ID:???ちなみにPostgres?
0791NAME IS NULL
2008/04/20(日) 23:09:18ID:???動的SQL自体使ったこと無いから書き方は別に出来るかどうか知りたかったので>>789の記述も大よそです
もしかしたらプログラムでwhere文を作ってパラメータにwhere文そのものを渡せば良いかもと思いました
0792NAME IS NULL
2008/04/20(日) 23:15:38ID:???SELECT @sql = 'select * from t1'
IF @pal1 IS NOT NULL
BEGIN
SELECT @sql = @sql + ' where f1 = @pal1'
END
0793NAME IS NULL
2008/04/20(日) 23:21:01ID:???条件が増えてもIF文をその分増やせば良いわけですね
ありがとうございました
0794NAME IS NULL
2008/04/21(月) 04:20:53ID:aI9R1ZkoER図を書けと言われたんですが、selectでひっぱってきているところを線で結べばいいのか、
whereで=でつながれているところを線で結べばいいのか、
外部結合とかをしているところだけ線で結べばいいのか
わからなくなりました。
どんな時に線で結べばいいのですか?
0795NAME IS NULL
2008/04/21(月) 06:05:35ID:???基本的には外部キーを張るところに引くが、
その質問内容からすると全然分かってなさそうなんで
ちゃんと勉強することをお奨めする。
0796NAME IS NULL
2008/04/21(月) 08:13:19ID:aI9R1Zkoすみません、どうもありがとうございます。
データモデリングとかの本を読めばいいんですよね?
0797NAME IS NULL
2008/04/21(月) 18:00:07ID:9zadaJoD0798NAME IS NULL
2008/04/21(月) 19:09:30ID:7qcT8f5NDQN男の家族消えろ DQN男の親消えろ DQN男の友達消えろ DQN男の親戚消えろ
DQN男の家族消えろ DQN男の親消えろ DQN男の友達消えろ DQN男の親戚消えろ
DQN男の家族消えろ DQN男の親消えろ DQN男の友達消えろ DQN男の親戚消えろ
ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・)
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ぬとき このレスの事思い出してくれよ
ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・)
0799NAME IS NULL
2008/04/21(月) 22:58:07ID:???sqlite3 です。
TABLE1
CODE NAME COMMENT
1 KEY HHK
2 MOUSE SAM
3 MONITOR MS
TABLE2
CODE PRICE
1 12000
2 2500
二つのテーブルをまとめて
CODE NAME COMMENT PRICE
1 KEY HHK 12000
2 MOUSE MS 2500
3 MONITOR MS 0
TABLE2 にはデータが不足してたりするので(PRICE)には0をセットした形にしたいです。
select * from TABLE1,TABLE2 group by CODE;
から挫折しております。
0800NAME IS NULL
2008/04/21(月) 23:09:18ID:???Left Join して、 isnull(price, 0) で。
sqlite しらんけど。
0801NAME IS NULL
2008/04/21(月) 23:28:04ID:???FROM TABLE1 LEFT JOIN TABLE2 USING(CODE)
こうかな
0802NAME IS NULL
2008/04/21(月) 23:32:09ID:???あ、ありがとうございます。
left *,ifnull(price,0) from TABLE1 left join TABLE2 using(CODE);
までたどり着きました。
(それなりに表示するけど間違ってるかもしれない)
呪文にしか見えないけど感激っす。
0803NAME IS NULL
2008/04/21(月) 23:34:15ID:???0805NAME IS NULL
2008/04/22(火) 22:22:22ID:???TABLE1.CODE, TABLE1.NAME, TABLE1.COMMENT
ってちゃんと書いたほうがいいってくらいじゃね?
0806802
2008/04/22(火) 22:30:17ID:???あああっ left は何を思って打ったんだろ。ミスでした。
* の処ありがと。
left join はマジ感激。sql って・・・凄い。
このスレを先頭からみてレスしてる文が呪文に見えて理解できないのが一杯あるけどかなり興味でてきた。
0807NAME IS NULL
2008/04/23(水) 00:22:43ID:5eOZ8dG60808NAME IS NULL
2008/04/23(水) 02:22:14ID:???>>801 のSQLは試したのかな?
ifnullって標準じゃないと思うのでcoalesceを覚えておいたほうがいいと思うよ
その調子でSQLのすごさにどんどん気づいていってくれるとうれしいw
0809802
2008/04/23(水) 07:21:28ID:???ああ、801 の直前なのに見逃してる。眠気でボートしてたのか・・・
isnull が sqlite3 で使えなかったので判らないなりに検索したら ifnull が。そう、これは方言っぽいんですね。
ありがとうございます。coalesce 試してまっす。
0810NAME IS NULL
2008/04/23(水) 18:07:16ID:???0811802
2008/04/23(水) 19:30:32ID:???>>808 ありがと。coalesce しっかり頭にはいりました。
select 色々 from TABLE1 left join TABLE2 on ...
までたどり着きました。皆さんからすると入り口の一歩目ですね。
で、今日判ったのは sqlite3 では left , natual 位しかなくて right とかその他のはまだ実装されてない・・悲
そんなんで TABLE1 にしかないキー?は出るけど TABLE2 にしかなかキーはこのままでは出せないって事まで判った。
ところで、スタイル的なところで質問なんですが 大文字と小文字って(見かけ上)気をつけてることってありますか?
キーワードは大文字あるいは小文字とか。。
私はどうも小文字打ちになってしまう傾向にあります。
0812NAME IS NULL
2008/04/23(水) 21:10:12ID:???パフォーマンス絡みで調べてみ。
あと、left join があればright jon はいらんと思う。
0813NAME IS NULL
2008/04/23(水) 21:16:57ID:???えぇっ!?
> left join があればright jon はいらんと思う。
full join は要るだろう。SQLiteでは実装されてないらしいが。
http://www.sqlite.org/omitted.html
0814NAME IS NULL
2008/04/23(水) 21:34:31ID:???0815NAME IS NULL
2008/04/23(水) 21:47:33ID:???0816NAME IS NULL
2008/04/23(水) 21:49:22ID:???半分以上を占めていないと計算が合わんぞ。
100msオーダーのトランザクションシステムとかか?
0817NAME IS NULL
2008/04/23(水) 22:01:06ID:???0818NAME IS NULL
2008/04/23(水) 23:13:14ID:???0819NAME IS NULL
2008/04/23(水) 23:37:12ID:???過剰に気にするほどのもんでもないよね
0820NAME IS NULL
2008/04/24(木) 05:14:25ID:???category, no, name
-----------------
1, 1, AAA
1, 0, BBB
2, 1, CCC
3, 0, DDD
2, 2, EEE
3, 1, FFF
2, 0, GGG
categoryが同じレコードはnoを0から振ってあります
このようなデータで、noが最小値のnameでソートしたいのですが同じcategoryはno順にまとめる必要があります
結果は
1, 0, BBB
1, 1, AAA
3, 0, DDD
3, 1, FFF
2, 0, GGG
2, 1, CCC
2, 2, EEE
となるのが希望です
どのようにSQLを書けばよいのでしょうか
0821NAME IS NULL
2008/04/24(木) 06:05:42ID:???サブクエリが使えない4.0なのか、使える4.1なのかはっきりした方がいいんじゃね。
4.0ならたぶん無理。4.1なら可能だと思うけど...。
0822NAME IS NULL
2008/04/24(木) 06:11:27ID:???「noを0から振って」ってあるので少なくとも0はあるというのを前提に書くと。
SELECT * FROM Table AS T1 ORDER BY (SELECT name FROM Table WHERE category=T1.category AND no=0),no;
0823820
2008/04/24(木) 08:40:03ID:???>>822さんのSQLで希望の結果が出せました
ありがとうございました
0824NAME IS NULL
2008/04/24(木) 12:59:17ID:???SQL文は大文字で書く癖を付けておくと、
JSP/ServletなどでjavaからSQL文を発行するときに目印になる。
個人でやるならどっちでもいいけどね。
0825NAME IS NULL
2008/04/24(木) 13:21:09ID:???TableAとTableBの内容はお互いに関係性は無いのですが、これらを
1つの表として取得することは可能でしょうか?
TableA
時間A:datatime
内容A:nvarchar(5)
TableB
時間B:datatime
内容B:nvarchar(10)
下のような表として得たい
時間 , 内容
---------------
時間A , 内容A
時間B , 内容B
: :
0826NAME IS NULL
2008/04/24(木) 13:40:43ID:???普通にunion allすればおkじゃね?
0827NAME IS NULL
2008/04/24(木) 18:02:50ID:???0828802
2008/04/24(木) 18:36:34ID:???>>812 なるほど。いずれ RIGHT JOIN が今の私に必要とするシーンがくるのかなぁ。
>>824
キーワードは大文字・守・でいきまふ。Java でなく C++ からの呼び出しなので視覚的にぱっと引きますね。趣味の域だけど先輩方のスタイル少しでも学んで自分の物にしていきたいっす。
今日も DB 作ってみては壊したり。ふぅ。
0829NAME IS NULL
2008/04/24(木) 19:37:09ID:???0830NAME IS NULL
2008/04/24(木) 19:43:08ID:???0831NAME IS NULL
2008/04/24(木) 20:22:11ID:???0832NAME IS NULL
2008/04/24(木) 20:25:47ID:Vw4Ukrq3name reg_date installed_appls
taro 2008/04/11 excel
taro 2008/04/11 word
hanako 2008/04/11 excel
hanako 2008/04/11 word
hanako 2008/04/11 powerpoint
jiro 2008/04/11 excel
jiro 2008/04/11 word
taro 2008/04/13 excel
taro 2008/04/13 word
hanako 2008/04/13 excel
hanako 2008/04/13 word
hanako 2008/04/13 powerpoint
jiro 2008/04/13 excel
jiro 2008/04/13 word
jiro 2008/04/13 powerpoint
taro 2008/04/14 excel
taro 2008/04/14 word
jiro 2008/04/14 excel
jiro 2008/04/14 word
欲しい結果
name reg_date installed_appls
hanako 2008/04/13 excel
hanako 2008/04/13 word
hanako 2008/04/13 powerpoint
taro 2008/04/14 excel
taro 2008/04/14 word
jiro 2008/04/14 excel
jiro 2008/04/14 word
説明は次へ
0833NAME IS NULL
2008/04/24(木) 20:27:06ID:Vw4Ukrq3インストール済ソフトの一覧を送るようにしております。
それにより上の元データが作れられていくわけですが
ここより
「ユーザ毎に 最後の日付で インストールされていたソフト一覧」
を呼び出したいのですがあれこれ試してみようとしたのですが…
うまい方法が思いつかず><
よろしくお願いいたします。。。
0834NAME IS NULL
2008/04/24(木) 20:28:33ID:???>>35-36
エスパーレス、、、間に合わず
0835NAME IS NULL
2008/04/24(木) 21:23:18ID:???group byとorder
0836NAME IS NULL
2008/04/24(木) 21:55:20ID:???mysql触ったこと無いけどこれ通るかな?
実行確認はしてないのでよろ。
SELECT
A.NAME,
A.REG_DATE,
A.INSTALLED_APPLS
FROM TABLE A,
(
SELECT
B.NAME,
B.INSTALLED_APPLS,
MAX(B.REG_DATE) AS MAX_DATE
FROM TABLE B
GROUP BY
B.NAME,
B.INSTALLED_APPLS
)C
WHERE A.NAME = C.NAME
AND A.INSTALLED_APPLS = C.INSTALLED_APPLS
AND A.REG_DATE = C.MAX_DATE
ORDER BY
A.REG_DATE,
A.INSTALLED_APPLS,
A.NAME
0837NAME IS NULL
2008/04/24(木) 23:47:46ID:???SELECT
A.NAME,
A.REG_DATE,
A.INSTALLED_APPLS
FROM TABLE A,
(
SELECT
B.NAME,
MAX(B.REG_DATE) AS MAX_DATE
FROM TABLE B
GROUP BY
B.NAME
)C
WHERE A.NAME = C.NAME
AND A.REG_DATE = C.MAX_DATE
ORDER BY
A.NAME,
A.REG_DATE,
A.INSTALLED_APPLS
なんとなくこっちを欲してそうに思った。
できればこの二つの違いが何かを考えてみて欲しいです。がんばれー。
0838802
2008/04/25(金) 07:04:47ID:???質問主ではないけど、そのソースは凄く刺激ある。帰ったらじっくり眺めて動かしてみよ。FROM の処にさらに (SELECT ... )C と書けるのか。凄いなぁSQL。
0839NAME IS NULL
2008/04/25(金) 07:42:04ID:???0840NAME IS NULL
2008/04/25(金) 07:53:28ID:???まあいいじゃん。
せっかく興味がわいてるっぽいんだから、それでいいとおもう。
0841NAME IS NULL
2008/04/25(金) 11:16:36ID:???0842NAME IS NULL
2008/04/25(金) 12:50:16ID:???0843NAME IS NULL
2008/04/25(金) 14:01:05ID:???あなたがすごいと思ってるものは他の誰かにとってはすごくない。
むしろしょぼすぎてため息すら出るかもしれない。
そう考えると、それ、すごいか?というレスは容易にできないよね。
単に、一見タダのサブクエリに見えるが実はすげえテクニック使ってんのか?
と思ってしまってるのなら、そんな事は無くタダのサブクエリです、と回答しとく。
0844NAME IS NULL
2008/04/25(金) 20:39:29ID:???0845NAME IS NULL
2008/04/25(金) 21:10:20ID:???0846NAME IS NULL
2008/04/25(金) 21:12:46ID:???0847NAME IS NULL
2008/04/26(土) 01:10:15ID:???0848NAME IS NULL
2008/04/26(土) 03:12:14ID:???0849NAME IS NULL
2008/04/26(土) 13:01:58ID:???0850NAME IS NULL
2008/04/26(土) 21:13:47ID:???よろしくお願いします。
セッションという概念がわからないので教えてください。
CGIプログラムとしてRuby PostgreSQLを使用しています。
1. 変更するデータをチェック(SELECTで取り出しRuby上で判断)
2. 変更していいなら変更、変更がだめだったらROLL BACK
3. その中でnextval、currvalなんかも使ったり。
と、いうことをしています。
で、1と2をやるのにBEGIN、COMMIT、ROLLBACKを使おうと思うのですが
これってPGConn.queryでSQLを発行してその結果をRubyでごりごりして
また、queryでSQL発行して、COMMITしてもその間はアトミックに操作が行われることが保証されるのでしょうか。
ついでに3のnextval、currvalに関するセッションの寿命に関しても答えてくださると幸いです。
0851850
2008/04/26(土) 21:14:25ID:AyuoAKFV0852NAME IS NULL
2008/04/26(土) 22:18:21ID:???DBの原子性でぐぐりなさい
0853NAME IS NULL
2008/04/26(土) 22:20:02ID:???セッションていうかトランザクションだな。
で、前者はYES。
後者は、nextvalで取り出したけど使わなかった番号は欠番になる。
(rollbackされない。)
0854NAME IS NULL
2008/04/27(日) 13:44:28ID:???SELECT * WHERE id=1 FROM table
で、id=1のものは何個あるか?といった事が調べたいのですが。
0855854
2008/04/27(日) 13:44:49ID:B1ZiztAB0856NAME IS NULL
2008/04/27(日) 13:45:27ID:???select count(*)
0857NAME IS NULL
2008/04/27(日) 13:49:03ID:???おーい、それだとSQL文がエラーでるよ。
SELECT * FROM table WHERE id=1;
SELECT、FROM、WHERE は順序は崩してはいけない。
0858NAME IS NULL
2008/04/27(日) 13:50:57ID:B1ZiztAB使ってみます。
ありがとうございます。
>>857
久しぶりに書いたんで、すっかり忘れてました。
ありがとうございました。
0859NAME IS NULL
2008/04/27(日) 13:52:19ID:???見た方が早いぞ。
0860NAME IS NULL
2008/04/27(日) 13:54:47ID:???0861NAME IS NULL
2008/04/27(日) 13:55:14ID:???0862NAME IS NULL
2008/04/27(日) 14:00:07ID:???0863NAME IS NULL
2008/04/27(日) 15:54:02ID:Tqt++e11すごい初歩の質問なんだけど、
select * from web where name ='2chan' and category = '2chan' and type = '2chan'
って感じで、同一単語(2chan)を検索したいんだけど、
where以降を縮める方法ってないですか?
PHPのifみたいにフィールド名括弧で括って
(〜and〜)='2chan'
てやってもだめだし・・・。
初歩すぎるのか探してもなかなか見つからない。
0864NAME IS NULL
2008/04/27(日) 16:04:11ID:???where name = '2chan'
and name = category
and category = type
とは書けるけど、あんまり短くならんね。
select * from web
where name + category + type = '2chan2chan2chan'
とか?w
0865NAME IS NULL
2008/04/27(日) 16:23:34ID:Tqt++e11あー、やっぱないんですね。
できればlikeでも使用したいんですが・・・。
(name & category & type) = '2ch'
とか、なんでできないんだろ・・・。
結構ニーズあると思うんだけど。
0866NAME IS NULL
2008/04/27(日) 16:59:23ID:???一般的で、そうなると、それぞれのカラムを同一条件で検索したいと
いうことはあまり無いかなぁ?
たとえば複数のbool型のカラムがあったとして、すべてtrueのものを
抽出する場合でも、やっぱり個別に書く方が分かりやすいと思う。
それぞれのカラムにキーワードが高々1回しか出てこないのであれば
where name || category || type like '%2ch%2ch%2ch%'
と書くことで記述方法におけるニーズを割と満たしていると思うけど
テーブル設計を見直してみると別の解決ができるかもですよ。
0867866
2008/04/27(日) 17:06:13ID:???作ることを検討してみては?
0868NAME IS NULL
2008/04/27(日) 17:15:48ID:???手元の資料では
select * from web where '2chan' = ALL(name,category,type);
でいけるはずだけど、MySQLでは無理なのかな?
0869NAME IS NULL
2008/04/27(日) 17:35:49ID:???標準SQLでは
select * from web where (name, category, type) = ('2chan', '2chan', '2chan');
となら書けることになってるけど。
0870NAME IS NULL
2008/04/27(日) 17:43:01ID:???オラクルが同じ名前で方言を作るとも考えにくいんだけど、どうなんでしょ?
0871NAME IS NULL
2008/04/27(日) 18:03:47ID:???select * from web where '2chan' in (name , category , type);
0872NAME IS NULL
2008/04/27(日) 18:07:29ID:???それだと、name、category、type のどれか、じゃね?
0873NAME IS NULL
2008/04/27(日) 18:08:14ID:???それだと or になってしまう
↓と同じことになるよ
select * from web where name ='2chan' or category = '2chan' or type = '2chan'
0874NAME IS NULL
2008/04/27(日) 18:09:04ID:???0875NAME IS NULL
2008/04/27(日) 18:09:47ID:???0876NAME IS NULL
2008/04/27(日) 18:15:13ID:Tqt++e11たとえば掲示板に検索フォームを設置し、
検索対象はタイトル・本文・記入者の3つ。
掲示板テーブルの title text name の3つのカラムを対象に
それぞれ同じ単語のwhere句を作成するってなこと結構ありませんか?
この場合
(title & text & name) like '%$search_word%'
こんな感じにできるのが当たり前だと思ってました。
0877869
2008/04/27(日) 18:21:47ID:???ALLって標準SQLにもあったのか。
慌てて調べたけど>>868はやっぱOracle特有だった。
標準SQLではvaluesが要る。
select * from web where '2chan' = all (values name, category, type);
0878866
2008/04/27(日) 18:30:49ID:???個人的には、タイトル、本文、記入者のいずれかにキーワードが
含まれている記事を抽出されるほうがうれしいかな。
「奈」という字が姓名両方に含まれる人よりも、姓、名のどちらかに
含まれる人を探したいというか。
もうちょっと状況が詳しく分かると、よりよい解決方法が出てくるかも
しれないです。
0879NAME IS NULL
2008/04/27(日) 18:45:46ID:Tqt++e11おお、これは・・・。likeにも使えますか?
>>878
すみません、&じゃなくてorですね。間違えてました。
(title or text or name) like '%$search_word%' こうですね。
あきらめて個々に書くのが正解なんでしょうか。
0880869
2008/04/27(日) 18:53:47ID:???ああ、すまん、個人的な興味で調べただけで、
質問の答えを考えていたわけじゃないんだ。
で、>>877はlikeには使えない。
やりたいことへの答えとしては、素直に
title like '%$search_word%' or text like '%$search_word%' or name like '%$search_word%'
と書くべきだと思う。
0881NAME IS NULL
2008/04/27(日) 18:59:39ID:???871です。
指摘のとおりですね
thx.
0882868
2008/04/27(日) 19:08:39ID:???情報ありがとうございます
valuesを追加しましたけど、MySQL5.0.45では
ERROR 1064 (42000): You have an error in your SQL syntax; でした
select * from web where '2chan' = ANY (values name, category, type);
も同じくだめでした
ALLの()の中身をサブクエリでなら使ったことがあるんですが、この手のはだめみたいですね
0883NAME IS NULL
2008/04/27(日) 19:13:32ID:Tqt++e11そうですかー。
ありそうでないですね。ありがとうございます。
見逃してましたが
>>871さんのもかなりいい感じですね。
likeに対応してれば完璧なんですが・・・。うう。
その他答えてくださったみなさんも本当にありがとうございます。
0884866
2008/04/27(日) 19:30:13ID:???え、、、orでいいのか。。。
じゃあ
where name || category || type like '%2ch%'
これでだめ?
0885NAME IS NULL
2008/04/27(日) 20:21:23ID:Tqt++e11それは出来ると思って前に試したんですけど、ダメでした。
文法的には有りなんでしょうか?
今試したんですけど、
title like '%$search_word%' or text like '%$search_word%' or name like '%$search_word%'
これと同等の結果は得られないみたいです。
0886866
2008/04/27(日) 23:01:00ID:???やりたかった事は各カラムを文字列連結してlikeしたかっただけです。
MySQLだと、
where concat(name, category, type) like '%2ch%'
と書く必要があったようです。
PostgreSQLだと || が文字列結合になるので、その意識のまま
書いてました。
0887866
2008/04/27(日) 23:05:28ID:???返却するようですので、NULL可のカラムがある場合はすべてcoalesceで
はさむことになると思います。
where concat(coalesce(name, ''), coalesce(category, ''), ... like '%2ch%'
こうなると本末転倒になるかもしれないですね。。。
0888NAME IS NULL
2008/04/28(月) 15:58:50ID:???>>837
書き込み制限がありお返事があり申し訳ありませんでした><
サブクエリーってこういう場合に使うんですねぇ…とかなり勉強になりました^^;
ありがとうございますー。
今後、お教えいただいたことを応用できるよう勉強させてもらいます。
0889NAME IS NULL
2008/04/29(火) 16:10:27ID:???というプログラムのうち、FROMとWHEREに*を指定する事はできないでしょうか?
やってみると何も帰ってこなくなるので、恐らくエラーになっているのだと思うのですが・・・。
0890NAME IS NULL
2008/04/29(火) 16:14:24ID:???できるわけないだろ。
基本を勉強しろよ
0891NAME IS NULL
2008/04/29(火) 16:23:12ID:???検索プログラムを作っているのですが、全てのテーブル、フィールドから指定したキーワードを含む文字だけを抜き出す方法が分からないんです。
0892NAME IS NULL
2008/04/29(火) 16:30:08ID:???そういうのは、SQL でなくて、フルテキストとか使いましょう。
SQL でやりたいのであれば、すべてのテーブルのすべてのフィールドに対して
それぞれ指定する必要があります。
0893NAME IS NULL
2008/04/29(火) 16:35:17ID:???全てのテーブル、フィールドに対して指定するとのことですが、こういう事でしょうか?
select * from テーブル1,テーブル2,テーブル3,テーブル4, where ID=1;
0894NAME IS NULL
2008/04/29(火) 16:37:10ID:???それだとかけ算になっちゃうけどいいの?
あと、フィールドがひとつしか指定されてない。
0895NAME IS NULL
2008/04/29(火) 16:42:29ID:???検索するとテーブルはカンマ(,)で区切るとあったのですが、もしかして間違っているでしょうか?
フィールドは忘れていました。
0896NAME IS NULL
2008/04/29(火) 16:47:25ID:???検索って何? まずは、SQL の本でも読んで勉強することをおすすめするよ。
テーブル間の関係が記述されていないので、期待通りの結果はかえって
こないと思われ。
0897NAME IS NULL
2008/04/29(火) 19:20:23ID:8694Hlr5>>887
866さん返信が遅れてすみません。
具体的なアドバイスありがとうございます。
NULL可・不可を分ける必要があっても今後十分使えそうです。
非常に参考になりました。
ご丁寧な回答本当にありがとうございました。
0898NAME IS NULL
2008/04/30(水) 00:48:46ID:???亀&スレチですまんが、ID出すか出さないかって書き込む人が任意に選べるもんなの?
0899NAME IS NULL
2008/04/30(水) 00:51:06ID:???さげないで書き込んでみ?
0900NAME IS NULL
2008/04/30(水) 06:55:34ID:moNZ8oAl0901NAME IS NULL
2008/04/30(水) 12:24:38ID:???0902NAME IS NULL
2008/04/30(水) 13:21:23ID:???コード | 項目1 | 項目2 | 項目3
──────────────────────
111 | ○ | ○ | ○
──────────────────────
111 | | △ |
──────────────────────
111 | | | ×
──────────────────────
222 | | ○ |
──────────────────────
222 | | | △
──────────────────────
とういうテーブルを
コード | 項目1 | 項目2 | 項目3
──────────────────────
111 | ○ | ○(改行)| ○(改行)
| | △ | ×
──────────────────────
222 | | ○ | △
──────────────────────
というように、コードでグループ化し、それ以外の項目は各値を改行で繋いで表示したいです。
どのようなSQLを書けば良いでしょうか?
0903NAME IS NULL
2008/04/30(水) 14:47:12ID:???SQLでなんとかするってレベルの話じゃねーぞ
普通にOrder byで前者の順で得たレコードを、
ホスト言語側で後者のように整形して表示してやればいい
どーしてもストアドだけでやりたいんなら、
ここでの質疑応答だけで解決すんのは無理
0904902
2008/04/30(水) 15:53:55ID:???実際に今はVisualStudio2005を使用していて、画面表示にはFlexGridを、印刷にはCrystalReportを用いています。
仰るとおりに画面側も帳票側も出力時に整形しています。
画面側では、セルのマージとかやっていますが、もうちょっとスマートに扱いたいなと思った次第です。
ありがとうございました。
0905NAME IS NULL
2008/04/30(水) 21:31:23ID:???以下の問合わせ方法が実現できそうであれば、
ご教授よろしくお願いします。
<テーブルデータ>
id | seq_id | room
-----------------------
1 | 1 | ○○ビル102
2 | 2 | △△ビル302
3 | 3 | ××ビル102
3 | 4 | ××ビル501
3 | 5 | ××ビル703
4 | 6 | □□ビル202
<欲しい結果>
id | room1 | room2 | room3
----------------------------------------
1 | ○○ビル102 |
2 | △△ビル302 |
3 | ××ビル102 | ××ビル501 | ××ビル703
4 | □□ビル202 |
単純な問合わせしか分からないSQLの初心者です。
副問合わせ、自己結合、CASE式などを勉強しつつ
3日間程考えたのですが、応用が利かないタイプな上、
他のサンプルなどと合わせようとしても合いませんでした。
よろしくお願いします。
0906NAME IS NULL
2008/04/30(水) 22:12:35ID:???列の数が可変な問合せはできない
0907NAME IS NULL
2008/04/30(水) 22:39:24ID:???RDBMSごとに提供具合が異なるかと。
0908NAME IS NULL
2008/04/30(水) 23:27:44ID:???SQL以外の言語にも経験あるみたいだから、やりゃーできるんじゃねーの。
declare cursor fast_forward for select * from xxx order by コード asc から
fetch next しながら各項目の文字列をつないでいく。コードがブレークしたら insert。
それを table-valued function の中でやればいい。スマートと言うかは疑問だがw
0909NAME IS NULL
2008/04/30(水) 23:46:14ID:???No | D1 | C1
このレコードで
TABLE2
No | D1 | New1 | C1
としいう形に作り直したいですが (New1 = NULL)
始めたばかりでSQL 文でうまく実現する方法が・・・
これまでやってみたこと
SELECT No,'NULL,'D1,C2 FROM TABLE1;
希望する並びに(近い?)形で表示はできたのですが、TABLE2 に持っていく方法が断念です。Help
0910NAME IS NULL
2008/04/30(水) 23:47:04ID:???INSERT INTO SELECT
0911NAME IS NULL
2008/04/30(水) 23:58:43ID:???ヒントありがとうございます。できるという空気は感じましたが全体の文がつかめてないっす。今、その答えを聞くのは簡単だけど・・一日粘ってきます。ありがとうございます。
0912905
2008/05/01(木) 00:57:07ID:+1kXGQKNありがとうございます。
列が可変になると駄目なんですね…
勉強になりました。
>>907
ありがとうございます。
SQLでまともな問い合わせも出来ないので、
ストアドファンクションを考えても見ませんでしたが、
この機会に少し見てみることにします。
0913NAME IS NULL
2008/05/01(木) 01:45:37ID:???INSERT INTO TABLE2
SELECT
T1.No,
T1.D1,
null AS New1,
T1.C1
FROM TABLE1 T1
0914NAME IS NULL
2008/05/01(木) 09:52:23ID:???テーブルを新規に作っちゃうんですね。参考になりました。�d
0915902
2008/05/01(木) 09:59:15ID:???そのようにカーソルを使って Fetch Next しながら云々ももちろん考えました。
ただ、なんとか Select 文の工夫だけでできないものかと思っただけです。
ありがとうございました。
0916NAME IS NULL
2008/05/01(木) 12:40:44ID:???自分で TABLE1 と TABLE2 って名前変えてるんだから新規に作ると思うだろ常考
そのテーブルにカラム追加したいなら alter table 使え。
New1 を D1 と C1 の間に入れたいのかも知れないが、
RDBではカラムの順序にはデータ構造上の意味は何もない。
0917NAME IS NULL
2008/05/01(木) 13:49:11ID:/NYPxvw/このようなSQLの実行に、すごく時間がかかった時は、
curtime()の値も変わるのでしょうか?
一度だけ実行されるのか、
何度も実行されるのか…という疑問です
0918NAME IS NULL
2008/05/01(木) 17:55:01ID:???今帰ってきました。ほしたら答えが・・・ありがとうございます。
といいつつも文の内容の十分な理解はできてません。
今、このソースを打ち込んでばっちしな結果なんですけどだまされた気分になっているは否めません。
しかし今日のこれは私にとってとても大きいです。調べよって言われるとそれまでだけど・・・
>>916
SQLite3 なんですが alter table ・・・あった。(というか最近のバージョンで実現?)
始めたばかりもあるのかカラムの並びちょっと気に掛かってました。それよりも INSERT INTO TABLE1 .. の後に VALUES しか知らなかったのでそれはそれで新鮮です。
0919NAME IS NULL
2008/05/02(金) 04:14:03ID:gmzuFZbLphpからmysqlを操作しようとしているのですが、
Host is not allowed to connect to this MySQL server
が表示されてしまい、ブラウザにテーブルがでてきません。
どなたか、アドバイスいただけますでしょうか。
宜しくお願いします。
0920NAME IS NULL
2008/05/02(金) 07:32:58ID:???0921NAME IS NULL
2008/05/02(金) 07:36:37ID:???1. サーバーの設定を見直す
2. スレ違い
0922NAME IS NULL
2008/05/02(金) 12:17:54ID:6LOyzsRHコマンドライン操作にイライラ。
GUI操作するための、toolとかってありますか?
0923NAME IS NULL
2008/05/02(金) 12:43:39ID:???なんでMySQLスレに行かないんだろ。
MS-ACCESSでデータ変更はできると思うし、CSEで任意のSQL投げられるんじゃなかった?
0924NAME IS NULL
2008/05/02(金) 14:06:33ID:???ここはSQLのスレで、MySQL固有の話はスレ違い。
環境晒してMySQLのスレで聞いてみ、答えてもらえるかもよ。
0925922
2008/05/02(金) 14:42:37ID:???MySQL == SQLはfalseだったのです。
0926NAME IS NULL
2008/05/02(金) 14:54:16ID:???0927NAME IS NULL
2008/05/02(金) 18:08:37ID:???GUIとまではいかないが、CSEを使えば多少はわかりやすいでしょう。
CSEで検索すればすぐに出てくる。
0928NAME IS NULL
2008/05/02(金) 18:58:04ID:???0929NAME IS NULL
2008/05/02(金) 22:14:44ID:???ACCESSでいいんじゃね
0930NAME IS NULL
2008/05/03(土) 05:32:42ID:???0931NAME IS NULL
2008/05/03(土) 18:19:52ID:???商品をオススメ順に並べられるようにオーダーキーを用意しています。
オーダーキーは数値型で、商品登録時にインクリメントして入れて、並べ替え画面で入れ替えています。
商品種別自体は200種類もありませんが、商品入れ替え(削除)が頻繁に予想されるので、
何年か使用するうちにと歯抜けだらけでオーダーキーが桁あふれする事が心配です。
そこでオーダーキーのリナンバーを考えているんですが、
1. 商品IDとオーダーキーを保持するテンポラリテーブルを用意する(オーダーキーはオートナンバー型)
2. 商品マスタからオーダーキー順に商品IDを挿入
3. テンポラリテーブルのに出来た新オーダーキーで商品マスタのオーダーキーを更新
4. テンポラリテーブルをドロップ
と言う方法を考えたんですが、もっとシンプルな良い方法がありそうな気もします。
なにかもっと良い方法がありましたら教えていただけないでしょうか?
0932NAME IS NULL
2008/05/03(土) 18:40:44ID:???0933NAME IS NULL
2008/05/04(日) 12:39:44ID:???0934NAME IS NULL
2008/05/04(日) 14:11:17ID:???0935NAME IS NULL
2008/05/06(火) 11:07:17ID:???a varchar(10),
b int
)
で、b の値は基本的にテーブル内でユニークなんですが、まれに他の列の値と重複します。
b がユニークでない列を delete 一発ですべて削除できますか?
たとえば b=999 が 2列あるとき 2列とも削除したいです。
0936NAME IS NULL
2008/05/06(火) 11:26:40ID:???delete from tbl
where b in (
select b from tbl
group by b
having count(b) > 1)
こんなんでどう?
0937NAME IS NULL
2008/05/06(火) 11:48:21ID:???0938NAME IS NULL
2008/05/06(火) 17:47:40ID:???片方を残さずdeleteするってことはダブってinsertされるデータは許されないってことじゃないか?
0939935
2008/05/06(火) 18:02:54ID:???havingを使ったことがなく、ましてそこに count関数を書けるとは知りませんでした。
テーブルのデータは自分が関与できない他システムから CSVファイルで渡ってきて、
それを bcpでロードしてます。unique制約つけるとデータ全体がロードされなくなります。
0940NAME IS NULL
2008/05/06(火) 18:22:26ID:???bcpってSQLServer?
よく知らんけどエラー許容数とかエラーファイルとか指定できないの?
0941NAME IS NULL
2008/05/07(水) 19:51:44ID:???日付型データと数値データを繋げて、
さらにそれを数値データにしたいのですが、
(例→2008-05-07 と 01 で 2008050701)
TO_NUMBER(TO_CHAR(日付データ) || TO_CHAR(数値データ))
としたら、「数値が無効です」とエラーが出ます。
何が問題なのかまったくわかりません。
どなたか教えて下さい、よろしくお願いします。
0942NAME IS NULL
2008/05/07(水) 20:00:52ID:???まずは、
SELECT TO_CHAR(日付データ)
SELECT TO_CHAR(数値データ)
としてみて、次に
SELECT TO_CHAR(日付データ) || TO_CHAR(数値データ)
としてみて、最後に TO_NUMBER() すれ。デバッグの基本じゃね?
0943941
2008/05/07(水) 20:08:21ID:???レスありがとうございます。
色々あって、プログラミングの勉強開始1ヶ月で実務をやっていて、
基本すら知りませんでした。不勉強なせいでお時間取らせてしまい、すみません。
何が問題なのかわからない場合は、一度解体してそれぞれでやってみて、
どの部分に問題があるのか探す、という理解でよろしいでしょうか?
明日にでも、もう一度試してみます。
どうもありがとうございました!
0944NAME IS NULL
2008/05/07(水) 20:43:35ID:???次スレはこちら
http://bubble6.2ch.net/test/read.cgi/cafe50/1141039267/
0945NAME IS NULL
2008/05/07(水) 21:03:01ID:???0946NAME IS NULL
2008/05/07(水) 23:45:38ID:???よく切れるナイフみたいなもんで、うまく使えば有用だがそうでないと・・・
>>944 死ね
0947NAME IS NULL
2008/05/07(水) 23:57:58ID:???0948NAME IS NULL
2008/05/08(木) 09:08:28ID:???0949NAME IS NULL
2008/05/08(木) 12:20:28ID:???0950NAME IS NULL
2008/05/08(木) 20:18:42ID:???0951NAME IS NULL
2008/05/08(木) 20:27:10ID:???0952NAME IS NULL
2008/05/09(金) 10:11:03ID:???0953NAME IS NULL
2008/05/09(金) 12:19:56ID:???ものを指定したいのですが、できません。(右カッコがないと言われる)
どうすればいいのか、アドバイスお願いします。
INSERT INTO &&TABLENAME.(NUMBER,CODE,KNUMBER,SCODE,KOSU,MONE)
SELECT T.NUMBER
,I.CODE
,I.KNUMBER
,I.SCODE
,SUM(I.KOSU)
,SUM(I.MONE)
FROM IPO I
,TAIN T
WHERE I.CODE = T.CODE
AND I.KNUMBER = T.KNUMBER
AND I.TIME > T.TIME
HAVING I.TIME = MIN(I.TIME > T.TIME)
GROUP BY T.NUMBER
,I.KNUMBER
,I.SCODE
0954NAME IS NULL
2008/05/09(金) 12:37:37ID:???0955NAME IS NULL
2008/05/09(金) 12:44:25ID:???果物と肉類は 食品
その他は 非食品
として、それぞれの数を出したいのですが
分類 商品
果物 みかん
果物 りんご
果物 みかん
肉類 サーロイン
肉類 サーロイン
肉類 牛たん
家具 ソファー
家具 ベッド
文具 鉛筆
0956NAME IS NULL
2008/05/09(金) 12:45:09ID:???では、どうすればいいんでしょう…。
お手上げです。
0957NAME IS NULL
2008/05/09(金) 12:50:53ID:???hogehoge = I.TIME > T.TIME
MIN(hogehoge)
でどう?
0958NAME IS NULL
2008/05/09(金) 12:54:17ID:???・食品
SELECT COUNT(*) FROM table
WHERE 分類 = '果物' OR 分類 = '肉類'
・非食品(果物でも肉類でもないもの)
SELECT COUNT(*) FROM table
WHERE 分類 != '果物' AND 分類 != '肉類'
0959NAME IS NULL
2008/05/09(金) 12:59:11ID:???ありがとうございます、やってみます。
hogehoge = i.time > t.timeってのは
普通どこで指定しておくものなんですか?
0960NAME IS NULL
2008/05/10(土) 11:57:45ID:72o5h6vwselectにあってgroup byにないカラムがあったので、てきとー
INSERT INTO &&TABLENAME.(NUMBER, CODE, KNUMBER, SCODE, KOSU, MONE)
WITH TBL AS
(
SELECT T.NUMBER, I.CODE, I.KNUMBER, I.SCODE, I.TIME, I.KOSU, I.MONE
FROM IPO I
INNER JOIN TAIN T ON I.CODE = T.CODE AND I.KNUMBER = T.KNUMBER AND I.TIME > T.TIME
)
SELECT NUMBER, CODE, KNUMBER, SCODE, SUM(KOSU), SUM(MONE)
FROM TBL TBL1
WHERE TIME = (SELECT MIN(TBL2.TIME)
FROM TBL TBL2
WHERE TBL2.NUMBER = TBL1.NUMBER
AND TBL2.CODE = TBL1.CODE
AND TBL2.KNUMBER = TBL1.KNUMBER
AND TBL2.SCODE = TBL1.SCODE
GROUP BY TBL2.NUMBER, TBL2.CODE, TBL2.KNUMBER, TBL2.SCODE)
GROUP BY NUMBER, CODE, KNUMBER, SCODE, TIME
ダメだな、おれ
共通テーブル式使ってるし、相関クエリ使ってるし、動かしてないし。。。
0961NAME IS NULL
2008/05/10(土) 12:09:37ID:???orz
0962次スレ用FAQテンプレ書いてみた
2008/05/10(土) 19:21:49ID:???(問)
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
;
0963次スレ用FAQテンプレ書いてみた
2008/05/10(土) 19:23:19ID:???(問)
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
;
0964NAME IS NULL
2008/05/13(火) 22:07:22ID:???ちょうど欲しいと思ってた
・MySQL 4.0.27
ただやってみたらselectの"("あたりでエラーになる
select A.ID, A.DATE, A.DATA
from test A inner join
(select ID, max(DATE) as MAX_DATE
from test
group by ID
) B
on A.ID = B.ID
and A.DATE = B.MAX_DATE
MySQLのメッセージ: ドキュメント
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'select ID , max( DATE ) as MAX_DATE from test group by ID )
なんでか教えてくれorz
0965NAME IS NULL
2008/05/13(火) 22:21:43ID:???MySQLで副問合せが使えるのは4.1以降
0968NAME IS NULL
2008/05/13(火) 23:11:02ID:???0969962
2008/05/13(火) 23:12:42ID:???create temporary table B select ID, max(DATE) as MAX_DATE from test group by ID;
select A.ID, A.DATE, A.DATA from test A inner join B on A.ID = B.ID and A.DATE = B.MAX_DATE;
でいいかな?
あと、これperlで使おうと思ってるんだが
$sth = $db->prepare(1文目);
$sth->execute;
$sth = $db->prepare(2文目);
$sth->execute;
という風に分ける必要ある?一回でできないかな?
0970NAME IS NULL
2008/05/13(火) 23:13:36ID:???0971962
2008/05/13(火) 23:18:59ID:???今初めて聞いた言葉だったんで調べたらMySQLは5.0以降に標準SQL準拠でサポートってwikipediaに書いてあった
なんで使えないかなぁー
0972NAME IS NULL
2008/05/13(火) 23:36:16ID:???NVLの逆がしたいんですが、どうすればいいでしょうか?
指定した項目がNULLならそのままNULLとして、
NULL以外であれば特定の値に変換したい、というわけです。
oracleです。
0973NAME IS NULL
2008/05/13(火) 23:38:38ID:???NVL2
0974NAME IS NULL
2008/05/13(火) 23:38:44ID:???decode
0975NAME IS NULL
2008/05/13(火) 23:42:00ID:???ありがとうございます!試してみます。
0976NAME IS NULL
2008/05/13(火) 23:59:21ID:???ちょうど質問後に必死でググッてそこに到達しました。
NVL2の方がスマートっぽいですね。
ありがとうございました。
0977NAME IS NULL
2008/05/14(水) 09:35:33ID:???OracleはVARCHAR2やNVL2のようにOracle独自ではあるが、
使い勝手のいい型が[SQL92]2でそろってる。
0978NAME IS NULL
2008/05/15(木) 22:30:00ID:gOggTcL2・ORACLE10g使用
TABLE1 : IDがPK
--------------------
ID | MONEY
--------------------
1 | 1000
2 | 2000
3 | 2000
--------------------
TABLE2 : KEYがPK
--------------------
KEY | ID | SALES
--------------------
1 | 1 | 500
2 | 1 | 200
3 | 3 | 100
--------------------
TABLE1のMONEYから、TABLE1のID=TABLE2のID、のカラム全てのSALES合計値を引いた値が
10以上とか100未満とかを検索したい。
検索結果の10番目から20番目のみを取得するなどの条件を付加する予定。
ORDERを使用する予定。
以上を踏まえたSQL文をかいてみましたが
SELECT * FROM (
SELECT ROUNUM RN, A.* FROM (
SELECT x.ID, x.MONEY FROM TABLE1 x WHERE (
x.MONEY - (SELECT SUM(u.SALES) FROM TABLE2.u WHERE u.ID = x.ID) >= '100'
)
) A
)
これだと取得できないのです!
SELECT x.ID, x.MONEY FROM TABLE1 x WHERE (
x.MONEY - (SELECT SUM(u.SALES) FROM TABLE2.u WHERE u.ID = x.ID) >= '100'
)
だけだと取得できてるのですが・・・
なぜだめなのかおしえてください!
0979NAME IS NULL
2008/05/15(木) 23:06:16ID:???今やってみたけどどっちも予想通りの結果になるけど?
(ROUNUM とか TABLE2.u とかのタイプミスは除いて。)
RN ID MONEY
---------- ---------- ----------
1 1 1000
2 3 2000
「取得できない」ってのは期待した結果に対してどう違うの?
0980NAME IS NULL
2008/05/16(金) 00:07:33ID:8cLWGMegまじですか!!
なんか定義されてませんみたいなエラーが出たんですが、明日もう一度試してみます!
テストありがとうございます!
0981NAME IS NULL
2008/05/16(金) 00:11:51ID:8cLWGMegあれ、今見たら結果が想定した値ではないです!
RN ID MONEY
---------- ---------- ----------
1 1 1000
2 2 2000
3 3 2000
が帰ると思ってたんですが
SELECT SUM(u.SALES) FROM TABLE2 u WHERE u.ID = x.ID
って取得できなかったら 0 を返すんじゃなかったでしたっけ
0982NAME IS NULL
2008/05/16(金) 09:53:53ID:???0983NAME IS NULL
2008/05/16(金) 21:25:47ID:???SQL質疑応答スレ 6問目
http://pc11.2ch.net/test/read.cgi/db/1210940477/
0984NAME IS NULL
2008/05/16(金) 22:37:19ID:???乙
質問なんだけど1つのテーブルに登録できるレコード数って制限ある?
それともHDDの容量が許す限り?
確認方法とかあったら教えてください。
・MySQL 4.0.27 さくらのレンタルサーバでphpMyAdmin 2.11.2.1
0985NAME IS NULL
2008/05/16(金) 23:27:45ID:???調べてないけど42億レコードぐらいまでは大丈夫そうに思うけれど。
DBMSごとに物理サイズ制限があるからそっちのほうが先にきそうな。
0987NAME IS NULL
2008/05/17(土) 01:25:32ID:???いろいろ不具合が出るなんて落とし穴があるかもしれないから気をつけな。
Postgresの昔のバージョンでこれやられた。
0988NAME IS NULL
2008/05/17(土) 01:25:45ID:???ともあれ、スレ違いだな
0989NAME IS NULL
2008/05/18(日) 03:47:13ID:???TABLE1のID全ての値が欲しいならLEFT JOIN使わないと。
0990NAME IS NULL
2008/05/18(日) 15:05:30ID:???レコードが挿入された順に並び替えることは不可能?
挿入された日時のフィールドはないですが。。。
普通にSELECTして順番になってるかと思ったらそうでもなかった
多分途中で削除とかしてるからか??
もし、今からその機能追加する場合は
INTでauto_incrementで大丈夫ですか?
こっちも途中削除されたら抜ける気が。。。
抜けても抜けっぱなしなら問題なさそうですが
そこんとこどうなんですか?
それとも無難にTIMESTAMPか
0991NAME IS NULL
2008/05/18(日) 15:16:39ID:???これ、SQL の基本中の基本。
0992NAME IS NULL
2008/05/18(日) 15:29:41ID:???一般的なRDBMSは、ORDER BYがない場合の並び順の実装はかなり異なる。
データの挿入順に何か指標になる列を作るべき。
0993NAME IS NULL
2008/05/18(日) 16:08:11ID:???オレならIDを持たせて、insertするときにテーブルに存在するIDのMAX+1を新規レコードのIDにする。
削除すると歯抜けにはなるが、順序はこれで保障される。
他にいい案があったらよろしく。
0994NAME IS NULL
2008/05/18(日) 16:27:01ID:???普通にAutoIncrement列でOK
0995NAME IS NULL
2008/05/18(日) 16:28:31ID:???auto_incrementやTIMESTAMPを否定して自分の案を主張するなら
それらの欠点を挙げてからだと思うけど。
ちなみに俺は>>993の案を含めて、どれでもいいと思う。
もちろん多少の向き不向きはあるけど、そこまで要件が書かれていないので。
0996NAME IS NULL
2008/05/18(日) 16:43:46ID:???0997990
2008/05/18(日) 16:55:59ID:???ありがとうございまっす
auto_incrementって抜けっぱなしになってくれるんですね^^/
ありがたい。
登録された順で並び替えれさえすればいいので
auto_incrementでやってみます
0998NAME IS NULL
2008/05/18(日) 17:26:07ID:???次スレ
SQL質疑応答スレ 6問目
http://pc11.2ch.net/test/read.cgi/db/1210940477/
0999NAME IS NULL
2008/05/18(日) 17:26:27ID:???1000NAME IS NULL
2008/05/18(日) 17:26:50ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。