web-dev-qa-db-ja.com

SQLの内部結合の「いいね」演算子

Sequel Proを使用すると、次の2つのテーブルがあります。

Table1

Name         Year    x      y
John Smith   2010    10     12
Adam Jones   2010    8      13
John Smith   2011    7      15
Adam Jones   2011    9      14
etc.

そして

Table2

Name                    Year  z    
Smith John Smith John   2010  27
Jones Adam Jones Adam   2010  25
Smith John Smith John   2011  29
Jones Adam Jones Adam   2011  21
etc.

基本的に、Table2の名前は同じであり、姓と名が入れ替わってから1回繰り返されます。そのため、Table1の名前はTable2の名前にあります(「John Smith」は「Smith John Smith John」にあります)。内部結合を実行し、Table2のz値をTable1の他の値に接続して、次のようなものを取得します。

Name       x     y     z
John Smith 10    12    27
Adam Jones 8     13    25

そのために、このクエリを実行しました。

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like "%Table2.Name%" and Table1.Year=Table2.Year

しかし、私はこれを出力として得ました:

Name  Year  x  y  z

以上です。見出しはありますが、行はありません。私が間違っていることはわかりません...おそらくlike演算子を使用している方法に関係しているのではないかと思いますが、わかりません。どんな助けでも大歓迎です。

12
japem

ちょっと変わったデータモデルは別として、テーブルをLIKE部分(table1.nameはtable2.nameの一部である必要があり、逆ではない)で方向転換しているので、追加する必要がありますフィールドのnameではなく、valueに対するパーセント名前を引用しないことを意味します。

SELECT table1.*, table2.z
FROM table1
INNER JOIN table2
  ON table2.name LIKE CONCAT('%', table1.name, '%') 
 AND table1.year = table2.year

テストするSQLfiddle

31

クエリが正しくありません。列のコンテンツはabcdTable2.Nameefgh。これは正しいでしょう:

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like "%" + Table2.Name+ "%" and Table1.Year=Table2.Year

このクエリは、より大きなテーブルに対しては非常に遅くなりますが、名前だけで結合している場合、すぐに重複するためテーブルが実際に大きくなることはできないと思います。

5
Tomas Pastircak

これを試して:

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like Concat('%',Table2.Name,'%') and Table1.Year=Table2.Year

クエリでTable2.Nameを含む文字列を検索します(定数に似ています)

名前に参加する提案は非常に悪いので、同じ名前の人が2人いる場合はどうですか??!そのため、このために主キーと外部キーが必要です。

3
Reza