1

问题 #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;
4

4 回答 4

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 和 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)谓词的查询)执行得更好。

于 2012-12-23T05:27:53.890 回答
1

我不知道,你在说什么,但从你的问题我得出结论。假设AandB是两个表,它们的公共字段是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;
于 2012-12-23T04:51:47.327 回答
0

使用(implicit distinct) orLEFT JOIN来获取在表和表fee_source中都找不到的那些,然后你可以在它的末尾放置一个子句,如下所示:a_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 回答