问题#1 - 如何查看table1,如果table2中的某个字段存在于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;
答案 0 :(得分:1)
我不知道,你在说什么,但从你的问题我得出结论。
假设A
和B
是两个表,其公共字段为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
字段在两个表之间很常见,并且您希望该视图中的那些记录在两个表中都是 UNIQUE 。我的意思是,如果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;
答案 1 :(得分:1)
我建议你使用“反连接”模式。这是一个带有谓词的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上的索引是一个带有source_id前导列的table2,则此语句的性能最佳。)
另一种方法是使用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)
谓词的查询表现得更好。
答案 2 :(得分:0)
使用LEFT JOIN
获取fee_source
表或a_aif
表中未找到的a_proxy
UNION
(隐式不同)或{ {1}},然后你可以在它的末尾添加UNION ALL
子句,如下所示:
ORDER BY
答案 3 :(得分:0)
我使用OFFSET 0 ROWS
来强制order by
子句
select count(*) from (
select column_name
from table_A
order by column_name OFFSET 0 ROWS) abc