0

DBName列で次の2つのテーブルを結合する必要があります。

表A

ProductName DbName ServerName
A           DB1    sername
B           DB2    sername
C           DB3    sername
D           DB3    sername

表B

ID DBName ObjectName
1  DB3    objC
2  DB2    objD
3  DB3    objD
4  DB1    objD

次の列を持つ最終的なテーブルを取得できるようにします(つまり、テーブルBのすべての列+製品名):

 ID DBName ObjectName ProductName 

表からわかるように、AIには2つの異なるProductName(CとD)に関連するDB3があり、多対多の関係になります(つまり、結合後に列にDB3がある場合、1つはProductNameにCを表示し、 1つはDです。)

私がやりたいのは、ObjectNameがObjDの場合、ProductNameがDであり、ObjectNameがObjCの場合、ProductNameがCであるという条件によって1-1の関係を取得することです。

誰かが私にこれについて行く正しい方法を教えてくれたらありがたいです...

ありがとう!!

4

2 に答える 2

2
SELECT  a.*, b.ProductName
FROM    tableB a
        INNER JOIN tableA b
            ON  a.DBName = b.DbName  AND
                a.ObjectName LIKE '%' + b.ProductName

上記のクエリは期待どおりに機能しますが、確かにパフォーマンスが低下します。FULL TABLE SCANインデックスを使用しないため、パフォーマンスが向上します。

検索でインデックスが使用されるように、テーブルを正規化してください。

推奨されるスキーマは次のとおりです。

表A

  • 商品名
  • データベース名
  • サーバー名

表B

  • ID
  • DB名
  • オブジェクト名
  • 商品名

ProductName, DbNameそして、両方のテーブルで複数の列インデックスを定義します。

于 2013-02-25T03:03:29.020 に答える
2

それは醜いです。(そして遅くなる可能性があります)。結合には整数 ID を使用する必要があります。

テーブルの場合は次のようになります。

SELECT b.ID, b.DBName, b.ObjectName, a.ProductName
FROM a
  JOIN b
    ON a.DBName = b.DBName
    AND CONCAT('%',a.ProductName) LIKE b.ObjectName

これがうまくいくことを願っています。

于 2013-02-25T03:03:53.970 に答える