问题 #1 - 如何创建 table1 的视图,如果 table2 中存在表中的某个字段,则从视图中排除该记录?
问题 #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 - 如何创建 table1 的视图,如果 table2 中存在表中的某个字段,则从视图中排除该记录?
问题 #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;
我建议您使用“反加入”模式。这是一个 LEFT JOIN,其谓词排除任何匹配的行,
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
(如果 table1 和 table2 上都有索引且前导列为 source_id,则此语句的性能最佳。)
另一种选择是使用 NOT EXISTS 谓词
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)
谓词的查询)执行得更好。
我不知道,你在说什么,但从你的问题我得出结论。假设A
andB
是两个表,它们的公共字段是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
有一个记录,但相同的记录不存在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 |
第二题的解答
您在问题中提供了此查询。而且,我不觉得有什么不对。
SELECT source_id
FROM table1
WHERE source_id NOT IN (SELECT source_id from table2)
ORDER BY source_id DESC;
使用(implicit distinct) orLEFT 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