挿入するフィールドの内1つだけを他のテーブルから取ってきた値を使いたいのですが、
insert into table1
(field1, field2, field3)
values('a', (select field2 from table2 where field4='xxx'), 'b');
Oracleだと↑の書き方でいけるのですが、PostgreSQL(6.5.3)だとエラーになってしまいます。
2回もDBにアクセスしにいくのはいやなので、1文で書きたいです。上記以外で他の書き方をご存知でしたら教えてください。よろしくお願いします。

A 回答 (1件)

ポストグレは使ったこと無いんで違うかもしれませんが、以下のSQLでどうでしょ?



insert into table1 (field1, field2, field3)
select 'a', field2, 'b'
from table2
where field4='xxx';
    • good
    • 0
この回答へのお礼

いけました!ありがとうございました。ほんとに。助かりました。
そういう書き方があるのですねえ。

お礼日時:2001/11/04 21:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qphpからinsertできない

またお世話になります。
PHPからMySQLへデータをインサートしたいのですが、各サイトを参考にしながら試しているのですがどうにも上手くいきません。
ソースを見ていただけますでしょうか?

$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");

mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);

$data1 = $HTTP_POST_VARS["inpdata1"];
$data2 = $HTTP_POST_VARS["inpdata2"];
$data3 = $HTTP_POST_VARS["inpdata3"];

$sql = 'INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES (`$data1`,`$data2`,`$data3`);';
$result = mysql_query($sql);

print $data1; //ここでは通常にデータが表示されるので
print $data2; //データの受け渡しは問題ないはずですが。
print $data3;

mysql_free_result($result);
mysql_close($con);

またお世話になります。
PHPからMySQLへデータをインサートしたいのですが、各サイトを参考にしながら試しているのですがどうにも上手くいきません。
ソースを見ていただけますでしょうか?

$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");

mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);

