Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有没有更好的查询方法?_Sql_Sql Server_Optimization - Fatal编程技术网

Sql 有没有更好的查询方法?

Sql 有没有更好的查询方法?,sql,sql-server,optimization,Sql,Sql Server,Optimization,这是我的sql,但我认为它太复杂了,也许它不是很快和有效?我说得对吗?还是有更好的办法 SELECT TEventInfoid ,A.TTNum, CASE WHEN TModelid = 3822 THEN ( SELECT title FROM dbo.sns_event WHERE id=TEventInfoid )

这是我的sql,但我认为它太复杂了,也许它不是很快和有效?我说得对吗?还是有更好的办法

SELECT  TEventInfoid ,A.TTNum,
    CASE WHEN TModelid = 3822 THEN ( SELECT title
                                     FROM   dbo.sns_event WHERE id=TEventInfoid
                                   )
         ELSE ( SELECT  name
                FROM    dbo.sns_exhibition WHERE id=TEventInfoid
              )
    END,
    CASE WHEN TModelid = 3822 THEN ( SELECT start_time
                                     FROM   dbo.sns_event WHERE id=TEventInfoid
                                   )
         ELSE ( SELECT  start_Time
                FROM    dbo.sns_exhibition WHERE id=TEventInfoid
              )
    END,
    CASE WHEN TModelid = 3822 THEN ( SELECT [address]
                                     FROM   dbo.sns_event WHERE id=TEventInfoid
                                   )
         ELSE ( SELECT  [address]
                FROM    dbo.sns_exhibition WHERE id=TEventInfoid
              )
    END
   FROM    
       T_Ticktets A
   WHERE A.TTNum='100229143644'
你可以用这个

   SELECT 
        TEventInfoid ,A.TTNum,
        CASE WHEN TModelid = 3822 THEN e.title ELSE x.name END,
        CASE WHEN TModelid = 3822 THEN e.start_time ELSE x.start_Time END,
        CASE WHEN TModelid = 3822 THEN e.[address] ELSE x.[address] END
    FROM    
       T_Ticktets A
       LEFT JOIN dbo.sns_event e ON e.id=A.TEventInfoid
       LEFT JOIN dbo.sns_exhibition x  WHERE x.id=A.TEventInfoid
     WHERE A.TTNum='100229143644'
你可以用这个

   SELECT 
        TEventInfoid ,A.TTNum,
        CASE WHEN TModelid = 3822 THEN e.title ELSE x.name END,
        CASE WHEN TModelid = 3822 THEN e.start_time ELSE x.start_Time END,
        CASE WHEN TModelid = 3822 THEN e.[address] ELSE x.[address] END
    FROM    
       T_Ticktets A
       LEFT JOIN dbo.sns_event e ON e.id=A.TEventInfoid
       LEFT JOIN dbo.sns_exhibition x  WHERE x.id=A.TEventInfoid
     WHERE A.TTNum='100229143644'
使用左连接:

注意:联接条件可能具有错误的表。不清楚哪个列在哪个表中

此外,如果TTNum被声明为大整数或数字,则可以在与之比较的值周围删除单引号

这个版本确实有一个假设。它假定给定id的另一个表中没有多行。如果是这样,调整查询就不太困难了

编辑:

解决最后一个问题的方法很简单:

SELECT t.TEventInfoid, t.TTNum,
        COALESCE(e.title, ex.name),
        COALESCE(e.start_time, ex.start_time),
        COALESCE(e.address, ex.address)
FROM T_Ticktets t LEFT JOIN
     dbo.sns_event e
     ON e.id = t.TEventInfoid AND t.TModelid = 3822 LEFT JOIN  -- unclear which table which is in
     dbo.sns_exhibition ex
     ON ex.id = t.TEventInfoid AND t.TModelid <> 3822          -- unclear which table which is in
WHERE t.TTNum = '100229143644';
这可能是查询的最佳形式。注意:如果TModelid可以为NULL,则必须在第二个ON条件中考虑这一点。

使用左连接:

注意:联接条件可能具有错误的表。不清楚哪个列在哪个表中

此外,如果TTNum被声明为大整数或数字,则可以在与之比较的值周围删除单引号

这个版本确实有一个假设。它假定给定id的另一个表中没有多行。如果是这样,调整查询就不太困难了

编辑:

解决最后一个问题的方法很简单:

SELECT t.TEventInfoid, t.TTNum,
        COALESCE(e.title, ex.name),
        COALESCE(e.start_time, ex.start_time),
        COALESCE(e.address, ex.address)
FROM T_Ticktets t LEFT JOIN
     dbo.sns_event e
     ON e.id = t.TEventInfoid AND t.TModelid = 3822 LEFT JOIN  -- unclear which table which is in
     dbo.sns_exhibition ex
     ON ex.id = t.TEventInfoid AND t.TModelid <> 3822          -- unclear which table which is in
WHERE t.TTNum = '100229143644';

这可能是查询的最佳形式。注意:如果TModelid可以为NULL,您必须在第二个ON条件中考虑到这一点。

您如何对自己说?我想要门票型号id为3822的所有活动,以及不是3822的所有展品

SELECT A.TEventInfoid,
A.TTNum,
e.Title,
e.start_time,
e.[address],
A.TModelid
FROM T_Ticktets A 
JOIN dbo.sns_event e
ON A.id = e.TEventInfoid
WHERE A.TTNum='100229143644'
AND A.TModelid = 3822

UNION ALL

SELECT A.TEventInfoid,
A.TTNum,
e.Name   
e.start_time,
e.[address],
A.TModelid
FROM T_Ticktets A 
JOIN dbo.sns_exhibition e
ON e.id = A.TEventInfoid
WHERE A.TTNum='100229143644'
AND A.TModelid <> 3822

你会怎么对自己说?我想要门票型号id为3822的所有活动,以及不是3822的所有展品

SELECT A.TEventInfoid,
A.TTNum,
e.Title,
e.start_time,
e.[address],
A.TModelid
FROM T_Ticktets A 
JOIN dbo.sns_event e
ON A.id = e.TEventInfoid
WHERE A.TTNum='100229143644'
AND A.TModelid = 3822

UNION ALL

SELECT A.TEventInfoid,
A.TTNum,
e.Name   
e.start_time,
e.[address],
A.TModelid
FROM T_Ticktets A 
JOIN dbo.sns_exhibition e
ON e.id = A.TEventInfoid
WHERE A.TTNum='100229143644'
AND A.TModelid <> 3822

3Q,我认为它更舒适3Q,我认为它更舒适TModelid不会永远为空。@jasonLam。我不确定你的评论指的是什么。我只是说最后一个查询中的第二个条件是ex.id=t.TEventInfoid和t.TModelid 3822或t.TModelid为NULL。TModelid不会永远为NULL。@jasonLam。我不确定你的评论指的是什么。我只是说最后一个查询中的第二个条件是ex.id=t.TEventInfoid和t.TModelid 3822或t.TModelid为NULL。好的,我使用MSSQL,我使用MSSQL