在Hibernate中为MS SQL转换对比较sql

时间:2009-12-17 16:20:15

标签: sql sql-server hibernate

我们使用hibernate来处理不同的数据库。 当数据源是MS SQL时,使用对比较sql存在问题。 我们想知道如何为ms sql转换此语句。

以下是简化的sql。

通知:

  1. column1和column2都是uuid和numeric类型。 (在ms sql中将是数字(19,0)
  2. 转换后的sql语句应该遵循表格 - WHERE条件IN子查询
  3. 新陈述应考虑执行绩效。
  4. 代码:

    select * from table1 t1
    where  (t1.column1, t1.column2) in 
                select ( sub.column1, sub.column2) from table2 sub
                where sub.column3 = $var 
    

    以下是我的试用版 我担心它在字符串比较中的低性能并且使索引无效。

    SELECT *
    FROM TABLE_1 T1
    WHERE CAST(COL1 AS VARCHAR(19))+CAST(COL2 AS VARCHAR(19))
    IN (SELECT CAST(COL1 AS VARCHAR(19))+CAST(COL2 AS VARCHAR(19))
        FROM TABLE_2 T2
        WHERE T2.COL3 = 'A')
    

    对我们有什么建议吗? 非常感谢!!

2 个答案:

答案 0 :(得分:2)

为什么你必须做一个Where-In子句而不是一个连接?

select 
    t1.* 
from 
    table1 t1
    inner join table2 sub on
        t1.column1 = sub.column1 
        and t1.column2 = sub.column2
        and sub.column3 = $var

答案 1 :(得分:0)

假设表格如下:

CREATE TABLE SuperHeroes
(
    name varchar(100),
    franchise varchar(100)

);

目前的数据是

'Batman', 'DC'
'SpiderMan', 'Marvel'
'Superman', 'DC'
'Wolverine', 'Marvel'

您想查询

SELECT name, franchise 
FROM SuperHeroes
WHERE 
(name, franchise) 
IN 
( 
'Superman', 'DC',
'Wolverine', 'Marvel'
)

但那不会执行。因为它是语法错误。正确的语法是

SELECT name, franchise 
FROM SuperHeroes h
WHERE 
NOT EXISTS
(
    (SELECT h.name, h.franchise) 
    EXCEPT
    ( 
    SELECT 'Superman', 'DC'
    UNION

    SELECT 'Wolverine', 'Marvel'
    )
)

希望它会奏效。