| ID | 名前 |
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 1 | aa |
| 2 | bb |
| 3 | cc |
| ID | 名前 |
| 1 | aa |
| 2 | bb |
| 3 | cc |
| SELECT DISTINCT ID,, 名前 INTO #t FROM テーブル 1 DELETE テーブル 1 入れる INTO テーブル 1 選択 * #tから |
| ID | スタッフの | スキル |
| 1 | 1 | VB |
| 2 | 1 | PHP |
| 3 | 1 | ASP |
| 4 | 2 | PHP |
| 5 | 3 | ASP |
| 6 | 4 | VB |
| 7 | 4 | ASP |
| SELECT 従業員 FROM [テーブル] WHERE 従業員 IN(SELECT 従業員 FROM [テーブル] WHERE スキル='VB' ) AND スキル='PHP' |
3. データベースの統合の問題
Access に 2 つのテーブルがあり、2 つのテーブルの内容を結合したいと考えています。
テーブル [a] は次の構造になっています。
| [id] | 番号 | 自動番号 |
| [名前] | 名前 | テキスト |
| [価格] | 価格 | 番号 |
| [guige] | 仕様 | テキスト |
| [changjia] | メーカー | テキスト |
| [baozhuang] | パッケージ | テキスト |
| [danwei] | 単位 | テキスト |
合計 900 個のレコードがありますが、id フィールドと名前フィールドを除き、他のフィールドはすべて空にすることができます。
表 [b] は次の構造になっています。
| [id] | 番号 | 自動番号 |
| [名前] | 名前 | テキスト |
| [価格] | 価格 | 番号 |
| [changjia] | メーカー | テキスト |
| [danwei] | ユニット | テキスト |
| [xingzhi] | プロパティ | テキスト |
合計 800 個のレコードがあります。id フィールドと名前フィールドを除いて、テーブル [a] よりも少ないフィールドが 1 つあります。その他はすべて空です。
ここで、次の構造を持つ新しいテーブル [c] を生成したいとします。その内容は 2 つのテーブルの内容の合計です。
| [id] | 番号 | 自動番号 |
| [名前] | 名前 | テキスト |
| [価格] | 価格 | 番号 |
| [guige] | 仕様 | テキスト |
| [changjia] | メーカー | テキスト |
| [baozhuang] | 梱包 | テキスト |
| [danwei] | 単位 | テキスト |
| [xingzhi] | 自然 | テキスト |
SQL ステートメント、手動操作、または XML を使用できます。実際に 800 件のレコードを入力する必要がある場合は、とても憂鬱になります。
答え:
1.こうして
| c(id,name,....)に挿入 ID、名前、....を選択します。 からの c(id,name,....)に挿入 max(id)+1,name,....を選択してください bから |
2.訂正:
クエリ アナライザーで直接実行した場合:
| c(名前,....)に挿入 名前を選択して.... からの c(名前,....)に挿入 名前を選択して.... bから |
3. ユニオンメソッドを使用する
| [c] に挿入 ([id]、番号、自動番号) [id]、番号、自動番号を[a]から選択 連合 [id]、番号、自動番号を[b]から選択 |
4.aspソリューション
| <% 'テーブルaのループ検知 Set rs = Server.CreateObject("ADODB.RECORDSET") rs.open "ID による注文から * を選択",conn,1,1 rs.eof ではないときに実行します Call actAdd(rs("name")) 'テーブル b にコンテンツを追加するような関数を呼び出します! rs.次へ移動 ループ rs.閉じる Setrs=なし サブアクト追加(txt) ディム TS、SQL sql = "b(名前)に値を挿入('"& txt &"')" ts = Conn.Execute(sql) を設定します。 ts.閉じる ts = 何も設定しない 終了サブ %> |
5.aspソリューション
| <% ディム arr_temp1、arr_temp2、arr_data set rs=conn.execute("id、名前、価格、guige、changjia、baozhuang、danwei を選択してください") arr_temp1=rs.getrows rs.close rs=何も設定しない set rs=conn.execute("bからid、名前、価格、guige、changjia、danwei、xingzhiを選択") arr_temp2=rs.getrows rs.close rs=何も設定しない rem が処理を開始します redim arr_data(ubound(arr_temp1,2)+ubound(arr_temp2,2),7) rem は 2 つの配列の内容をコピーします。私はこの部分を自分で書き、2 つのループを作成してデータベースに保存しました。 %> |
最後に、いくつかの古典的な SQL ステートメントを変換します。
1. Wawa のおすすめ: 絶妙な SQL ステートメント
説明: テーブルをコピーします (構造のみをコピーします、ソース テーブル名: a、新しいテーブル名: b)
SQL: select * into b from a where 1<>1
説明: テーブルのコピー (データのコピー、ソース テーブル名: a、ターゲット テーブル名: b)
SQL: b(a, b, c) に挿入 b から d,e,f を選択;
説明: 記事、投稿者、最終返信時刻を表示します。
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
説明: 外部結合クエリ (テーブル名 1: a テーブル名 2: b)
SQL: aa、ab、ac、bc、bd、bf を a LEFT OUT JOIN b ON aa = bc から選択します。
説明: 5 分前にリマインダーをスケジュールするSQL: select * from スケジュール where datediff('分',f 開始時刻,getdate())>5
説明: 2 つの関連テーブル。セカンダリ テーブルにないメイン テーブルの情報を削除します。
SQL:存在しない情報から削除 ( select * from infobz where info.infid=infobz.infid )
例証します:--
SQL:
SELECT A.NUM、A.NAME、B.UPD_DATE、B.PREV_UPD_DATE
表1より、
(SELECT X.NUM、X.UPD_DATE、Y.UPD_DATE PREV_UPD_DATE
FROM (番号を選択、UPD_DATE、INBOUND_QTY、STOCK_ONHAND
表2より
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
(番号を選択、UPD_DATE、STOCK_ONHAND
表2より
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,
WHERE X.NUM = Y.NUM (+)
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B
ここで、A.NUM = B.NUM
例証します:--
SQL:存在しない学生情報から * を選択 (学生情報.id=student.id の学生から * を選択) および学部名='"&strDepartmentname&"' および専攻名='"&strprofessionname&"' 性別、学生の出身地、大学の合計による順序入学試験の点数
例証します:
データベースから1年間の各ユニットの電話料金統計を取得(電話料金割当、祝電、電報と肥料のリスト、2つのテーブルソース)
SQL:
SELECT a.userper、a.tel、a.standfee、TO_CHAR(a.telfeedate, 'yyyy') AS telyear、
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) 5 月として、
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC
FROM (SELECT a.userper、a.tel、a.standfee、b.telfeedate、b.factration
電話スタンドa、電話スタンドbから
WHERE a.tel = b.telfax) a
GROUP BY a.userper、a.tel、a.standfee、TO_CHAR(a.telfeedate, 'yyyy')
説明: 4 つのテーブルの結合クエリの問題:
SQL: aa=bb 上の左内部結合 b から * aa=cc 上の右内部結合 c aa=cc 上の内部結合 d から * を選択します。
説明: テーブル内の未使用の最小の ID 番号を取得します。
SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
フロムハンドル
WHERE NOT HandleID IN (ハンドル a から a.HandleID - 1 を選択)
2. 重複データを削除する
1.主キーを持つ場合
a. 一意のフィールド ID (一意の主キー)テーブルの削除
idが入っていないところ
(
テーブルグループからcol1、col2、col3...でmax(id)を選択します。
)
group by 句に続くフィールドは、重複を判断するために使用する条件です。たとえば、col1 のみがある場合、col1 フィールドの内容が同じであれば、レコードは同じであることを意味します。
b. 共通の主キーを持つ
Col1+','+col2+','...col5 が結合主キーであると仮定します。
select * from table wherecol1+','+col2+','...col5 in (
テーブルから max(col1+','+col2+','...col5) を選択します
count(*)>1 の場合
列1、列2、列3、列4でグループ化
)
group by 句に続くフィールドは、重複を判断するために使用する条件です。たとえば、col1 のみがある場合、col1 フィールドの内容が同じであれば、レコードは同じであることを意味します。
c: 全分野を判定id1、id2、... でグループ化されたテーブルから #aa に * を選択します。
テーブルの削除
テーブルに挿入する
#aa から * を選択
2. 主キーがない場合
a: 一時テーブルを使用して実装されます。
selectidentity(int,1,1) as id,* into #temp from ta
#temp を削除
idが入っていないところ
(
# グループから max(id) を選択します。col1、col2、col3...
)
テーブルtaを削除
ta(...) に挿入
#tempから....を選択してください
b:テーブル構造を変更(独自フィールドの追加)して実装alter table table add newfield intidentity(1,1)
テーブルの削除
ニューフィールドが入っていないところ
(
newfield を除くすべてのフィールドでテーブル グループから min(newfield) を選択します
)
テーブルを変更テーブル 列を削除新しいフィールド