Sql 有没有更好的查询方法?
这是我的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 )
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