【问题标题】:SQL Query Select from 1 table and return data based on 2 columnsSQL查询从1个表中选择并基于2列返回数据
【发布时间】:2019-08-17 11:22:22
【问题描述】:

我正在处理一个 SQL 查询,其中我将数据存储在表 r. 中基于 givereceive 的列,我需要将数据存储在临时表中,然后存储在新表中桌子。

本质上,数据是从 3 个表中提取的,最终目标是获取图像的二进制代码并存储在 .net 中显示

我现在正在尝试找出多选

所以givereceive in r等于Username in S,如果employee等于employee,则显示所有相关数据并获取图像

我已经尝试了大量的代码,我觉得OR 可以解决问题,但似乎没有。

感谢您提供的任何帮助。

SELECT  
    r.id, r.give, r.[receive], r.[type], r.[description], r.isApproved, 
    r.photoGive, r.photoReceive 
INTO
    #temp2 
FROM 
    Intranet.dbo.Recgonize r

SELECT s.Employee, s.Username 
INTO #temp3 
FROM Vision7.dbo.SEUser s

SELECT p.Photo, p.Employee 
INTO #temp4 
FROM Vision7.dbo.EMPhoto p

SELECT * 
FROM #temp2 AS a
INNER JOIN #temp3 b ON a.give = b.Username 
INNER JOIN #temp4 c ON b.Employee = c.Employee

DROP TABLE #temp2
DROP TABLE #temp3
DROP TABLE #temp4

【问题讨论】:

  • 这确实得到了“给予”的正确拉动。如果我为接收 = 用户名输入 OR,它不会产生任何新结果
  • 期望的结果在问题中。样本数据 - ibb.co/qjCyrcR
  • 基于列,我需要查询给予和接收与用户名相比,然后绑定到员工并从 3 个表中选择照片。

标签: sql sql-server temp


【解决方案1】:

您为什么要为此使用临时表?这些只会使代码更难调试和维护,运行成本更高,理解更复杂。

JOINs 可以在没有临时表的情况下工作。但是您确实需要额外的逻辑才能在不同的列中获取给定值和接收值,因此需要更多 JOINs:

SELECT r.id, r.give, r.[receive], r.[type], r.[description], 
       r.isApproved, r.photoGive, r.photoReceive,
       pg.Photo as give_photo, pg.Employee as give_employee,
       pr.Photo as receive_photo, pr.Employee as receive_employee
FROM Intranet.dbo.Recognize r LEFT JOIN
     Vision7.dbo.SEUser sg
     ON r.give = sg.Username LEFT JOIN
     Vision7.dbo.SEUser sr
     ON r.receive = sr.Username LEFT JOIN
     Vision7.dbo.EMPhoto pg
     ON sg.Employee = pg.Employee LEFT JOIN
     Vision7.dbo.EMPhoto pr
     ON sr.Employee = pr.Employee

【讨论】:

  • 临时表方法我认为选择所有然后比较数据以获得正确的选择是有意义的。我尝试执行上述操作,这就是结果。我正在寻找原因。 “消息 102,级别 15,状态 1,第 12 行 'Vision7' 附近的语法不正确。”
【解决方案2】:

尝试使用如下的单个脚本-

SELECT a.id, 
       a.give, 
       a.[receive], 
       a.[type], 
       a.[description], 
       a.isApproved, 
       a.photoGive, 
       a.photoReceive, 
       b.Employee, 
       b.Username, 
       c.Photo, 
       c.Employee
FROM Intranet.dbo.Recgonize A
     INNER JOIN Vision7.dbo.SEUser B ON a.give = b.Username
     INNER JOIN Vision7.dbo.EMPhoto C ON b.Employee = c.Employee;

【讨论】:

  • 谢谢 - 使用它,它仍然会拉回来,只是让结果更干净。
  • 如果我在 .net 端进行 2 次查询,一次用于给予,然后一次用于接收并将结果存储在临时表中,然后将其传递给实际的 sql 表,是否更有意义?
  • 使用临时表有什么好处?我很困惑。
  • 我认为将选择存储在其中以加入是有意义的,但这显然不是在看到一些 cmets 后最好的方法。你的方法非常好,几乎就是我要找的。如果它可以接收以及 SEUser 中的用户名链接,它将完成它。这就是为什么我在考虑 2 个电话。
  • 添加来自不同表的示例数据以及您的预期输出。这将有助于实现目标。
【解决方案3】:

您可能想尝试以下操作:

-- Include only required columns select rather than "*"

SELECT * 
FROM #temp2 AS a
INNER JOIN #temp3 b ON a.give = b.Username 
INNER JOIN #temp3 b2 ON a.receive = b2.Username 
INNER JOIN #temp4 c ON b.Employee = c.Employee
INNER JOIN #temp4 c2 ON b2.Employee = c2.Employee

-- Include only required columns in select rather than "*"

SELECT * 
FROM 
        (select r.id, r.give as UserName, r.[type], r.[description], r.isApproved, r.photoGive  from #temp2
         union
         select r.id, r.[receive], r.[type], r.[description], r.isApproved, r.photoReceive from #temp2
        ) AS a
INNER JOIN #temp3 b ON a.UserName = b.Username 
INNER JOIN #temp4 c ON b.Employee = c.Employee

如果临时表不用于应用程序的必要需求,相同的逻辑可以用于实际表,只需将#Temp2、#Temp3、#Temp4 替换为适当的表名。

【讨论】:

  • 谢谢,对于你的第一个场景,我仍然需要使用我正确的选择,然后基本上,它所做的是基于给予和接收创建 2 个不同的临时表?
  • 不,它只是加入一个临时表两次(1. for give,2. for receive)。如果您只是将临时表替换为实际表,它也会起作用。
  • 谢谢 - 照片栏是一张图片 - 不是我的设计,而是第 3 方应用程序。我得到“他的数据类型图像不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不可比较。”执行时。我会研究这个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多