0

私の SQL の知識はかなり限られているので、ご容赦ください。

別のテーブルのフィールドと一致しないフィールドの 1 つに基づいて、あるテーブルの行を返そうとしています。

私のテーブルの 1 つには、URL とサイト フィールドがあります (テーブル A など)。もう 1 つのテーブルには、サイトの名前であるテーブル B を使用して、いくつかのサイトが一覧表示されます。

たとえば、テーブル A の URL フィールドは ' http://google.it/aaa ' で、名前フィールドは 'google' です。

テーブル BI には、「サイト」および「名前」フィールドの下に格納されたサイトのリストがあります。以下の例:

1 つのエントリ: サイト google.co.uk

名前はグーグル

別のエントリ: サイト google.fr

名前はグーグル

3 番目のエントリ: サイト bing.com

名前ビング

URLフィールドがテーブルBの「サイト」フィールドと一致しないテーブルAの値を返したい.これを行うには、テーブルAの「名前」フィールドを使用して、テーブルの「サイト」値を検索する必要がありますB - 一致するものがない場合は、エントリを返します。したがって、この場合、私の URL は「http://google.it/aaa」であるため、テーブル B に google.it のエントリがあるかどうかを確認すると、何も見つからないため、それが返されます。

私は MySQL db を使用していますが、これら 2 つのテーブルは異なるスキーマにあります。私はいくつかのSQLを試してみましたが、ここに私が思いついたものがあります:

SELECT tablea.url, tablea.name FROM schema1.tablea 内部結合 schema2.tableb ON tablea.url NOT LIKE ('%' || tableb.site || '%')

前もって感謝します

4

1 に答える 1

1

あなたが使用EXISTSしたいNOT EXISTS

SELECT 
    tablea.url, 
    tablea.name 
FROM 
    schema1.tablea 
WHERE
    EXISTS
    (SELECT
        NULL
    FROM
        schema2.tableb
    WHERE
        tablea.name = tableb.name)
AND NOT EXISTS
    (SELECT
         NULL
    FROM
        schema2.tableb 
    WHERE
        tablea.name = tableb.name
    AND tablea.url LIKE ('%' || tableb.site || '%'))

これにより、tableb に同じ名前の行が存在する tablea のすべての行が表示されますが、tableb には同じ名前の行が存在せず、そのサイトには tablea の URL が含まれています。

于 2013-02-06T16:14:03.047 に答える