SQL質疑応答スレ 5問目
at DB
1:NAME IS NULL
07/10/27 21:09:21 OP1e5oAp
参考リンク
URLリンク(sql.main.jp)
URLリンク(www.atmarkit.co.jp)
URLリンク(oraclesqlpuzzle.hp.infoseek.co.jp)
URLリンク(www.techscore.com)
前スレ:【帰ってきた】SQL質疑応答スレ 4問目
スレリンク(db板)
質問テンプレ
・DBとバージョン
・テーブルデータ
・欲しい結果
・説明
2:NAME IS NULL
07/10/28 05:58:02
過去ログ
SQL質疑応答スレ スレリンク(db板)
SQL質疑応答スレ Part 2 スレリンク(db板)
【帰ってきた】SQL質疑応答スレ スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 2問目 スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 3問目 スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 4問目 スレリンク(db板)
3:NAME IS NULL
07/10/28 12:24:13 HNaUJLCG
sqlite3です。
zip(
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でつなげば良いようにしています」
という説明が有るのですが、いまいち理解出来ません。
何か具体例はないでしょうか?
4:NAME IS NULL
07/10/28 12:42:13
>>3
スレ違いなんだが、最後の文句
> 後は機械的に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するけどな。
5:NAME IS NULL
07/10/28 12:46:20
うげっ、堂でもいいが
if ($pref) $where += "AND pref_j='$pref' ";
if ($city) $where += "AND city_j='$city' ";
if ($town) $where += "AND town_j='$town' ";
' 'でくくるの忘れてt。
6:NAME IS NULL
07/10/28 21:59:15
>>4,5
アルバイトで返事が遅れました。
すいません、SQLに初めて触るので不理解です。
えっと、SELECT文にはWHERE句を入れなければならないけれども、
この場合WHERE hogeで固定すると、引数に応じた柔軟なSQL文を発行するのが
めんどくさい。
そこで、WHERE 0=0として引数に応じてANDで追加したら、コーディングが
楽になると言う理解でよろしいでしょうか?
ちなみに WHERE 0=0ってどういう意味なんでしょうか?
今までの場合だと、
WHERE zip7とかWHERE 100といった直接指定しか習っていないので、
0=0の意味が良く分からないです。
7:NAME IS NULL
07/10/28 22:31:01
>>6
0=0は常に真となるダミーの条件。
つけてもつけなくてもSQLの意味としては全く同じ。
なんで必要かが分からないうちはつけなくていい。
プログラムでSQLを自動生成するようになれば
おのずと分かるようになるよ。
8:NAME IS NULL
07/10/28 23:34:47
なんで TRUE じゃないのか俺にもわからん
9:NAME IS NULL
07/10/29 11:02:14
where TRUE って書くとそんなカラムはねーって言われるからだな。
10:NAME IS NULL
07/10/29 12:01:11
MySQLへphpmyadminを介してインポートするために、
直接連絡の取れない会社に「テキストでのsqlダンプ」をくださいといったのですが、
秀丸で開くとバイナリっぽい感じがするデータが来ました。
TAPE <文字化け> microsoft SQL serverと1行目にあるのですが、
これはテキストでのsqlダンプなのでしょうか?
完全なテキストデータでは、microsoft SQL serverはエクスポートできないのでしょうか?
11:NAME IS NULL
07/10/29 20:22:15 BxcL5p6/
a, b, c
-------
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 なんですが、サブクエリを使って二段階で処理すれば
いけるのかなとは思っているのですが、できれば一発で処理したいです。
12:NAME IS NULL
07/10/29 20:29:42
>>11
SELECT a,count(DISTINCT b),sum(c) FROM Table GROUP BY a;
13:NAME IS NULL
07/10/29 20:48:55
>>12
ありがとうございます。
DISTINCTって、集約関数の引数の欄にも書けるんですね。驚きました。
14:NAME IS NULL
07/10/29 20:50:59
>>10
スレ違い。「BCP でエクスポートしてね」って頼め。
詳しくは、SQL Server の専用スレで。
15:NAME IS NULL
07/10/30 00:14:05
質問ですが、SQLに於ける、
ボイスコット正規形がちんぷんかんぷんで解りません・・・・。
ので、解説お願い致します。
なるべくイメージが攫み易いように比喩など使って戴けると幸いです。
あと、調べた限りですと、
非キー項目から主キー項目を特定する事が出来てしまう(主キーが非キー項目に関数従属している)らしいのですが
どうして、このように特定できてはいけないのでしょうか?
16:NAME IS NULL
07/10/30 14:00:25 sO7Hyn8f
質問です。
レコードが4つあり、idがユニークで 1 2 4 6 という値が入っています。
このテーブルにインサートしたいのですが、SELECT MAX(id) の結果に
1を足した値をインサートする方法だと、いつかはオーバーフローします。
3でインサートしたいのですが、3を得るためによいSQL文はありませんでしょうか?
17:NAME IS NULL
07/10/30 15:05:25 LF/fw7ef
accessでInStrを使ってる処理を、Postgres+VBに移植しようとしているのですが、
InStrとLike/ILikeでは何か違いがあるのでしょうか。
とりあえずキーワードの前後に%をつければいいという事はわかりましたが、
ヒットする件数に微妙な違いが出るときがあるようです。
その違う例を発見できれば、何かわかりそうなのですが、
access側とpostgres+VB側それぞれ付き合わせるにしても件数が大きくて困っています。
18:NAME IS NULL
07/10/30 15:06:27
>>16
それが自然キーではない、つまりシステム内部で採番しシステム内部で使用するキーならば、
余計なことを考えずにより大きな型、32bitや64bitの整数を使う。
Max+1ではなくidentity属性やsequenceを使うのが基本。
それが自然キーならば、例えば1-9999の番号を繰り返し使うなどルールがある場合は、
例えば使わなくなった番号を管理するテーブルを別に持ちまずそれから番号を取得するなど、
いくつか方法がある。
採番の範囲が広いほどそれなりの工夫をしなければパフォーマンスを落とすことになりやすい。
19:NAME IS NULL
07/10/30 21:38:01
>>16
すでに1行以上データがあることが前提だが、最小の空き番は以下でとれる。
SELECT min(id)+1 FROM Table AS T1 WHERE NOT EXISTS (SELECT * FROM Table WHERE id=T1.id+1);
だけど、>>18に同意。
20:NAME IS NULL
07/10/31 17:46:13 WwEAVoHF
aspなのですが、
オブジェクトが閉じている場合は、操作は許可されません。
というエラーです。
rsが閉じているかどうやって調べればよいのでしょうか?
21:NAME IS NULL
07/10/31 17:49:34
>>20
すれ違い、この辺できいてくれ
ADO DAO など接続方法について
スレリンク(db板)l50
22:NAME IS NULL
07/10/31 17:51:23 WwEAVoHF
すれ違いかを教えることしかできないのか。残念。
23:NAME IS NULL
07/10/31 18:06:36
自己った。
24:NAME IS NULL
07/10/31 18:09:34
>>21
そのスレにはもっと痛い奴が何年も住み着いてるからきーつけな>WwEAVoHF
25:NAME IS NULL
07/11/02 16:01:42 B26ewXs/
質問です。
2つのテーブル tbl1 と tbl2 があり、SELECTする際にこの2つを結合させるものとします。
このとき取得できるフィールド名に、別名をつけたいと考えています。
tbl1.foo → tbl1_foo
tbl1.bar → tbl1_bar
tbl2.foo → tbl2_foo
tbl2.bar → tbl2_bar
というように、ユニークな別名をつけるにはどうすれば良いでしょうか。
もちろん、1つずつASを使うのが確実ではあるのですが、文字列操作関数で一括置換できないかなと。
プログラム側の都合上、同じフィールド名だと片方しか取得できないもので…。
26:NAME IS NULL
07/11/03 06:57:14
更新系SQLの書き方について質問させてください。
以下のようなデータがあるとします。
-----------------
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を使ってます。
よろしくお願い致します。
27:NAME IS NULL
07/11/03 08:24:08
update TableName set name = 'windows' where name like 'win%'
28:NAME IS NULL
07/11/03 08:26:06
>>26
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 %';
29:28
07/11/03 08:33:59
もうちょっと楽っぽいのを思いついた。
UPDATE Table SET name='windows '||substring(name,5) WHERE name LIKE 'win %';
30:NAME IS NULL
07/11/03 14:19:49
MySQL4.0です。
テーブルのnameフィールドが一部は
「山田 太郎」や「山田 太郎」となっており、
一部は
「山田太郎」
となっています。
スペースを無くす方向で統一したいのですが、下記SQL文で合っているでしょうか。
念のためバックアップしますが、それでも失敗したくないので。。。お願いします。
UPDATE table SET name=replace( name, ' ', '' )
UPDATE table SET name=replace( name, ' ', '' )
31:NAME IS NULL
07/11/04 22:42:08
SQLってStructured Query Languageの略じゃないとWikipediaに書いてあるんですが
マジですか?ISOのサイトにそう描いてある文書ないでしょうか。
32:NAME IS NULL
07/11/04 22:56:46
>>31
『Database Language SQL』
としか書いてねぇよ。
33:NAME IS NULL
07/11/04 23:09:38
>>31
そうか・・
34:NAME IS NULL
07/11/04 23:10:41
× >>31
→
○ >>32
みすった・・
35:NAME IS NULL
07/11/05 15:33:31
Oracle9iでのSELECTについて教えてください。
現在のテーブル内情報:
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したいのですが、
どのように記述すれば良いでしょうか?
よろしくお願いします。
36:NAME IS NULL
07/11/05 19:32:18
>>35
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
;
でいいような気がするが。
37:35
07/11/06 02:07:29
>>36
ご教示ありがとうございます。
今、徹夜中で頭がもうろうとしているので、
明日、あらためて試させていただきたいと思います。
重ね重ねありがとうございます。
38:35
07/11/06 10:18:59
>>36
さっそく試してみたところ、望んでいた結果が得られ
見事うまくいきました(号泣)
本当にありがとうございました。
JOINの使い方をよく理解してないので、
これからJOINを勉強してみます。
39:NAME IS NULL
07/11/06 10:19:04 XhrkB73v
1つのファイルにmysqlとPostgreSQLから同時にアクセス
データベースに接続指定を書き込んだファイルを用意する形で、ファイルは同一サーバー上ですが、セキュリテリの面から直接プログラムファイルに書き込まず、別ディレクトリに設置し読み込ませます。
0SはLinuxです。
その読み込みファイル1枚に、MySQlとPostgleに同時接続させるような設定を書いた場合、同時にDBを操作できるのでしょうか。
40:NAME IS NULL
07/11/06 10:39:09
>>39
日本語でOK
つか、何をしたいのか全く読み取れんよ。
> 1つのファイルにmysqlとPostgreSQLから同時にアクセス
1つのファイルに2つのRDBMSからアクセスするの?
> その読み込みファイル1枚に、MySQlとPostgleに同時接続させるような
1つのスクリプト or PGから2つのRDBMSに接続するの?
後者だとして、明示的に別なConnectionとかで扱えば、
個別のDataSourceとして扱うと思うがな。
それとも2つのRDBMSを1つの物として扱いたいって事か?
41:NAME IS NULL
07/11/06 10:47:24
ひょっとして、connection.ini ってなファイルに
pgsql:server=localhost/dbname=hoge...
musql:server=loclahost/dbanme=hoge...
って書いておいて、それを読み込んで接続したいってことかな?
そりゃ、ホスト言語の仕様次第だろ。単純な読み込みならまず問題ないと思うが。
んで、スレ違いだな。
42:NAME IS NULL
07/11/06 10:48:02
musqlはtypo....rz
43:NAME IS NULL
07/11/07 00:24:57 jxOaFgZr
>>0SはLinuxです
をよく見ると数字のゼロなのがウケル。
からかってんのか??
44:NAME IS NULL
07/11/08 01:29:29
下のような表から
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月程度。
この辺が限界です。
どなたかお力を・・・
45:NAME IS NULL
07/11/08 04:32:45
>>44
カラムが決め打ちでいいなら可能
46:NAME IS NULL
07/11/08 05:30:03
カラム名をシステムカタログから取得して、
PL/SQLでSQL組み立てれば可能かな。(カラム決め打ちじゃない場合)
Oracleスレで聞いた方がいいんじゃね。
47:NAME IS NULL
07/11/08 21:07:22 nXrq+1YJ
下記のテーブルAとテーブルBからテーブルAの重複行を
元に取得したい結果を抽出したいのですがご教授お願いします。
テーブル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
48:47
07/11/08 21:08:04 nXrq+1YJ
>>47の続き
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
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と結合した際に重複行以外も取得してしまいます。
長文で申し訳ありませんでしたがどなたかご教授ください。
49:NAME IS NULL
07/11/08 21:18:11
重複行を取りたいってのはわかった。
でも、それとテーブルBをどう結合するのかが
理解できん。
まず日本語できちんと説明してみれ
50:47
07/11/08 22:03:41 nXrq+1YJ
>>49
テーブルBの使用用途としては名称取得の為に使います。
取得したい結果はテーブルAの重複行の結果を元に名称が違うものだけを
抽出するというものです。
グループ化した後にグループ化された結果のデータの詳細を
表示するのですが、その際にテーブルAの重複行として取得した結果以外
のものが取得されてしまうのです。
日本語が下手で分かりにくいと思いますがすいません。
51:NAME IS NULL
07/11/08 22:06:24
わかりにく・・・
箇条書きでいいから条件羅列してみれ
52:NAME IS NULL
07/11/08 22:12:33
取得したい結果
ID1 |ID2 |ID3 |NAME|MONEY
------------------------------
010101|020202|030303|A |1000
このID3=030303ってデータはどこからくるの?
テーブルAにもBにも存在しないんだけど。
53:NAME IS NULL
07/11/08 22:35:30
>>47
「取得したい結果」は、
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
で良さそうなもんだけど。
54:47
07/11/08 22:44:46 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
55:NAME IS NULL
07/11/09 00:22:12
>・テーブルAのID3の1,2桁目と5,6桁でグループ化をする。
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
56:NAME IS NULL
07/11/12 00:31:35 tKheOgZe
MySql5.0を使用してます。
CREATE 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を永遠に抽出したいんですが、どういう風に記述すればよいでしょうか?
57:NAME IS NULL
07/11/12 01:13:30
試してないが、
select * from test_tbl where mydate<sysdate() and (sysdate()-mydate)%30=0
58:NAME IS NULL
07/11/12 18:49:35 3CGhHvj/
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の書き方を教えてください。
59:NAME IS NULL
07/11/12 19:55:42
>>58
>>35-36
60:NAME IS NULL
07/11/12 20:08:04 3CGhHvj/
>>59
サブクエリーでMaxとった後に、同じテーブルを当てるのですね。
やってみたら上手くいきました。
有難う御座いました。
61:NAME IS NULL
07/11/12 22:51:57
SQLについて質問させください。
以下の二つのテーブルがあるとします。
(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はどのようになりますでしょうか?
よろしくお願い致します。
62:NAME IS NULL
07/11/12 23:14:33
>>61
ヒント:sum(case when answer = 'yes' then 1 else 0 end) as yes
63:>>61
07/11/13 07:54:51
>>61
ありがとうございました!
64:RrLJfFysqaTB
07/11/13 12:50:19
OxUDeM <a href="URLリンク(kcwofgibzljb.com) [url=URLリンク(oweqzrlrrhxk.com) [link=URLリンク(tturythxblwv.com) URLリンク(jmxakeogmots.com)
65:NAME IS NULL
07/11/14 01:15:06
Oracleを勉強していて、わからないところがあるので質問させてください。
以下のようなテーブルがあったとします。
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が大きい方を表示するようにしたいです。
66:NAME IS NULL
07/11/14 01:20:21
select 10 as a, 20 as b, (a + b) as c
のようなことをしたいのですが、できますでしょうか?
mysqlをつかっております。
67:NAME IS NULL
07/11/14 01:23:29
>>65
GROUP_ID と SALARY がわかってるんだから、
元のテーブルと JOIN すれば OK。
68:NAME IS NULL
07/11/14 01:24:00
>>66
試してみればいいんじゃね?
69:NAME IS NULL
07/11/14 01:32:41
>>66
MySQLじゃなくてもできないよ。
SELECT *,(a+b)AS c FROM (SELECT 10 AS a,20 AS b ...) AS T1
のようにすれば桶。
70:NAME IS NULL
07/11/14 01:43:11
>>65
こうやるんだよ。
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;
71:>>66
07/11/14 01:47:20
>>69
ありがとうございますm(_ _m)
72:ElCkbafdouVDbF
07/11/14 03:04:05
Cdjtp6 <a href="URLリンク(tvhpxzaxcajb.com) [url=URLリンク(jdtlpcftljec.com) [link=URLリンク(mktvrqchpfre.com) URLリンク(xzyfjavesqan.com)
73:fKgpGQOBRC
07/11/14 10:41:27
kXtUWP <a href="URLリンク(zffpjytxvwvv.com) [url=URLリンク(omxffvcxtpus.com) [link=URLリンク(oqvlhfrxmavo.com) URLリンク(xhhqhknnxunq.com)
74:65
07/11/14 11:28:45
>>67,70
ありがとうございます!
>>70さんのSQLはうまく動きませんでしたが、
参考にして作ることができました!
75:GnmKqIiRbSoLHQvXsv
07/11/14 12:30:56
2b1CTd <a href="URLリンク(mocxgyjjwzck.com) [url=URLリンク(xrxwfwfnrejf.com) [link=URLリンク(xzeorzfpjjxb.com) URLリンク(ewlokroibysi.com)
76:NAME IS NULL
07/11/15 01:18:33
Oracle10gの質問です。
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つだけ表示したい)
何かよい解決策はないでしょうか。
77:NAME IS NULL
07/11/15 01:21:33
>>76
Group By した結果と JOIN すればOK。
って、ちょっと前に似たような例があったような・・・
78:NAME IS NULL
07/11/15 01:48:23
>>77
回答ありがとうございます。
こんな感じでしょうか。
今は手元に環境がないので動作確認できませんが
MAXに違和感を感じます。
SELECT *
FROM
TBL1,
(
SELECT MAX(NAME)
FROM
TBL2
GROUP BY
NAME
)TBL2
WHERE
TBL1.ID = TBL2.ID(+)
>って、ちょっと前に似たような例があったような・・・
すみません。このスレでしょうか。
教えていただけるとありがたいです。
(パっと見どれだかわからない)
79:NAME IS NULL
07/11/15 04:14:56
たぶん前スレの最後のやつかな?
80:NAME IS NULL
07/11/15 07:44:36
前スレがもう見られないです。
ログ持ってる方、貼っていただけるとありがたいです。
81:65
07/11/15 16:45:32
すいません、もう一度質問させてください。
前のテーブルに付け足したテーブルがあるとします。
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
です。もうちょっとスマートにかけないものかなと思って質問しました。
よろしくお願いします。
82:xjQscgvGjNP
07/11/15 17:57:09
Hi! Nice site!
83:QYuScmbNhprG
07/11/15 17:57:58
Hi! Nice site!
84:NAME IS NULL
07/11/15 18:37:40
>>76
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
85:NAME IS NULL
07/11/15 20:06:51
>>81
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);
スマートかどうかは...?
86:sage
07/11/15 20:16:36 f/zLBRc9
質問します^^;
かなり初歩的なことかと思いますが。。。
IFIXなるものを現在会社で使ってまして制御系(FA)なのですが
まったく経験がなく、データベースなるものもあまり判っていませんorz
もし、詳しく判りやすいサイトや、板誘導などがありましたら、お願いします
板汚し板違いスイマセン
87:NAME IS NULL
07/11/15 21:21:59
で、何を知りたいんだ?それをはっきり書けよ
88:NAME IS NULL
07/11/15 22:41:17 NMabm+GO
LEFT OUTER JOIN で右側の列に検索条件指定したら、INNER JOIN と
いっしょですか?
89:86
07/11/15 23:38:43
>>86です
サゲミスッテマスタorz
タグの種類でPGがあって、その中に「ADDOUT」や「SETMAN」などがあるのですが
それらの説明、使い方、このときはこの文法?みたいのがわかればと思いまして。。。
まったく持って初歩的な事でスイマセン
90:NAME IS NULL
07/11/16 01:06:53
>>89
URLリンク(www.proface.co.jp)
これのことかな?それ向けのスレはないだろうな。
中でSQL−SERVERを使ってるようだけど直接は関係ないな。
ベンダーのユーザー会とかあるんじゃね?
営業に聴いて見たら。
91:NAME IS NULL
07/11/17 18:57:59
すいません。ソートについてお聞きしたいのですが、
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でした。
よろしくお願いします。
92:NAME IS NULL
07/11/17 19:04:25
select
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
93:NAME IS NULL
07/11/17 19:11:56
うおー!すごすぎる!早すぎる!久しぶりに感動した!
本当にありがとう。次会ったらメシおごるノシ
94:msYFQKruZmljezmxU
07/11/18 04:12:25
Hi! Nice site! <a href=URLリンク(pinspekshun.blogspot.com) >hi </a> [URL=URLリンク(pinspekshun.blogspot.com) ] pillo inspekshun [/URL] URLリンク(pinspekshun.blogspot.com)
95:sEDptiCGfsyR
07/11/18 04:12:41
Hi! Nice site! <a href=URLリンク(pinspekshun.blogspot.com) >hi </a> [URL=URLリンク(pinspekshun.blogspot.com) ] pillo inspekshun [/URL] URLリンク(pinspekshun.blogspot.com)
96:UkbWCnYjjHy
07/11/18 04:13:37
Hi! Nice site! <a href=URLリンク(pinspekshun.blogspot.com) >hi </a> [URL=URLリンク(pinspekshun.blogspot.com) ] pillo inspekshun [/URL] URLリンク(pinspekshun.blogspot.com)
97:DBevzLOEcfuRezMQzKm
07/11/18 04:14:08
Hi! Nice site! <a href=URLリンク(pinspekshun.blogspot.com) >hi </a> [URL=URLリンク(pinspekshun.blogspot.com) ] pillo inspekshun [/URL] URLリンク(pinspekshun.blogspot.com)
98:NAME IS NULL
07/11/19 21:41:56
MySQL 4.1.20
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なら加算するというのをどうやったら付け加えられますか
教えてください。
99:NAME IS NULL
07/11/19 22:06:14
sum(decode(taisyaku,1,kingaku * -1,9,kingaku))
100:NAME IS NULL
07/11/19 22:08:45
sum(kingaku*(taishaku-5)/4)
101:98
07/11/19 22:17:57
>>100
何で4で割るのかしばし考えましたが、なるほどですね。
>>99
すいません、本見ましたけど、decodeって複号化する奴では?
102:NAME IS NULL
07/11/19 23:03:01
decode関数はOracleだけだな。
一応case文に書き換え可能。
sum(case taisyaku when 1 then kingaku * -1 when 9 then kingaku end)
103:NAME IS NULL
07/11/20 06:36:35
>>102
あ〜、固有のやつでしたか。ありがとです。
104:twavXWUFslz
07/11/20 21:57:37
wpMblV <a href="URLリンク(orhrbykowlfh.com) [url=URLリンク(qmyxnterfghh.com) [link=URLリンク(scltuetviczt.com) URLリンク(mvcondmybzwm.com)
105:StfyyUJvYsI
07/11/20 21:57:45
J4iVVk <a href="URLリンク(rdcnpcryezok.com) [url=URLリンク(lwliadpfpbax.com) [link=URLリンク(rfkixlnovphd.com) URLリンク(bgxiydwgrytq.com)
106:HStXqNGT
07/11/20 21:58:26
BmRgkm <a href="URLリンク(wkltnhbjkxte.com) [url=URLリンク(nfqygpcebcxp.com) [link=URLリンク(acbdchtzfety.com) URLリンク(kcpavhkvmcif.com)
107:OWiqHPJDpfe
07/11/20 22:01:42
HVwtcd <a href="URLリンク(dxmcqmralrtc.com) [url=URLリンク(kqmhumhyapnr.com) [link=URLリンク(tscybluiypbg.com) URLリンク(jfsahhjbytsj.com)
108:rrFELpiUaz
07/11/23 00:24:35
URLリンク(haimba.cn) windows mp3 downloads
109:QuyNWHZjnp
07/11/23 01:56:58
URLリンク(ieirrj.cn) legal mp3 music downloads
110:mvfhwciOqYgTQlKScw
07/11/23 21:18:56
URLリンク(kgnsye.cn) Imax california
URLリンク(kgnsye.cn) California dept of corporation htm
URLリンク(kgnsye.cn) Single family homes carlsbad california
URLリンク(kgnsye.cn) Archangel tattoo design
URLリンク(kgnsye.cn) Blue book pricings for atv
111:ObnIPIqgSyv
07/11/24 10:51:11
URLリンク(bdzwbn.cn) great mp3
112:OzbYNNxQZr
07/11/24 19:10:57
URLリンク(bdzwbn.cn) real mp3
113:NAME IS NULL
07/11/25 04:46:04
MySQL5.0なんですが、
WHERE field LIKE 'hoge%'
と
WHERE field REGEXP '^hoge'
って全く同じ条件になる、と考えてよいでしょうか?
114:XwnWVoMqtvaefKbr
07/11/27 18:49:38
mP3cFn <a href="URLリンク(qpmxqjoghxos.com) [url=URLリンク(wagolwnmugfg.com) [link=URLリンク(ptgsubukuahe.com) URLリンク(nhuvhvdcasob.com)
115:NAME IS NULL
07/11/27 21:59:57 JprxOidq
ストアドプロシジャー内でINSERT分に日時を利用したいのですが、構文教えてください
116:NAME IS NULL
07/11/27 22:20:59
>>115
ストアドプロシジャはDBMSによって構文が全く違うので
DBMS名を示さなければその質問は無意味。
SQLに限って言っても、日付・時刻に関する構文は
DBMSによって違う。
あと、やりたいことをもっと具体的に言ったほうがいいかと。
117:bVukSlOdGjiEKqu
07/11/28 12:10:38
6nZWlh <a href="URLリンク(sgigiievsonb.com) [url=URLリンク(dcqrzcdqcywn.com) [link=URLリンク(ykzntgnprdwm.com) URLリンク(xytahapkrpaw.com)
118:NAME IS NULL
07/11/28 14:21:20 dhNS0GoF
CREATE TABLE DEPENDENT(
DEPEND_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と言ってくるんですが、
何がまずいのでしょうか?
119:NAME IS NULL
07/11/28 19:18:06
select qid, quest from quest_tbl;
上のSQL文ですべての質問を取り出す際、ユーザがこの質問に答えているか、調べたいのですが下のSQL文を併せて調べるよう連結させるにはどうすればいいでしょうか?
select COUNT(user_tbl) FROM answer_tbl where qid=$qid and title IS NOT NULL;
120:NAME IS NULL
07/11/28 20:42:14
>>119
スレリンク(db板:78番)
121:NAME IS NULL
07/11/29 01:31:59
>>116
丁寧にお手数多謝です。
SQLServer2005です。GETDATE関数でおkですね。
もっと自分で調べてから質問するようにします。ご指摘ありがとうございます。
122:NAME IS NULL
07/11/29 01:53:38
A_ID │A_NAME│
-----------------------
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の結合が上手く行かなくて悩んでおります。
こんな遅い時間で恐縮ですが、どなたかお教え願えないでしょうか。
日が昇ったら、これを講師に提出しなくてはならなくて・・・。
よろしくお願い致します。
123:NAME IS NULL
07/11/29 01:54:29
追記で申し訳ないです。
使用しているプラットホームはpostgresqlでした。
124:NAME IS NULL
07/11/29 02:41:49
>>122
上から 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);
125:NAME IS NULL
07/11/29 02:45:00
いつも書き込んだ後に気づく...orz
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まででるけど)
126:NAME IS NULL
07/11/29 03:03:57
PostgreSQL 8.2 使ってますけど、副問い合わせで 1 件も存在しない時に 0 を返すように
したいんですがうまい書き方はないでしょうか?
UPDATE HOGE SET HAGE=(SELECT HAGE FROM FOO WHERE ID=?), ...
127:NAME IS NULL
07/11/29 03:12:55
>>126
SELECT Hoge SET hage=COALESCE((SELECT hage FROM Foo WHERE id=?),0);
128:NAME IS NULL
07/11/29 03:13:38
またやった...orz
UPDATE Hoge SET hage=COALESCE((SELECT hage FROM Foo WHERE id=?),0);
129:NAME IS NULL
07/11/29 03:17:30
>>127
ありがとうございます!
130:119
07/11/29 12:21:06
>>120
あっ!
たまたま同じ質問してる人がいたなんて!!
すごい奇遇です!!
131:122
07/11/29 15:43:22
>>125
遅レスで申し訳ないです。
おかげで、何とか合格しましたですよ。本当に有難うございました。
まだまだSQLが使いこなせてないので、ちょっとSQLの本買って冬休みは
勉強します。
132:FgUIzWJFDelHSJxvY
07/11/29 22:51:54
URLリンク(zerozeroone.at.tut.by) 胙粽 裲
URLリンク(zerozeroone.at.tut.by) 胙粽 裲
URLリンク(zerozeroone.at.tut.by) 胙粽胛 裲
URLリンク(zerozeroone.at.tut.by) 胙珞
URLリンク(zerozeroone.at.tut.by) 胙珞 裲
URLリンク(zerozeroone.at.tut.by) 胙糺 肛
URLリンク(zerozeroone.at.tut.by) 胙粽 肛
URLリンク(zerozeroone.at.tut.by) 胙糺 肛 聰褞
URLリンク(zerozeroone.at.tut.by) 裲 胙粽
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4533日前に更新/308 KB
担当:undef