テーブルAとテーブルBがあり、両方に存在しないものを抽出してエラーとする処理を行いたいのですが、
どういうSQlを書いたらいいのか教えてください。
下記例としてテーブルにデータがあったとしたら、結果として
004 商品D
005 商品E
006 商品G
というデータを抽出したいのですが・・

テーブルA             テーブルB
-------------        -----------------------
コード  商品名 NO コード   商品名
001商品A        1 001 商品A
002商品B        2 001  商品A
003商品C        3 002   商品B
004商品D        4 003 商品C
006商品G        5 003 商品C
                6 005 商品E

A 回答 (3件)

ちょっと試したことがないのでわかりませんが、次のようなのはどうでしょう



(select キー1,キー2 from A
minus
select キー1,キー2 from B)
union
(select キー1,キー2 from B
minus
select キー1,キー2 from A)
    • good
    • 0

条件にもよりますが、not inよりもnot existのほうが処理速度が速くなるときがありますよ。

(索引データ件数による)
    • good
    • 0
この回答へのお礼

すいません!
やってみたのですが、エラーが出て動きません!
GROUP BYで式が設定されていませんとなってしまいます。(BYオラクル)
又、キーが例では、1項目だけだったのですが、複数で成り立つ場合も作りたいので合わせて教えてください。

お礼日時:2001/02/14 16:46

select * from テーブルA


where コード not in (select コード from テーブルB)
union
select * from テーブルB
where コード not in (select コード from テーブルA)
Group by 1,2
order by 1

環境によってマチマチではないかと思うのですが
(order by 1 が使えないとか・・・・)
算出するSQL概念はこれでいいかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。
私は、NOT EXISTSを考えたのですが、ご回答頂いた方が効率がいいみたいですね。助かりました! さっそく使わせて頂きます。

お礼日時:2001/02/02 12:48

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

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

Qオブジェクト指向における「クラスA have a クラスB」の関係において,クラスBからクラスAのあるメンバ変数だけを触る方法

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(プロパティ)usedClassAとする.

=======
C言語風に書くと,
<code>
public void クラスA{
  クラスB usingClassB = new クラスB(); // 持っているクラスB
  int commonNum = 0;
  public void AddCommonNum(){
      commonNum++;
   }
   ...
   (その他の処理)
   ...
}

public void クラスB{
   class usedClassA;    // 持ち主のクラスA

   // コンストラクタ
   public クラスB(クラスA _usedClassA){
       usedClassA = _usedClassA;
   }
   public void AddCommonNum(){
       _usedClassA.AddCommonNum();
   }
}
<\code>
となります.

この方法の問題点は,クラスAとクラスBに<双方向の依存関係を作っている>ことで,
クラスAの設計(ここではAddCommonNum())が変更されたときに,クラスBの内容を変更しなければならない可能性があることから,拡張性に欠けると考えています.

そこで,他に何かいい実装方法が無いか,
教えていただけないでしょうか?
特に,このような前提条件に汎用的に使える方法だと尚良いです.

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(...続きを読む

Aベストアンサー

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __TP variant;

  explicit CVariantHolder(const variant& val) : m_val(val){}
  ~CVariantHolder(){}

  variant& Get(){ return m_val; }
  const variant& Get() const { return m_val; }
  operator variant&(){ return m_val; }
  operator const variant&() const { return m_val; }
private:
  variant m_val;
};

struct CPropertyData
{
  typedef std::map<std::string, IVariantHolder*> map_t;
  template<class __TP>
  bool AddProperty(const __TP& tp, const std::string& sPropertyName)
  {
    if(GetProperty(sPropertyName))return false;
    return m_map.insert(std::make_pair(sPropertyName, new CVariantHolder<__TP>(tp))).second;
  }
  IVariantHolder* GetProperty(const std::string& sPropertyName)
  {
    return const_cast<IVariantHolder*>(
                static_cast<const CPropertyData&>(*this).GetProperty(sPropertyName)
                     );
  }
  const IVariantHolder* GetProperty(const std::string& sPropertyName) const
  {
    map_t::const_iterator it = m_map.find(sPropertyName);
    return it == m_map.end() ? 0 : it->second;
  }
private:
  map_t m_map;
};

template<class __TP>
static __TP* Lock(CPropertyData* property, const std::string& sPropertyName)
{
  CVariantHolder<__TP>* pVal = dynamic_cast<CVariantHolder<__TP>*>(property->GetProperty(sPropertyName));
  return pVal ? &pVal->Get() : 0;
}
//プロパティオブジェクトココまで

