AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-653

WernerCD's questions

Martin Hope
WernerCD
Asked: 2013-02-01 15:58:06 +0800 CST

好、坏或无关紧要:WHERE 1=1

  • 17

鉴于reddit 上的这个问题,我清理了查询以指出问题在查询中的位置。我首先使用逗号WHERE 1=1,以便更轻松地修改查询,所以我的查询通常会这样结束:

SELECT 
     C.CompanyName
    ,O.ShippedDate
    ,OD.UnitPrice
    ,P.ProductName
FROM 
               Customers       as C
    INNER JOIN Orders          as O  ON C.CustomerID = O.CustomerID
    INNER JOIN [Order Details] as OD ON O.OrderID    = OD.OrderID
    INNER JOIN Products        as P  ON P.ProductID  = OD.ProductID
Where 1=1
--  AND O.ShippedDate Between '4/1/2008' And '4/30/2008'
    And P.productname = 'TOFU'
Order By C.CompanyName

基本上有人说1=1 一般是懒惰的,不利于性能。

鉴于我不想“过早地优化”——我确实想遵循良好的做法。我之前查看过查询计划,但通常只是为了找出我可以添加(或调整)哪些索引以使我的查询运行得更快。

那么这个问题真的……会Where 1=1导致坏事发生吗?如果是这样,我怎么知道?

次要编辑:我也一直“假设”这1=1将被优化,或者最坏的情况可以忽略不计。质疑一个口头禅永远不会有坏处,比如“Goto 是邪恶的”或“过早的优化......”或其他假设的事实。不确定是否1=1 AND会实际影响查询计划。在子查询中呢?CTE? 手续?

除非需要,否则我不是要优化的人......但如果我正在做一些实际上“坏”的事情,我想尽量减少影响或在适用的情况下进行更改。

performance optimization
  • 4 个回答
  • 16854 Views
Martin Hope
WernerCD
Asked: 2012-02-24 11:15:50 +0800 CST

Concat 问题让我很困惑

  • 0

MSSQL 2005 服务器工作组。

我有一个数据库作为另一个较旧、较慢的 cobol 数据库/应用程序的“仓库”。

我最近将仓库从一个 SQL Server 实例移到了一个新实例,以使我正在做的仓库与其他生产数据库分开。

我遇到的问题让我感到困惑。出于这个问题的目的,我拥有的表作为旧数据库的副本具有 4 个字段:ID、LName、FName、MI、FullName - 全部不是 NULL。在报表服务器上,我有一个计算字段 FullName: LastName, FName MI:

FullName = LName + ', ' + FName + ' ' + MI;

发生的事情是名字并没有始终如一地加入,这让我完全感到困惑。

DECLARE @ID int;
SET @ID = 1;
SELECT ID, 'LName' FName, LName                                   Field FROM TABLE WHERE ID IN (@ID) UNION
SELECT ID, 'FName' FName, FName                                   Field FROM TABLE  WHERE ID IN (@ID) UNION
SELECT ID, 'MI'    FName, MI                                      Field FROM TABLE  WHERE ID IN (@ID) UNION
SELECT ID, 'LFM'   FName, LName + ', ' + FName + ' ' + MI Field FROM TABLE  WHERE ID IN (@ID)

这输出预期的:

1   FName   Jack
1   MI  T
1   LName   Frost
1   LFM Frost, Jack T

但是如果我将它切换到不同的 ID,我会得到:

2   FName   Joe
2   MI  E
2   LName   Schmoe
2   LFM Schmoe

这不是空值的问题(三个字段有数据)。修剪、合并、名称的不同组合(LFM、MFL、LF、MF 等)最终相同:要么这个人有全名……要么这个人列出了第一个。

据我所知,我在另一个实例中没有这个问题。新实例在同一台服务器上。

原始服务器实例:2005 9.0.3042 Serv\SQL2005 新服务器实例:2005 9.0.1399 Serv\DataWarehouse

注意:对“原始”数据库的查询按预期工作。查询基于此仓库构建的报告按预期工作。

所以原始数据库 > 数据仓库 > 报表。原创作品很好。报告工作正常。数据仓库没有。仓库和报表在同一个实例中,但是不同的数据库。

sql-server-2005 instance
  • 2 个回答
  • 219 Views
Martin Hope
WernerCD
Asked: 2012-02-23 19:35:37 +0800 CST

从 TSQL 连接字符串中删除空值

  • 4

我有一堆查询,针对几个不同的数据库,我用来生成分隔报告。我正在尝试针对 MSSQL 数据库创建一些新报告,但在复制我们的其他流程以获得一致的结果时遇到了问题。

当我查询其他来源时,我得到 '' 和 0 代替空值。当我查询 MSSQL 时,我得到了空值。

我正在使用 DSN 字符串 => ODBC => 远程数据库进行某些查询...以及其他查询的直接连接字符串。

所以针对 DB2 数据库:

SELECT OrderID, CustomerName
FROM OrderTable LEFT JOIN CustomerTable on OrderCustomerID = CustomerID

假设 CustomerTable 没有 Customer,因此对于 OrderID 1,没有 customerID,结果将是(输出为 | delimted 列表):

0|Joe Schmoe
1|NULL
2|Jane Doe

使用 DB2 时,我得到“1|”。使用 MSSQL 时,我得到“1|null”。

使用 ODBC、连接字符串、服务器设置...我如何在空值上返回“”或 0 以使输出匹配我们的其他进程?

