質問#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;
質問#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;
何を言っているのかわかりませんが、あなたの質問から結論を出します。A
とはB
2つのテーブルであり、それらの共通フィールドは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;
「アンチジョイン」パターンを使用することをお勧めします。これは、一致する行を除外する述語を持つ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)
大規模なセットでは、どちらも、述語を持つテーブルなど、派生テーブルを含むクエリよりもはるかに優れたパフォーマンスを発揮します。
(暗黙的に区別される)またはで、テーブルにもテーブルにも見つからないLEFT JOIN
ものを取得するために使用します。その後、次のように句を最後に置くことができます。fee_source
a_aif
a_proxy
UNION
UNION ALL
ORDER 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;
私は条項OFFSET 0 ROWS
を強制するために使用しましたorder by
select count(*) from (
select column_name
from table_A
order by column_name OFFSET 0 ROWS) abc