小编sag*_*agi的帖子

优化SELECT查询性能

我的SELECT声明运行得很慢,它阻碍了我们的夜间进程.

查询是:(请不要评论隐式连接语法,这是由运行此代码的Informatica自动生成的):

SELECT *
  FROM STG_DIM_CRM_CASES,V_CRM_CASE_ID_EXISTS_IN_DWH,stg_scd_customers_key
 WHERE STG_DIM_CRM_CASES.CRM_CASE_ID = V_CRM_CASE_ID_EXISTS_IN_DWH.CASE_ID(+)
   AND STG_DIM_CRM_CASES.account_number = stg_scd_customers_key.account_number(+)
   and STG_DIM_CRM_CASES.Case_Create_Date between  stg_scd_customers_key.start_date(+) and  stg_scd_customers_key.end_date(+)
Run Code Online (Sandbox Code Playgroud)

编辑:实际查询仅选择account_number,start_date,end_date另一个未编制索引的列.

表格信息:

STG_DIM_CRM_CASES

Index - (Account_Number,Case_Create_Date)
size - 270k records.
Run Code Online (Sandbox Code Playgroud)

stg_scd_customers_key

Index - Account_Number,Start_Date,End_Date
Partitioned - End_Date
Size - 500 million records.
Run Code Online (Sandbox Code Playgroud)

V_CRM_CASE_ID_EXISTS_IN_DWH(查看) -

select  t.case_id
from crm_ps_rc_case t, dim_crm_cases x
where t.case_id=x.crm_case_id;
Run Code Online (Sandbox Code Playgroud)

dim_crm_cases -

Indexed - (crm_case_id)
Size - 100 million .
Run Code Online (Sandbox Code Playgroud)

crm_ps_rc_case -

Size - 270k records
Run Code Online (Sandbox Code Playgroud)

编辑 - 如果不清楚,视图将返回270k记录.

没有连接的查询stg_scd需要几秒钟,看起来它是导致性能问题的部分,视图也会以秒为单位运行,尽管它正在加入到1亿个记录表中.现在,查询占用的时间在12到30分钟之间,取决于我们的来源有多繁忙. …

sql oracle optimization performance view

21
推荐指数
1
解决办法
1243
查看次数

或其他条件之间的冲突

我有以下查询:

    SELECT * FROM `Contacts` 
WHERE `Zona` = '1' 
AND `Responsable` = '9' 
AND `AllowComercialVisit` = 'Call_Again'
-- the problem are OR's --
OR `AllowComercialVisit` = 'Busy' 
OR `AllowComercialVisit` = 'Not_answered' 
-- the problem are OR's --
AND `DateRecall` <= '2016-06-20 13:04:52' 
AND `DateRecall` >= '2016-06-20 12:39:52' 
ORDER BY `DateRecall` ASC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

问题是查询应该显示第一个和第二个'DateRecall'之间的行,但是返回所有带有'Call_Again','Busy'和'Not_answered'的行而不过滤日期.

任何解决方案将不胜感激!

mysql sql select date

17
推荐指数
3
解决办法
1584
查看次数

深层链接 - 如果应用程序关闭则不起作用

我正在我的 React Native 应用程序中实现与 expo 的深度链接。我已经成功地使用此代码和本教程以及本文档来将其调整为我的嵌套堆栈:

const linking = {
  prefixes:[prefix],
  config: {
    screens: {
      Drawer: {
        screens: {
          Tabs: {
            screens: {
              Profile:"profile"
            }
          }
        }
      },
    }
  }
}
return (
  <NavigationContainer linking={linking}>
    <RootStackScreen actions={actions} showLoader={showLoader} user={user} {...props} />
  </NavigationContainer>
)
Run Code Online (Sandbox Code Playgroud)

}

如果我使用myscheme://profile它,它会按预期工作,但前提是该应用程序在后台打开。当应用程序关闭时,它只是在我的初始主屏幕中打开它,我尝试谷歌搜索和搜索,但找不到任何适合我所做的解释。我还尝试添加getInitialRoute该功能linking,该功能在应用程序关闭并从深层链接打开时触发,但无法弄清楚如何使用它来激活导航。