$data1 = $HTTP_POST_VARS["inpdata1"];
$data2 = $HTTP_POST_VARS["inpdata2"];
$data3 = $HTTP_POST_VARS["inpdata3...続きを読む

Aベストアンサー

$result = mysql_query($sql) or die(mysql_error());

としてデバッグしてみるといいですよ。

×$sql = 'INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES (`$data1`,`$data2`,`$data3`);';
○$sql = "INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES ('$data1','$data2','$data3')";

単純に、valuesの中で渡すデータはバッククォーテーションではなく
シングルクォーテーションです。フィールド名ではなくデータを
わたしたいのですから・・・。
$sql変数に代入する場合のくくりはダブルクォーテーションですね。
(変数を参照するため)

それと念のため、sqlのケツのセミコロンは取っておいた方がよいです。

QINSERT INTO table(DATE) VALUES('20090101')ができません。

初めましてご教授よろしくお願いします。

Accessにレコードを追加しようとしているのですがうまくいきません。

どうもDATEというフィールドにテキスト型の'20090101'を入れようとするのがいけないみたいです。

予約語だからDATEのフィールド名を変えた方がいいことはわかっているのですが、お客様がテーブルを作成しているので変更することができません。

お客様いわくテキスト型で入るというのですがどうすれば入るのでしょうか?

ちなみにDATEフィールドはテキスト型です。

エラー内容は「INSERT INTO ステートメントの構文エラーです。」と表示されます。

Aベストアンサー

INSERT INTO table(DATE) VALUES('20090101')

INSERT INTO table([DATE]) VALUES('20090101')
にしてみてください。

Qphp postgres Insert と updateができない

こんにちは、
現在、php5とpostgresql8でプログラムを行っています。
それで、
$sql = "INSERT INTO t_hoge (name) VALUES('hogesan')";
pg_exec($sql)
と、テーブルにデータを入れているんですが、
エラーはでないのに何故かデータがテーブルにインサートできません。
また、アップデートで編集もできません。
しかし、SELECTで既に入力されているデータを読んでprint等で表示させると普通にデータは取れています。
また、telnet等で直接postgresに
hoge=> INSERT INTO t_hoge (name) VALUES('hogesan');
と入力するとデータが挿入できます。

なにが問題なんでしょうか。
権限が問題なのでしょうか。
ちなみにテーブル作成するときは
CREATE TABLE t_hoge (
name TEXT PRIMARY KEY,
info TEXT
);
としています。

なにか思い当たる節があれば助言していただきたいのですが。

こんにちは、
現在、php5とpostgresql8でプログラムを行っています。
それで、
$sql = "INSERT INTO t_hoge (name) VALUES('hogesan')";
pg_exec($sql)
と、テーブルにデータを入れているんですが、
エラーはでないのに何故かデータがテーブルにインサートできません。
また、アップデートで編集もできません。
しかし、SELECTで既に入力されているデータを読んでprint等で表示させると普通にデータは取れています。
また、telnet等で直接postgresに
hoge=> INSERT INTO t_hoge (name) VALUES('hogesan'...続きを読む

Aベストアンサー

何かしらのエラーが出てるんじゃないでしょうか。
pg_execの直前で、

error_reporting(E_ALL);
ini_set("display_errors", 1);
pg_exec($sql);


こんな風にしてみてもエラーが表示されないでしょうか?

これでエラーが出ないのであれば、

echo $sql;

として、SQL文が正しいか見てみた方が良いと思います。

Qfield3で特定の値が入っている項目のfield2の値を抽出する方法について

下記のテーブルがあったとし、field3に「2」と「4」が入っているfield2の値を抽出したいと思いました。
下記の場合ですと、その条件を満たすのは11のみの為、「11」と表示したいと思います。

【T_Mテーブル】
―――――――――――――
|field1|field2|field3|
―――――――――――――
|1  |11  |1   |
|2  |11  |2   |
|3  |11  |3   |
|4  |11  |4   |
|5  |12  |2   |
|6  |12  |3   |
|7  |13  |3   |
|8  |13  |4   |
―――――――――――――

その為、下記のようなSQLを発行しましたが、1件もヒットしませんでした。

SELECT T_M.field2
FROM T_M
WHERE T_M.field3=2 And T_M.field3=4
GROUP BY T_M.field2;

WHERE T_M.field3=2 And T_M.field3=4に問題があると思うのですが、
And の代わりに or を使用すると、「11」「12」「13」がヒットしてしまい、
「11」だけをヒットさせることが出来ませんでした。

その為、上記のテーブル内容で「11」が返ってくるSQLの書き方についてご教示いただければと思います。

下記のテーブルがあったとし、field3に「2」と「4」が入っているfield2の値を抽出したいと思いました。
下記の場合ですと、その条件を満たすのは11のみの為、「11」と表示したいと思います。

【T_Mテーブル】
―――――――――――――
|field1|field2|field3|
―――――――――――――
|1  |11  |1   |
|2  |11  |2   |
|3  |11  |3   |
|4  |11  |4   |
|5  |12  |2   |
|6  |12  |3   |
|7  |13  |3   |
|8  |13  |4   ...続きを読む

Aベストアンサー

その他データベースに投稿される場合、使っているデータベースを書かれた方がよいと思います。
DBMS特有の関数や構文を示すことができませんので。。
考え方は以下の通りです。
・データのField2が「Field3=2であるField2」と「Field3=4であるField2」の両方を満たす
SELECT field2
FROM T_M
WHERE field2 IN (SELECT field2 FROM T_M WHERE Field3=2)
And field2 IN (SELECT field2 FROM T_M WHERE Field3=4)
GROUP BY field2
・データを集計したときにfield2=2のデータとfield2=4のデータをそれぞれ1件以上含む
SELECT field2
FROM T_M
GROUP BY field2
Having SUM(CASE WHEN field3=2 Then 1 Else 0 End)>0
Or SUM(CASE WHEN field3=4 Then 1 Else 0 End)>0

しかし、後者で使われているCASE式はたとえばAccessでは使えませんのでIIFなどを使う必要があります。

その他データベースに投稿される場合、使っているデータベースを書かれた方がよいと思います。
DBMS特有の関数や構文を示すことができませんので。。
考え方は以下の通りです。
・データのField2が「Field3=2であるField2」と「Field3=4であるField2」の両方を満たす
SELECT field2
FROM T_M
WHERE field2 IN (SELECT field2 FROM T_M WHERE Field3=2)
And field2 IN (SELECT field2 FROM T_M WHERE Field3=4)
GROUP BY field2
・データを集計したときにfield2=2のデータとfield2=4のデータをそれぞれ1...続きを読む

QGRANTステートメントによるユーザー追加について(LOAD DATA INFILEの権限)

GRANTステートメントで、「LOAD DATA INFILE」の権限を持ったユーザ(例:kasai)を作成したいのですが、上手くいきません。

mysql> GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,LOAD DATA INFILE ON *.* TO kasai;

ERROR 1064: You have an error in your SQL syntax. Check the manual that corresp
onds to your MySQL server version for the right syntax to use near 'LOAD DATA IN
FILE ON *.* TO kasai' at line 1

何かよい知恵を教えてください

Aベストアンサー

以下MySQLマニュアルからの引用ですが、
FILE とすれば良いのではないでしょうか。

GRANT と REVOKE ステートメントにおいて priv_type には以下が指定できます:
ALL [PRIVILEGES] Sets all simple privileges except WITH GRANT OPTION
ALTER Allows usage of ALTER TABLE
CREATE Allows usage of CREATE TABLE
CREATE TEMPORARY TABLES Allows usage of CREATE TEMPORARY TABLE
DELETE Allows usage of DELETE
DROP Allows usage of DROP TABLE.
EXECUTE Allows the user to run stored procedures (for MySQL 5.0)
FILE Allows usage of SELECT ... INTO OUTFILE and LOAD DATA INFILE.

以下MySQLマニュアルからの引用ですが、
FILE とすれば良いのではないでしょうか。

GRANT と REVOKE ステートメントにおいて priv_type には以下が指定できます:
ALL [PRIVILEGES] Sets all simple privileges except WITH GRANT OPTION
ALTER Allows usage of ALTER TABLE
CREATE Allows usage of CREATE TABLE
CREATE TEMPORARY TABLES Allows usage of CREATE TEMPORARY TABLE
DELETE Allows usage of DELETE
DROP Allows usage of DROP TABLE.
EXECUTE Allows the user to run stored procedures ...続きを読む

QINSERT INTO ステートメントに認識できないフィールド

助けてください
下記のコードなのですが、新たに「監督費」のフィールドを追加したいのですが、認識してくれません
「INSERT INTO ステートメントに認識できないフィールド <フィールド名> があります。正しい名前を入力したかを確認して、もう一度操作してください。(Error 3127)」
とエラーメッセージが出てしまいます

何が原因なのかわかりません

テーブルT物件情報とT共同受注には「監督費」フィールドは存在します

cond = "NZ(B.結果,0) = 0 AND B.確度 IN ('B') AND " & _
"FORMAT(B.発注予定時期,""YYYY/MM"") " & _
"BETWEEN '" & 年月1 & "' AND '" & 年月3 & "' "
Set db = CurrentDb
Set qr = db.QueryDefs("QS_EIGYO_BC")

qr.sql = "SELECT J.部署コード, FORMAT(B.発注予定時期,""YYYY/MM"") AS 年月, B.確度, " & _
"CCUR(NZ(J.受注金額,0)) AS 金額, CCUR(NZ(J.粗利,0)) AS 粗利, CCUR(NZ(J.監督費,0)) AS 監督費 " & _
"FROM T共同受注 AS J " & _
"INNER JOIN T物件情報 AS B ON J.物件番号 = B.物件番号 " & _
"WHERE " & cond & " " & _
"UNION ALL " & _
"SELECT E.部署コード, FORMAT(B.発注予定時期,""YYYY/MM"") AS 年月, B.確度, " & _
"CCUR(NZ(B.受注金額,0)) AS 金額, CCUR(NZ(B.粗利,0)) AS 粗利, CCUR(NZ(B.監督費,0)) AS 監督費 " & _
"FROM T物件情報 AS B " & _
"INNER JOIN Q部署担当者 AS E " & _
"ON B.責任者コード = E.担当者コード " & _
"WHERE " & cond & " AND " & _
"B.物件番号 NOT IN (SELECT 物件番号 FROM T共同受注)"
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM __B;"
'下記でエラー
DoCmd.RunSQL "INSERT INTO __B SELECT * FROM QS_EIGYO_BC"
DoCmd.SetWarnings True

助けてください
下記のコードなのですが、新たに「監督費」のフィールドを追加したいのですが、認識してくれません
「INSERT INTO ステートメントに認識できないフィールド <フィールド名> があります。正しい名前を入力したかを確認して、もう一度操作してください。(Error 3127)」
とエラーメッセージが出てしまいます

何が原因なのかわかりません

テーブルT物件情報とT共同受注には「監督費」フィールドは存在します

cond = "NZ(B.結果,0) = 0 AND B.確度 IN ('B') AND " & _
"FOR...続きを読む

Aベストアンサー

細かい検証はしていませんが、気になる点。

>DoCmd.RunSQL "INSERT INTO __B SELECT * FROM QS_EIGYO_BC"

__B と言うテーブルに「監督費」フィールドはありますか?
なければ追加してください。


上記で解決しない場合、下記を補足して下さい。

使用しているソフト名とバージョン
各テーブルの詳細(テーブル名、フィールド名、データ型の一覧)
「Q部署担当者」というクエリ?の内容(SQL文)

QphpからMySQLへ日本語insert

phpプログラムからMySQLへ日本語の入力を行おうとしているのですが、
selectで閲覧してみても、文字化けどころか挿入すらされていませんでした。
コードは以下のような実にシンプルなものです

<?php

require_once'DB.php';

$username = "****";
$password = "*****";
$host = "localhost";
$database = "udb";
$db = DB::connect("mysql://$username:$password@$host/$database"); //DB接続

if (DB::isError( $db )) {
die($db->getMessage());
}

$sql = "INSERT INTO comments (lec_code, comment) VALUES (0000, 'ああああ')";
$result = mysql_query($sql);
?>

日本語でなく、英語でinsertした場合は問題なく挿入できました。
また、MySQLから直接SQL文での入力であれば日本語をinsertできたので、設定ミスが問題なのであればMySQLではなくphp側だと思われます。
ちなみに、MySQLの文字設定はsjis、phpの設定は以下のとおりです。

output_buffering Off
default_charset "Shift_JIS"
extension php_mbstring.dll
mbstring.language Japanese
mbstring.internal_encoding SJIS
mbstring.http_input auto
mbstring.http_output SJIS
mbstring.encoding_translation On
mbstring.detect_order auto
mbstring.substitute_character none

phpプログラムからMySQLへ日本語の入力を行おうとしているのですが、
selectで閲覧してみても、文字化けどころか挿入すらされていませんでした。
コードは以下のような実にシンプルなものです

<?php

require_once'DB.php';

$username = "****";
$password = "*****";
$host = "localhost";
$database = "udb";
$db = DB::connect("mysql://$username:$password@$host/$database"); //DB接続

if (DB::isError( $db )) {
die($db->getMessage());
}

$sql = "INSERT INTO comments (lec_code,...続きを読む

Aベストアンサー

下のに加えてもう一つ、

$result = mysql_query($sql);

の前に

mysql_query('set names sjis')

をした場合の結果も知りたいです。

QOracle 8i コンマ(,)を含むデータをinsertしたい

再度、質問させていただきます。

コンマを含むデータをinsertするにはどうしたらよいでしょうか?
例えば、次のようなテーブルを作成します。
CREATE TABLE SAMPLE
(NAMEVARCHAR( 15)NOT NULL,
ADDRESSVARCHAR(30));

そして、

insert into sample
values
(Yamada, '731 Fondren,Houston,TX');

とinsertすると当然エラーになります。”ORA-00984: ここでは列は使用できません”というエラーが返ってきます。

"731 Fondren,Houston,TX"というコンマを含むアドレスをinsertしたいのですが、どうしたらよいでしょうか?

set scan off をしてもダメで、
'[731 Fondren,Houston,TX]'という風に変えても、上と同じ”ORA-00984: ここでは列は使用できません”というエラーが返ってきます。グーグルで調べて、arrayof(text)という風にタイプを変えるのかなと試しましたが、だめでした。

何かアドバイスをお願いします。

再度、質問させていただきます。

コンマを含むデータをinsertするにはどうしたらよいでしょうか?
例えば、次のようなテーブルを作成します。
CREATE TABLE SAMPLE
(NAMEVARCHAR( 15)NOT NULL,
ADDRESSVARCHAR(30));

そして、

insert into sample
values
(Yamada, '731 Fondren,Houston,TX');

とinsertすると当然エラーになります。”ORA-00984: ここでは列は使用できません”というエラーが返ってきます。

"731 Fondren,Houston,TX"というコンマを含むアドレスをinsertしたいのですが、どう...続きを読む

Aベストアンサー

insert into sample
values
('Yamada', '731 Fondren,Houston,TX');
としてください。

QDataTableに入っているデータを全てinsertしたい!(C#)

はじめまして、okwebsamaです。
さっそく質問なのですが、
質問タイトルのままですが、DataTableに入っているデータを全てinsertしたいのです。
insert先のテーブルは、DataTableと同じ列名をもっています。

コード
DataTable d;
for(int i = 1; i <= d.Rows.Count; i++){
みたいな感じで作っていたんですが、ここから先が思いつきませんでした。
どなたかよろしくお願いします!!

Aベストアンサー

確認ですが、

・使っているデータベースは何ですか?
 (SQL Server or Oracle or Access or その他?)

・DBの接続方法には、何を使ってますか?
 (SqlClient? OleDb?)

・コピー元のDataSetは、型付DataSet?型無しDataSet?

・C# + ASP.NET でという話で宜しいでしょうか?
 (ASP.NETで質問されていますが、質問内容みると、C#という
 分類での質問になり、ASP.NETではないような気がします)

少々情報が足りないので、回答が的外れになるかもしれませんが、
どのDB&接続方法にしても、名前空間とクラス名が違うだけで
基本ロジック自体は、ほぼ一緒のため、
下記、型付きDataSetで、SQL Serverの例で、サンプル記載しておきます。

もし、SQL Serverじゃない&型無しDataSetの場合だったり、
どう応用したらいいかわからないという場合は、また質問して下さい。

#############################################################

// コピー元のDataTableを取得
DataTable d = コピー元DataTableを取得;

// データベースの接続
//(本来であれば、web.configやapp.configに設定されている接続先を取得する方法が望ましいわけで...)
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB名;Data Source=DBサーバのIPアドレス");

conn.Open();

// コピー元のデータ数分だけループ
foreach (DataRow row in d.Rows)
{
  // INSERT用SQLを生成
  System.Text.StringBuilder sql = new System.Text.StringBuilder();

  sql.Append("INSERT INTO [コピー先のスキーマ].[コピー先テーブル名] ");

  // INSERT項目
  System.Text.StringBuilder insertColumns = new System.Text.StringBuilder();

  // INSERT値
  System.Text.StringBuilder valueColumns = new System.Text.StringBuilder();

  // DataTableの列数分だけループ
  foreach (DataColumn col in d.Columns)
  {
    insertColumns.AppendFormat("{0},", col.ColumnName);

    // 列の型が文字列型の場合
    if (col.DataType == typeof(String))
    {
      valueColumns.AppendFormat("'{0}',", row[col.ColumnName].ToString());
    }
    else
    {
      // 列の型が文字列型以外の場合
      valueColumns.AppendFormat("{0},", row[col.ColumnName].ToString());
    }
  }

  // 不要な「,」を削除
  insertColumns.Remove(insertColumns.Length - 1, 1);
  valueColumns.Remove(valueColumns.Length - 1, 1);

  // INSERT用SQL文の生成
  sql.AppendFormat("({0}) VALUES ({1})", insertColumns.ToString(), valueColumns.ToString());

  // SQLの実行
  System.Data.OleDb.OleDbCommand command;
  command = new System.Data.OleDb.OleDbCommand(sql.ToString(), conn);
  command.ExecuteNonQuery();

  command.Dispose();
  command = null;
}

// DBの接続を閉じる
conn.Close();
conn.Dispose();
conn = null;

確認ですが、

・使っているデータベースは何ですか?
 (SQL Server or Oracle or Access or その他?)

・DBの接続方法には、何を使ってますか?
 (SqlClient? OleDb?)

・コピー元のDataSetは、型付DataSet?型無しDataSet?

・C# + ASP.NET でという話で宜しいでしょうか?
 (ASP.NETで質問されていますが、質問内容みると、C#という
 分類での質問になり、ASP.NETではないような気がします)

少々情報が足りないので、回答が的外れになるかもしれませんが、
どのDB&接続方法にし...続きを読む

QALTER TABLE文の書き方について

お世話になります。

今、以下のような列からなるテーブルがあります。

・A(主キー)
・B(主キー)
・C(主キー)
・D(主キー)
・E(NOT NULL)
・F

列A、B、C、Dが複数列の組み合わせで主キーです。

このテーブルを以下のように変更したい場合、
どのようなALTER TABLE文を書けばできますでしょうか。

※列A、B、C、Dの主キーはやめて、列A、B、C、D、G、H、Iの
 複数列によるUNIQUE制約を設定。

・A(UNIQUE&NOT NULL)← 主キーはやめる
・B(UNIQUE&NOT NULL)← 主キーはやめる
・C(UNIQUE&NOT NULL)← 主キーはやめる
・D(UNIQUE&NOT NULL)← 主キーはやめる
・E(NOT NULL)
・F
・G(UNIQUE)← 追加
・H(UNIQUE)← 追加
・I(UNIQUE)← 追加

やりたいことは、列G、H、Iを追加して、
A、B、C、D、G、H、IでUNIQUEにしたく、かつ、
追加したG、H、IはNULLを許容したいということです。

A、B、C、D、G、H、Iの複数列の組み合わせで主キーも
考えましたが、主キーにするとNULLが許容できないと
いうことで、上記のようなレイアウトを考えました。

他に上手い方法があればご教授いただけると幸いです。

ちなみに列のデータ型はすべて可変長の文字列です。

お世話になります。

今、以下のような列からなるテーブルがあります。

・A(主キー)
・B(主キー)
・C(主キー)
・D(主キー)
・E(NOT NULL)
・F

列A、B、C、Dが複数列の組み合わせで主キーです。

このテーブルを以下のように変更したい場合、
どのようなALTER TABLE文を書けばできますでしょうか。

※列A、B、C、Dの主キーはやめて、列A、B、C、D、G、H、Iの
 複数列によるUNIQUE制約を設定。

・A(UNIQUE&NOT NULL)← 主キーはやめる
・B(UNIQUE&NOT NULL)← 主キーはやめる
・C(UNIQUE&NOT NU...続きを読む

Aベストアンサー

RDBMS名とバージョンは、何ですか?

DDL(定義)は、RDBMSによる機能差、仕様差が多い部分です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報