SELECT *和通过在Select语句/ Union查询中指定每个列返回所有列有什么区别返回Duplicates

时间:2014-07-11 06:11:59

标签: sql sqlite

我有以下表格结构(表名称通知)

   _id | NotificationFor | DateToNotify | isExtraOrdinary |
   NotificationData | TypeNotification | FriendsName |
   RadioType | PrimaryId

我对名为NotificationsCron的表具有完全相同的模式,但有时第二个表在Notifications表中具有完全相同的记录。我使用以下查询来获取记录:

SELECT *
FROM (SELECT *
      FROM Notifications
      WHERE TypeNotification <> 'Event' AND RadioType <> '3'
      UNION
      SELECT *
      FROM NotificationsCron
      WHERE TypeNotification <> 'Event' AND RadioType <> '3'
     ) T 
ORDER BY SUBSTR(DATE('NOW'), 0) > SUBSTR(DateToNotify, 0),
         SUBSTR(DateToNotify, 0);

然而,当我使用上述内容时,我得到重复,我在互联网上遇到类似的问题,发现UNION ALL返回重复,而UNION没有。在我的情况下哪个不起作用,我遇到的第二个重点是指定每个列名而不是SELECT *我想知道它是如何产生影响的 - 有兴趣知道它在基本级别如何工作?

以下是NotificationsCron表的图片:

Table NotificationsCron

以下是通知表中的一张图片:

Table Notifications

1 个答案:

答案 0 :(得分:4)

  

我遇到的第二个重点是指定每一列   名称而不是SELECT *我想知道它是如何形成的   差

后来,有人在桌子上添加了一个字段。任何使用“SELECT *”的查询都会突然获得一个新字段。有时这是正确的。有时会产生意外结果。在大多数情况下,最好始终明确命名列而不是使用通配符。

其次,如果您实际上不需要所有列,则可以通过限制返回的列来提高性能。更进一步,在某些数据库中,INDEX可以满足查询而无需转到表,因此如果使用列列表,则允许进行优化。使用SELECT *它不能。