async getInitialURL() {
  const url = await Linking.getInitialURL(); // This returns the link that was used to open the app
  if (url != null) { …
Run Code Online (Sandbox Code Playgroud)

navigation deep-linking react-native expo

15
推荐指数
1
解决办法
6752
查看次数

仅当变量不为null时,SQL才会添加过滤器

嗨,我有如下查询:

    SELECT  route_id [ROUTE_ID]
    FROM route_master(NOLOCK)
    WHERE  route_ou = 2
    AND   route_query = @l_s_query
    AND   lang_id  = 1
Run Code Online (Sandbox Code Playgroud)

这里,只有当@l_s_query为非空时,才应添加WHERE子句中的"AND route_query = @l_s_query"条件.我不想为@l_s_query写IF IFSE条件.有没有办法直接处理WHERE子句本身.谢谢.

sql sql-server

12
推荐指数
1
解决办法
6716
查看次数

如何找到最近更改的行?

我有一个包含审计相关记录的表.有一列存储批准状态,其值为"N"和"Y".我必须找到最近从批准状态'Y'更改为'N'的记录.

样本数据:

Request_No    approve_status request_create_date          audit_no_in
22866         N              2016-06-21 11:47:12.7530000  1016
22866         N              2016-06-21 11:46:52.3660000  1015
22866         Y              2016-06-21 11:46:13.9290000  1014
22866         Y              2016-06-21 11:45:14.3200000  1013
22866         N              2016-06-21 11:37:27.9410000  1012
22866         Y              2016-06-21 11:37:03.4510000  1011
22866         N              2016-06-21 11:32:29.6310000  1010
22866         Y              2016-06-21 11:31:41.0270000  1009
22866         N              2016-06-20 19:17:30.4820000  1008
22866         N              2016-06-20 19:14:30.4720000  1007
22866         Y              2016-06-02 13:12:53.5170000  1006
Run Code Online (Sandbox Code Playgroud)

所需输出:

Request_No    approve_status request_create_date          audit_no_in
22866         N              2016-06-21 11:46:52.3660000  1015
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

sql sql-server

11
推荐指数
1
解决办法
197
查看次数

如何分离字符串并重新构建它

分离字符串列表并用mysql中的新值替换相同的列表我在table_1中有以下数据表table_1(当前保存的结构)

code        value
12_A        ["A","B","C","D"]  
12_B        ["E","F","G","H"]
12_3        ["I","J","K","L"]
Run Code Online (Sandbox Code Playgroud)

但每个代码都有不同的值和不同的描述.喜欢::

code    value     description
12_A    A         Apple
12_A    B         Ball
12_A    C         Cat
12_A    D         Dog
12_B    E         Eagle
12_B    F         Flag
.       .         .
.       .         . 
.       .         .
Run Code Online (Sandbox Code Playgroud)

我必须从table_1中分离值列表,并需要再次保存在同一个表中,即table_1(在此结构中)::

code            value
12_A            ["Apple","Ball","Cat","Dog"]
12_B            ["Eagle","Flag",.......]
12_3            [......................] 
Run Code Online (Sandbox Code Playgroud)

mysql sql loops list

10
推荐指数
1
解决办法
386
查看次数

SQL如何通过INNER JOIN更新 -

请帮我解决这个问题,因为我尝试了这个论坛的所有内容,但仍未找到解决方案.

好吧,我有两张桌子:

  • 价格
  • 制造商

我想更改表格价格中两个字段的值.我会给那些具体的价值观.

这些领域是:

  • price.override(我想在其中给出值0)和
  • price.product_discount_id(我想在其中给出值66)

但我想仅为ID为31的制造商更改字段.

所以,我首先检查INNER JOIN是否正常工作.

SELECT manufacturers.manufacturer_id,
prices.product_id,
prices.product_price,
prices.override,
prices.product_discount_id
FROM manufacturers
INNER prices
ON manufacturers.product_id=prices.product_id
AND manufacturers.manufacturer_id=31;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试更新这两个字段时,我不知道如何做到这一点.例如,我试过这个,但它不起作用:

UPDATE prices
SET prices.override=1
FROM
INNER JOIN prices
ON manufacturers.product_id=prices.product_id
AND manufacturers.manufacturer_id=31;
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

UPDATE prices
SET prices.override=1, 
INNER JOIN manufacturers 
ON prices.virtuemart_product_id = manufacturers.virtuemart_product_id 
AND manufacturers.manufacturer_id=31;
Run Code Online (Sandbox Code Playgroud)

我做错了什么?通常我收到的错误消息是:

#1064 - 您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以便在第3行的'FROM jos_virtuemart_product_prices价格INNER JOIN jos_virtuemart_product_man'附近使用正确的语法

我读了别名的东西,但仍然没有结果.

任何帮助,将不胜感激!

mysql sql alias join sql-update

10
推荐指数
1
解决办法
120
查看次数

空字符串与NULL

我有一张表,其中一些行有一些空白cells.我尝试使用IS NULL函数选择这样的行.但查询选择0行.

select * from zzz_fkp_registration_female where fname is null;
(0 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

现在我将查询更改为:

select * from zzz_fkp_registration_female where fname is null or fname ='';
Run Code Online (Sandbox Code Playgroud)

我得到了理想的结果.

为什么IS NULL没有给出结果?是什么区别IS NULL,并''由于细胞是空的.请解释.

sql sql-server null cells

10
推荐指数
1
解决办法
1万
查看次数

Java计算器 - 调车场

我正在尝试使用简单的动作(+ - /*)来实现Dijkstra算法 Shunting-yard来读取数学方程式.它基本上得到一个"中缀"字符串,并将其转换为"后缀"字符串.

EG:输入 - > "(3+5)*4-12".输出:Queue[3,5,+,4, *,12,-]

从右到左阅读时,您会发现需要从4的乘法中减去12乘以3和5.

我做得对了.我认为将队列解释为计算的最简单方法是使用递归,所以我想出了以下代码:

public static Expression newCalc(ArrayDeque<String> q)//q is the output of Shunting yard algo
{
    String tmp =q.pollLast();
    if(tmp.equals("*") || tmp.equals("/") || tmp.equals("+") || tmp.equals("-")) {
        Expression rightOperation = newCalc(q);
        Expression leftOperation = newCalc(q);
        if(tmp.equals("+")) 
            return new Plus(leftOperation,rightOperation);
        else if(tmp.equals("-"))
            return new Minus(leftOperation,rightOperation);
        else if(tmp.equals("*"))
            return new Mul(leftOperation,rightOperation);
        else if(tmp.equals("/"))
            return new Div(leftOperation,rightOperation);
        else
            return new Number(0);
    }
    else 
        return new Number(Double.parseDouble(tmp));

}
Run Code Online (Sandbox Code Playgroud)

它适用于几乎所有字符串,除了以下字符串:

"(3+5)*4-12+1"
Run Code Online (Sandbox Code Playgroud)

在调车码后,队列输出为: [3,5,+,4, …

java algorithm recursion

10
推荐指数
1
解决办法
673
查看次数

选择值为NULL的列名

好的,4个小时的编码,只有6个小时的搜索......我并没有比开始时更好.这是我的问题.我有一个表(tmpShell),它有12列.它是一个没有约束的基本表 - 用于临时报告.当我们插入数据时,我必须提取一个ID号(PatientId)和所有列NAMES,其中该PatientId的值为null.

例:

PatientId    Fname    Lname      DOB 
123455       Sam      NULL       NULL
2345455      NULL     Doe        1/1/1980
09172349     John     Jone       NULL

我想要回归的是:

PatientId    ErrorMsg
123455       Lname,DOB
2345455      Fname
09172349     DOB

当然,如果所有列都有值,则errormsg将为null.

我已尝试并失败了大约300个不同的代码片段,但这似乎是我能得到的最接近的代码.不幸的是,这只返回每一列,而不是空值.

     ALTER PROC [sp_aaShowAllNullColumns]
      @tableName VARCHAR(255)
     AS
      BEGIN
            SET NOCOUNT ON;

DECLARE @sql NVARCHAR(4000); DECLARE @cols NVARCHAR(4000); DECLARE @tcols TABLE ( [colbit] NVARCHAR(255) ); --DECLARE @tablename VARCHAR(255) = 'tmpShell'; INSERT @tcols SELECT 'count(' + [columns].[name] + ') as ' + [columns].[name] + ', ' AS [colbit] FROM [sys].[columns] WHERE [columns].[object_id] = OBJECT_ID(@tableName); SELECT @cols = COALESCE(@cols, ', ', '') + …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server null

9
推荐指数
2
解决办法
3136
查看次数