0

次のフィールドを持つテーブルがあります。

object_id
attr_id
string_value

object_id は、属性 id と同様に、別のテーブルのオブジェクトを参照します (これらは両方とも外部キーです)。

たとえば、次のような行があります。

22, 14, blah
22, 30, argh
22, 31, moo
44, 30, argh
44, 31, kaw

ご覧のとおり、オブジェクト 44 には属性 14 に値が設定されていません。

私がやりたいことは、属性 14 が定義されていないすべてのオブジェクトを選択することです。

誰もこれを行う方法を知っていますか?

4

4 に答える 4

2

NOT INで使用できます。WHERE

select *
from yourtable t1
where object_id not in (select object_id
                        from yourtable t2
                        where attr_id in (14))

デモで SQL Fiddle を参照してください

于 2012-11-06T14:23:58.790 に答える
1

このための 3 つのテーブルがあり、何が欠けているかわからないattr_idと仮定すると、

SELECT c.object_id
FROM 
    (
        SELECT  a.object_id, b.attr_id
        FROM    Table1 a CROSS JOIN Table2 b
    ) c LEFT JOIN tableName d
          ON c.object_id = d.object_id AND
              c.attr_id = d.attr_id
WHERE d.string_value IS NULL

ただし、すべての列を返したい場合は、

SELECT e.*
FROM TableName e
      INNER JOIN
(
  SELECT c.object_id
  FROM 
      (
          SELECT  a.object_id, b.attr_id
          FROM    Table1 a CROSS JOIN Table2 b
      ) c LEFT JOIN tableName d
            ON c.object_id = d.object_id AND
                c.attr_id = d.attr_id
  WHERE d.string_value IS NULL
) f ON e.object_id = f.object_id
于 2012-11-06T14:19:26.553 に答える
0

私はあなたが何を意味するのかよくわかりませんが、SQLのブール値の場合:

SELECT * FROM table WHERE attr_id <> '14'

どちらが使用するか=「等しい」を意味するか、両方が「異なる」を意味するかではなく(最初の方がサポートが少し優れていますが、ほとんど意味がありません)。<>!=

于 2012-11-06T14:21:49.947 に答える
0
select m.*
from MyTable m
where not exists (select 1 from MyTable m2 where m2.object_id = m.object_id and m2.attr_id = 14)

自己結合を使用して行うこともできます。たとえば、次のようになります。

select m1.*
from MyTable m1
inner join MyTable m2 on m1.object_id = m2.object_id and m2.attr_id = 14
where m2.object_id is null
于 2012-11-06T14:19:08.767 に答える