我试过直接连接(没有 DSN/ODBC)。我在 ODBC 中尝试过不同的设置。所有三个 SQL 驱动程序(SQL Server、SQL Native Client、SQL Server Native Client 10.0)。所有返回的数据类型均为 NULL 而不是“默认”。

更新/澄清 我正在使用“内部”ETL 程序,该程序主要通过分隔文本从内部数据库中提取和转换数据,以便导出到其他机构/客户。以前我使用的所有查询,当遇到空值时,都只是输出“”/0。MSSQL 显然不会那样做,所以我试图在最通用的级别上模仿其他来源。

我了解 IsNull/Colesce 的工作原理,如果需要,我将使用它们来完成工作。使用 IsNull/Colesce 的明显问题是添加的代码,跨越许多查询。添加的代码意味着更难的维护、更多的创建时间、更多的故障点等。如果我可以简单地告诉连接级别替换所有空值,我认为它会容易得多......但这使得问题是否可能?如果是这样怎么办?在 SQL2005 Server 实例中,或在 ODBC 连接或连接字符串的连接的另一端。

sql-server-2005 null
  • 2 个回答
  • 747 Views
Martin Hope
WernerCD
Asked: 2011-09-10 08:56:06 +0800 CST

关于重复键更新问题

  • 2

我正在尝试比较来自两个系统的数据。基本思想是:

  • 创建临时表。
  • 插入表 1 数据。
  • 插入 Table2 数据(表是一个链接的远程服务器),并尊重 UNIQUE Id。
  • 过滤第一个或第二个表具有不同信息的位置。

我正在尝试从第二个系统获取第二组插入,以插入,如果重复,则改为更新。我似乎无法正确处理。对于最后的插入,我应该有什么?

我没有“过滤器部分”,因为我没有插入 Table2 数据。过滤器部分将显示两个系统之间活动、姓氏或名字不同的行。简单where Table1LastName <> Table2LastName的类型语句。

注意:我已经创建了 2 个临时表......以及一个完整的外部连接和一些“其中 ID 为空”。我只是想让它以我以前从未使用过的方式工作。

if object_id('tempdb..#CompareDrs') is not null
    drop table #CompareDrs;
GO

create table #CompareDrs
(
     ID varchar(20) unique
    ,TABLE1Active varchar(1)
    ,TABLE1LastName varchar(50)
    ,TABLE1FirstName varchar(50)
    ,TABLE2Active varchar(1)
    ,TABLE2LastName varchar(50)
    ,TABLE2FirstName varchar(50)
);
GO

INSERT INTO #CompareDrs (ID, TABLE1Active, TABLE1LastName, TABLE1FirstName)
    SELECT
         right('00000000000000000000' + ForeignID, 20) ID
        ,case when Active = 0 then 'I'
              when Active = 1 then 'A'
              else ' '
         end       TABLE1Active
        ,LastName  TABLE1LastName
        ,FirstName TABLE1FirstName
    FROM
                  [DATABASE1].dbo.DRs
    Order By
        ID;
GO

INSERT Into #CompareDrs (ID, TABLE2Active, TABLE2LastName, TABLE2FirstName)
    SELECT 
         right('00000000000000000000' + Cast(DRDR# as Varchar(50)), 20) ID
        ,DRAFLG TABLE2Active
        ,DRLNAM TABLE2LastName
        ,DR1NAM TABLE2FirstName
    FROM
        [LINKEDERVER].[DATABASE].[CATALOG].[TABLE] DR
ON DUPLICATE KEY UPDATE TABLE2Active = VALUES(TABLE2Active), 
                        TABLE2LastName = VALUES(TABLE2LastName), 
                        TABLE2FirstName = VALUES(TABLE2FirstName),
GO

SELECT * FROM #CompareDrs;
sql-server insert
  • 3 个回答
  • 12197 Views
Martin Hope
WernerCD
Asked: 2011-02-15 07:41:07 +0800 CST

数据仓库创建

  • 7

谈到这个领域,我还很新手。我在一家小医院做了 8 个月的数据分析师,我在一个新的职业领域获得了 2 年的学位。

情况

我们有一个 Cobol“数据库”(我轻率地使用术语数据库......)。它是专有的分层数据库。我们有一个辅助软件解决方案,在其之上提供 ODBC SQL 层,以便通过标准的接口进行外部访问。它具有我认为符合 SQL 99 的命令。

COBOL 数据库到 SQL 有很多不足之处。索引是一成不变的。因此,如果我想执行任何未在索引的一个或两个字段上键入的查询(索引 = 患者编号。因此,如果我想查询入院/出院日期......忘记它)......它的狗慢. 联接将 5 分钟的查询变成 45 分钟的查询。许多查询会减慢系统的 REST 速度,从而导致不好的事情。

虽然系统确实有一个内部查询系统,但它绝不是我认为完整的东西。它有优点也有缺点,但主要问题是与外界的合作,我也需要发送报告。

问题

我正在尝试构建的...是一个 TSQL 数据仓库。我想创建一个将数据拉入我可以控制的 SQL 环境的过程(添加索引,使用像 case 语句这样的现代东西,“简单”查询不需要 15 分钟)。

我想知道专家们会推荐哪些好的资源、教程和工具。我的理想情况是将所有数据“历史”加载到 T-SQL 数据库中,然后每周加载新数据。它不是“实时”报告的理想选择,但“稍微”旧的数据可以满足我的大部分报告需求。

我一直在搞乱##Temp 表、合并到、更新等,试图查看加载和更新的时间是什么,什么不是……但在我深入之前,我想先了解一下一般情况建议。

sql-server-2008 data-warehouse
  • 3 个回答
  • 649 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve