1

質問#1-テーブル1のビューを作成する方法。テーブルの特定のフィールドがテーブル2に存在する場合、そのレコードをビューから除外しますか?

質問#2-表1のIDでDESC順に結果を並べ替える方法。

SELECT table1.source_id
FROM table1
WHERE table1.source_id NOT IN (SELECT table2.source_id from table2)
ORDER BY table1.source_id DESC;
4

4 に答える 4

1

何を言っているのかわかりませんが、あなたの質問から結論を出します。AとはB2つのテーブルであり、それらの共通フィールドはfee_idです。次に、これを試してください。

select a.name,b.fee_id from A a,B a where a.fee_id=b.fee_id

上記のクエリは、両方のテーブルをチェックfee_idインすることにより、両方のテーブルからすべてのデータを返します。

今、あなたが言ったように、あなたは必要ORDER BYです。次に、次のようなことを行います。

select a.name,b.fee_id from A a,B a where a.fee_id=b.fee_id ORDER BY a.name DESC

DESC名前順に情報を表示したい場合。

アップデート

ビューを作成する方法

create view viewname as (select * from table1)

最初の質問の解決策

nameフィールドが両方のテーブルに共通であり、そのビューで両方のテーブルで一意であるレコードが必要であるとします。つまり、table1レコードが1つあるが、同じレコードがに存在しない場合table2

create view viewname as (select * from table2 UNION (select * from table1 where name not in(select name from table2)))

例 :

NAME |                    NAME |
-------------            ----------------
ABC  |                   ABC   |
CDF  |                   GHI   |

It will return 

NAME |                    
-------------            
ABC  |                   
CDF  |     
GHI  |

2番目の質問の解決策

あなたはあなたの質問でこの質問を提供しました。そして、私はその点で何も悪いことを感じていません。

SELECT source_id
FROM table1
WHERE source_id NOT IN (SELECT source_id from table2)
ORDER BY source_id DESC;
于 2012-12-23T04:51:47.327 に答える
1

「アンチジョイン」パターンを使用することをお勧めします。これは、一致する行を除外する述語を持つLEFTJOINです。

SELECT t1.source_id
  FROM table1 t1
  LEFT JOIN table2 t2
    ON t2.source_id = t1.source_id 
 WHERE t2.source_id IS NULL
 ORDER
    BY t1.source_id DESC

(このステートメントのパフォーマンスは、source_idの先頭の列を持つtable1とtable2の両方にインデックスがある場合に最高になります。)

もう1つの方法は、NOTEXISTS述部を使用することです。

SELECT t1.source_id
  FROM table1 t1
 WHERE NOT EXISTS 
       ( SELECT 1
           FROM table2 t2
          WHERE t2.source_id = t1.source_id
       )
 ORDER
    BY t1.source_id DESC

(MySQLオプティマイザーは、依存サブクエリとしてではなく、「反結合」としても実行する場合があります。検証するには、EXPLAINからの出力を確認する必要があります。)

NOT IN (subquery)大規模なセットでは、どちらも、述語を持つテーブルなど、派生テーブルを含むクエリよりもはるかに優れたパフォーマンスを発揮します。

于 2012-12-23T05:27:53.890 に答える
0

(暗黙的に区別される)またはで、テーブルにもテーブルにも見つからないLEFT JOINものを取得するために使用します。その後、次のように句を最後に置くことができます。fee_sourcea_aifa_proxyUNIONUNION ALLORDER BY

SELECT *
FROM
(
    SELECT a_aif.fee_source_id source_id
    FROM a_aif 
    left JOIN a_fees ON a_fees.fee_source = a_aif.fee_source_id 
    WHERE a_fees.fee_source IS NULL
    UNION ALL
    SELECT a_proxy.fee_source_id
    FROM a_proxy
    left JOIN a_fees ON a_fees.fee_source = a_proxy.fee_source_id
    WHERE a_fees.fee_source IS NULL
) t
ORDER BY source_id DESC;

SQLフィドルデモ

于 2012-12-23T04:39:32.910 に答える
0

私は条項OFFSET 0 ROWSを強制するために使用しましたorder by

select count(*) from (
select column_name 
from table_A
order by column_name OFFSET 0 ROWS) abc
于 2019-06-19T16:12:21.150 に答える