3

私はSQLに非常に慣れていないので、正しいクエリを使用してこのタスクを実行する方法について支援が必要です。

使用する必要のあるテーブルが2つあります。テーブル「TB1」には次のものがあります。

id Name
1  bob
2  blow
3  joe

テーブル「TB2」には次のものがあります。

compid property
1      bob
2      blow

「TB2」に欠落しているcompidを取得し、「TB1」から挿入しようとしています。

私が行っているクエリは次のとおりです。

SELECT id, name from TB1, TB2 where id <> compid

私が得たのは、ID 1、2の2つの出力、およびphpを使用したID3からの3つの出力です。

for($i=0;$i <= mysql_num_rows($comp)-1; $i++)
{
 echo mysql_result($comp, $i, 0)."<br>";


}

そして私は出力3を期待していましたが、代わりにこれを手に入れました:

1
1
2
2
3
3
3

テーブル内のすべての行を比較することは理解していますが、私が探しているものを達成する方法はありますか?

御時間ありがとうございます。

4

2 に答える 2

1

暗黙のデカルトJOINを実行しているため、すべての行が他のすべての行に対して発生します。JOIN2つのテーブルの属性を指定する必要があります。

暗黙の構文の使用(非推奨):

SELECT id, name 
FROM TB1, TB2 
WHERE id <> compid
  AND TB1.Name = TB2.property <-- Column join

明示的な構文の使用:

SELECT id, name
FROM TB1
JOIN TB2
  ON TB2.property = TB1.Name <-- Column join
WHERE id <> compid

目標を達成するには、次のようなものが必要になります。

SELECT TB1.id, TB1.name
FROM TB1
LEFT JOIN TB2
  ON TB2.property = TB1.Name
WHERE TB2.compid IS NULL

実際に見てください

あいまいさを防ぐために、選択した列に常にエイリアスを付けることをお勧めします。

于 2012-12-03T18:29:29.207 に答える
0

それを選択するには、次のことができます。

SELECT * 
FROM TB1 
WHERE id NOT IN (
    SELECT compid 
    FROM TB2
);
于 2012-12-03T18:28:53.933 に答える