//テスト用の構造体
struct CommonStruct
{
  CommonStruct(long _l, short _s, char _c) : l(_l), s(_s), c(_c){}
  longl;
  shorts;
  charc;
};

//クラスAとクラスBココから
struct ClassB;
struct ClassA
{
  ClassA(ClassB* p, CPropertyData* property) : m_useClassB(p), m_property(property)
  {
    //ココでメンバ変数(プロパティ)の領域を動的に作成する
    m_property->AddProperty(int(0), "commonNum");
    m_property->AddProperty(CommonStruct(4, 2, 1), "commonStruct");
  }
  void DisplayProperty()
  {
    ::printf("%s %d %s\n", "[commonNum : ", *::Lock<int>(m_property, "commonNum"), "]");

    CommonStruct* p = ::Lock<CommonStruct>(m_property, "commonStruct");
    ::printf("%s <%d><%d><%d> %s\n", "[commonStruct <l><s><c> : ", p->l, p->s, p->c, "]");
  }
private:
  ClassB*m_useClassB;
  CPropertyData*m_property;
};

struct ClassB
{
  explicit ClassB(CPropertyData* property) : m_property(property){}
  void AddCommonNum()
  {
    int* pi = ::Lock<int>(m_property, "commonNum");
    (*pi)++;
  }
  void SetCommonStruct(long l, short s, char c)
  {
    CommonStruct* pc = ::Lock<CommonStruct>(m_property, "commonStruct");
    new (pc) CommonStruct(l, s, c);
  }
private:
  CPropertyData*m_property;
};
//クラスAとクラスBココまで

//お試し
int main()
{
  //両方に共通なプロパティオブジェクト
  CPropertyData property;

  //クラスBに渡す
  ClassB b(&property);

  //クラスAにクラスBとプロパティオブジェクトを渡す
  ClassA a(&b, &property);

  //クラスBでプロパティを操作する
  b.AddCommonNum();
  b.SetCommonStruct(10, 20, 30);

  //クラスAでプロパティを表示する
  a.DisplayProperty();
  return 0;
}

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __T...続きを読む

QコマンドプロンプトでAフォルダをBのソフトにドラッグ

AフォルダをBのソフトで圧縮させたい場合、
コマンドプロンプトで操作可能でしょうか?

Bのソフトを細かく制御することは不可能だと思いますので、
AフォルダをBのソフトにドラッグすることと同じことを
コマンドプロンプトでできればいいと思っていますが。

Aベストアンサー

Drag&Drop で実行するのは「ファイル名を引数として実行する」のと同じじゃなかったかなぁ. だから (適切な設定のもとで)
B A
と打ち込めば実行できる, ような気がする.

Q[SQLServer]既に存在するテーブルに他のテーブルからデータをINSERT

SQL初心者です。

既に存在するTable_A(レコード0件)に対して、これまた既に存在するTable_B(レコード100件)の内容をINSERTしたいです。次のように書くとだめですよね。
(Table_AとTable_Bのレイアウトはまったく同じ)

select * into Table_A from Table_B

何か策はあるのでしょうが、ちょっと探しきれません。お分かりになるかた教えてください。

Aベストアンサー

>(Table_AとTable_Bのレイアウトはまったく同じ)
これを読み飛ばしておりました。

ならばもっと省略できます
Insert Into Table_A
Select *
From Table_B
where フィールドB1 = 'ぱけらった' ←条件をつけるとき

Q■VBAマクロでワークブックAにワークブックBの集計をしたい。

■VBAマクロでワークブックAにワークブックBの集計をしたい。

ただし、ワークブックBは同じ番号で何個もあり、日付も並んでいません。
またワークブックAにあってBにない番号、また逆もあります。
それを日付が近いものから3つまで表示。


例)
ワークブックA (sheet1)
 番号 メモA1  メモA2 メモB1  メモB2 メモC1 メモC3
11111 2010/7/7  ccc 2010/5/5 ddd 2010/3/3 bbb
22222 2010/10/10 fff 2010/2/2 eee
35851 2010/12/12 ggg
54321

ワークブックB (sheet1)
番号  日付  メモ
11111 2009/1/1 aaa
11111 2010/3/3 bbb
11111 2010/7/7 ccc
11111 2010/5/5 ddd
22222 2010/2/2 eee
23568 2010/4/4 hhh
22222 2010/10/10 fff
35851 2010/12/12 ggg

※ワークブックAは最初項目と番号以外メモ部分は白紙です。例)は実行後の結果です。

質問で足りない部分ありましたら補足を入れますのでよろしくお願い致しますm(__)m

■VBAマクロでワークブックAにワークブックBの集計をしたい。

ただし、ワークブックBは同じ番号で何個もあり、日付も並んでいません。
またワークブックAにあってBにない番号、また逆もあります。
それを日付が近いものから3つまで表示。


例)
ワークブックA (sheet1)
 番号 メモA1  メモA2 メモB1  メモB2 メモC1 メモC3
11111 2010/7/7  ccc 2010/5/5 ddd 2010/3/3 bbb
22222 2010/10/10 fff 2010/2/2 eee
35851 2010/12/12 ggg
54321

ワークブックB (sheet1)
番号  日付  メモ
1...続きを読む

Aベストアンサー

ワークブックAのSheet1のシートモジュールに次のコードを書いてください。

Sub 集計()
Dim i As Integer
Dim j As Integer
Dim 番号 As String
Dim 日付 As Date
Dim メモ As String
For i = 2 To Workbooks("ワークブックB").Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
番号 = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 1).Value
日付 = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 2).Value
メモ = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 3).Value
For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(j, 1).Value = 番号 Then
If Cells(j, 2).Value < 日付 Then
Cells(j, 6).Value = Cells(j, 4).Value
Cells(j, 7).Value = Cells(j, 5).Value
Cells(j, 4).Value = Cells(j, 2).Value
Cells(j, 5).Value = Cells(j, 3).Value
Cells(j, 2).Value = 日付
Cells(j, 3).Value = メモ
ElseIf Cells(j, 4).Value < 日付 Then
Cells(j, 6).Value = Cells(j, 4).Value
Cells(j, 7).Value = Cells(j, 5).Value
Cells(j, 4).Value = 日付
Cells(j, 5).Value = メモ
ElseIf Cells(j, 6).Value < 日付 Then
Cells(j, 6).Value = 日付
Cells(j, 7).Value = メモ
End If
Exit For
End If
Next
Next
End Sub

ワークブックAのSheet1のシートモジュールに次のコードを書いてください。

Sub 集計()
Dim i As Integer
Dim j As Integer
Dim 番号 As String
Dim 日付 As Date
Dim メモ As String
For i = 2 To Workbooks("ワークブックB").Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
番号 = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 1).Value
日付 = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 2).Value
メモ = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 3).Value
...続きを読む

Q複数の語句(a,b)を複数ファイルへ同時置換したい

あるフォルダに3つのファイルがあるとします。

「a」 という語句は、ファイル(1)の文中にある「言葉」という文字へ置換える。(言葉→aに置換)
「b」という語句は、ファイル(2)の文中にある「言葉」という文字へ置換える。(言葉→bに置換)
「c」という語句は、ファイル(3)の文中にある「言葉」という文字へ置換える。(言葉→cに置換)


この作業をフォルダに入ってるファイル全部へ一括で行いたいのですが、いいソフトはありますでしょうか?

置換対象の文字(「言葉」という文字)はすべてのファイル共通です。

イメージとしては、例えば以下のような登録ボックスがあったとして

登録1、「a」 → ファイル(1) 「言葉→aに変更」
登録2、「b」 → ファイル(2) 「言葉→bに変更」
登録3、「c」 → ファイル(3) 「言葉→cに変更」

という感じに、最初だけ「a」「b」「c」という語句を登録して、ファイルも(1)、(2)、(3)と登録しますが、
置換えするときは一括でワンクリックで全部置換えというようにしたいのですが良い方法はありますでしょうか?

ちなみにズブの素人なのでプログラミング関係は理解できませんでした。
サクラエディタとかマクロとか調べましたが途中で挫折です・・。

これができたら本当に助かります。どうかお願いします。

あるフォルダに3つのファイルがあるとします。

「a」 という語句は、ファイル(1)の文中にある「言葉」という文字へ置換える。(言葉→aに置換)
「b」という語句は、ファイル(2)の文中にある「言葉」という文字へ置換える。(言葉→bに置換)
「c」という語句は、ファイル(3)の文中にある「言葉」という文字へ置換える。(言葉→cに置換)


この作業をフォルダに入ってるファイル全部へ一括で行いたいのですが、いいソフトはありますでしょうか?

置換対象の文字(「言葉」という文字)はすべてのファイル共通で...続きを読む

Aベストアンサー

> この作業をフォルダに入ってるファイル全部へ一括で行いたいのですが、いいソフトはありま

そういうのはシェルスクリプトと sed, awk とか perl とかで、その場ででっちあげて済ますのが多いかな。一々エディタでちまちまやってられんし。


このカテゴリの人気Q&Aランキング

おすすめ情報